Üst düzey uygulamalarda RAM kullanımını yönetmek için en iyi yöntemler
Azure Sphere işletim sistemi linux çekirdeğini temel olarak kullansa da, önemli RAM kısıtlamaları olan ekli bir cihaz için uygulama yazmaya devam ettiğinizi unutmayın. İyi tümleşik programlama uygulamaları uygulamak, güvenilir Azure Sphere uygulamaları oluşturmanıza yardımcı olur.
Önemli
Uygulamanız için doğru RAM kullanım bilgilerini almak için uygulamanızı hata ayıklamadan çalıştırmanız önemlidir. Hata ayıklama sunucusu tarafından tüketilen RAM bildirilen RAM kullanım istatistiklerine dahil edildiğinden uygulamanızı hata ayıklayıcının altında çalıştırmak, ram kullanımının şişirilmesine neden olur. Ekli cihazda çalışan uygulamanın bellek istatistikleri hakkında daha fazla bilgi için bkz. Üst düzey uygulamalarda bellek kullanımı.
İzleyebileceğiniz en iyi uygulamalardan bazıları şunlardır:
- Belleği önceden (ideal olarak statik olarak) ayırın ve mümkün olduğunda uygulamanızın ömrü için ayrılmış olarak bırakın. Bu, uygulamanızın RAM kullanımının belirleyiciliğini büyük ölçüde artırır ve uygulamanızın ömrü boyunca bellek ayak izi artışları ve parçalanma riskini azaltır.
- Dinamik ayırma kesinlikle gerekli olduğunda:
- Öbek ayırma/bellek havuzu tekniklerinden yararlanarak yığın belleği parçalanma risklerini azaltmak için uygulama tarafından gerçekleştirilen yığın bellek ayırmalarının ve serbest bırakma işlemlerinin sıklığını en aza indirmeyi deneyin.
- Yığın sayfalarını gözden geçirin ve mümkün olduğunda, sayfaları işlemeye
malloc()
zorlamak içinmemset()
çağrıları ile sarmala. Bu, bir ayırma uygulamanızın RAM sınırını aşmasına neden olursa işletim sisteminin bunu hemen ve tahmin edilebilir bir şekilde sonlandırmasını sağlamaya yardımcı olur. Ayrılan sayfalara erişmek beklenirse gecikmeli yetersiz bellek kilitlenmesi riski ortaya çıkar ve bu da yeniden oluşturmak ve tanılamak için daha zordur. - Geliştirme modundayken yığın bellek ayırma izlemeyi etkinleştirin.
- Geliştirme modunda değilken büyük dizelerle kullanmaktan
Log_Debug
kaçının ve bu çağrıları kaldırın (örneğin, bir#ifdef
ile).Log_Debug
geçici arabelleklerin ayrılmasına neden olur ve büyük dizelerle kullanıldığında RAM kullanımında ani artışlara neden olur. - İş parçacıkları oluşturmak yerine düzenli aralıklarla zaman uyumsuz görevler (çevre birimleriyle etkileşim kurma gibi) için mümkün olduğunda EventLoop API'sini kullanın. İş parçacıkları oluşturmak, Linux çekirdeğinin uygulamanıza öznitelikli ek bellek ayırmasına neden olur. Bu, işletim sistemi zamanlayıcısının uygulamanızın RAM sınırını aşmasına neden olabilecek birden çok farklı işlem arasında geçiş yapma olasılığını artırdığı için uygulamanızın determinizmini azaltır. GPIO_HighLevelApp gibi Azure Sphere Örnek uygulamalarının çoğu EventLoop'un nasıl kullanılacağını gösterir.
- Çalışma zamanında yeniden hesaplanabilir değerler için bellek önbelleklerinin erken kullanımından kaçının.
- Libcurl kullanırken:
Libcurl kullanırken en yüksek yuva arabellek boyutlarını ayarlayın. Azure Sphere işletim sistemi, uygulamanızın RAM kullanımıyla ilişkilendirilen yuva arabellekleri ayırır. Bu arabellek boyutlarını azaltmak, uygulamanızın RAM ayak izini azaltmanın iyi bir yolu olabilir. Yuva arabelleklerinin çok küçük olması libcurl performansını olumsuz yönde etkiler. Bunun yerine, senaryonuz için en yüksek arabellek boyutlarını ayarlayın:
static int sockopt_callback(void* clientp, curl_socket_t curlfd, curlsocktype purpose) { int size = /*specify max buffer sizes here (in bytes)*/ int size_size = sizeof(size); setsockopt(curlfd, SOL_SOCKET, SO_SNDBUF, &size, &size_size); setsockopt(curlfd, SOL_SOCKET, SO_RCVBUF, &size, &size_size); return CURL_SOCKOPT_OK; } // Place the following along with other calls to curl_easy_setopt curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, &sockopt_callback);
CURLOPT_SOCKOPTFUNCTION libcurl belgelerine bakın.
Üst düzey CURLOPT_BUFFERSIZE ve CURLOPT_UPLOAD_BUFFERSIZE parametreleri benzer şekilde ayarlanabilir.
Libcurl ayrıca , ,
free
,strdup
realloc
calloc
ve içinmalloc
geri çağırma işlevlerini kullanarakcurl_global_init_mem
ve geçirerek iç bellek işlevlerini geçersiz kılmayı da destekler. Bu işlev, dinamik ayırmaları izlemenize ve hatta davranışı değiştirmenize olanak tanır. Örneğin, önceden bir bellek havuzu ayırabilir ve ardından bu geri çağırmaları kullanarak bu havuzdan libcurl belleği ayırabilirsiniz. Bu, korumaları ayarlamak ve uygulamanızın determinizmini artırmak için etkili bir teknik olabilir. Bu geri çağırmaları kullanma hakkında daha fazla bilgi için curl_global_init_mem libcurl belgelerine bakın.Not
Bu geri çağırma mekanizması, libcurl'un neden olduğu tüm bellek ayırmalarını kapsamaz, yalnızca doğrudan libcurl tarafından yapılanları kapsar. Özellikle, altında wolfSSL tarafından yapılan ayırmalar izlenmez.