" />

亚洲先锋影音人AV成_免费A级毛片一分钟_人人爽人人爽人人插_日韩少妇极品熟妇人妻潮喷

沃卡惠移動(dòng)端logo

為什么內(nèi)存分配彈性對(duì)物聯(lián)網(wǎng)至關(guān)重要

2022-12-14 09:12:444636

這是非常不同的,但是,當(dāng)談到物聯(lián)網(wǎng)。在這些嵌入式連接設(shè)備中,內(nèi)存是一種有限的資源,多個(gè)程序會(huì)爭奪它們可以消耗多少內(nèi)存。系統(tǒng)更小,內(nèi)存也更小。因此,它最好被視為一種有限的資源,保守地使用。

正是在這種背景下,內(nèi)存分配(也稱為malloc)在我們的領(lǐng)域中變得非常重要。Malloc是在執(zhí)行程序或進(jìn)程時(shí)保留一部分計(jì)算機(jī)內(nèi)存的過程。把事情做好,尤其是對(duì)于連接到互聯(lián)網(wǎng)的設(shè)備而言,可以決定性能的好壞。

因此,讓我們來看看開發(fā)人員如何將彈性構(gòu)建到他們的malloc方法中,以及這對(duì)未來的連接設(shè)備性能意味著什么。

Malloc和連接設(shè)備:簡史

讓我們從頭開始。傳統(tǒng)上,malloc在嵌入式系統(tǒng)中不常使用。這是因?yàn)榕f設(shè)備通常不連接互聯(lián)網(wǎng),因此對(duì)內(nèi)存的需求差異很大。

然而,這些較舊的設(shè)備在系統(tǒng)啟動(dòng)時(shí)創(chuàng)建了一個(gè)資源池來分配資源。資源可以是一個(gè)連接,系統(tǒng)可以被配置為允許來自靜態(tài)分配池的n個(gè)連接。

在一個(gè)非互聯(lián)網(wǎng)連接的系統(tǒng)中,系統(tǒng)的狀態(tài)通常受到一定的限制,因此內(nèi)存分配的上限更容易估計(jì)。但是,一旦嵌入式系統(tǒng)連接到互聯(lián)網(wǎng),這種情況就會(huì)徹底改變。

例如,一個(gè)設(shè)備可以計(jì)算多個(gè)連接,并且每個(gè)連接可以根據(jù)其用途而有不同的內(nèi)存需求。這里,連接上的數(shù)據(jù)流所需的緩沖存儲(chǔ)器取決于連接的等待時(shí)間,以使用針對(duì)分組丟失或其他網(wǎng)絡(luò)相關(guān)行為的某種概率函數(shù)來獲得特定吞吐量。

這在現(xiàn)代高端系統(tǒng)上通常不是問題。但是,請(qǐng)記住,開發(fā)人員在嵌入式環(huán)境中面臨著有限的內(nèi)存資源。所以,你不能簡單地假設(shè)有足夠的內(nèi)存。

這就是為什么在物聯(lián)網(wǎng)嵌入式開發(fā)中,考慮如何創(chuàng)建對(duì)內(nèi)存分配錯(cuò)誤(也稱為malloc失敗)具有彈性的軟件非常重要。

現(xiàn)代嵌入式連接系統(tǒng)和Malloc

在…里現(xiàn)代互聯(lián)嵌入式系統(tǒng),malloc被更頻繁地使用,許多嵌入式系統(tǒng)和平臺(tái)都有不錯(cuò)的malloc實(shí)現(xiàn)。這種轉(zhuǎn)變的原因是現(xiàn)代連接的嵌入式系統(tǒng)執(zhí)行更多的任務(wù),并且為程序的所有可能的執(zhí)行靜態(tài)地分配最大的所需資源通常是不可行的。

這種在現(xiàn)代互聯(lián)嵌入式系統(tǒng)中積極使用malloc的轉(zhuǎn)變需要更徹底、更系統(tǒng)的軟件測試來發(fā)現(xiàn)錯(cuò)誤。

通常,分配錯(cuò)誤不會(huì)被系統(tǒng)地測試,因?yàn)樗?jīng)常被認(rèn)為是以如此小的概率發(fā)生的事情,以至于不值得努力。由于分配錯(cuò)誤非常罕見,任何bug在被發(fā)現(xiàn)之前都可以存活數(shù)年。

Mallocfail:如何測試錯(cuò)誤

好消息是開發(fā)人員可以利用軟件來測試分配錯(cuò)誤。一種新穎的方法是運(yùn)行一個(gè)程序,并在發(fā)生分配的所有唯一執(zhí)行路徑中注入分配錯(cuò)誤。這可以通過工具來實(shí)現(xiàn)mallocfail.

顧名思義,Mallocfail有助于以確定的方式測試malloc故障。該工具不是隨機(jī)測試,而是自動(dòng)枚舉malloc故障的不同控制路徑。它的靈感來自于此堆棧溢出答案.

簡而言之,這個(gè)工具用定制版本覆蓋了malloc、calloc和realloc。每次自定義分配器運(yùn)行時(shí),該函數(shù)使用libbacktrace生成當(dāng)前調(diào)用堆棧的文本表示,然后生成該文本的sha256散列。

然后,該工具檢查是否已經(jīng)看到了新的散列。如果從未見過,則內(nèi)存分配失敗。哈希存儲(chǔ)在內(nèi)存中,并寫入磁盤。如果這個(gè)散列——特定的調(diào)用棧——以前已經(jīng)出現(xiàn)過,那么正常的libc版本的分配器將被正常調(diào)用。每次程序啟動(dòng)時(shí),已經(jīng)看到的哈希值都會(huì)從磁盤加載進(jìn)來。

這是我第一次使用的東西,發(fā)現(xiàn)非常有用。例如,在我的公司,我們?cè)谖覀兊那度胧絜dge軟件開發(fā)套件。我很高興地報(bào)告,該工具實(shí)際上成功地識(shí)別了SDK及其第三方庫中的一些問題。因此,前一個(gè)問題現(xiàn)已修復(fù),后一個(gè)問題已得到修補(bǔ)。

處理Malloc失敗

在復(fù)雜的系統(tǒng)中,處理分配錯(cuò)誤可能有點(diǎn)棘手。例如,考慮需要分配數(shù)據(jù)來處理一個(gè)事件。存在不同的模式來解決這個(gè)問題。最重要的是分配必要的內(nèi)存,以便在分配失敗的情況下可以將錯(cuò)誤傳遞回程序,并且某些代碼路徑不會(huì)無聲無息地失敗。

處理malloc失敗的能力是我的團(tuán)隊(duì)經(jīng)常考慮的事情。當(dāng)然,這在其他設(shè)備上不是什么大問題,但在連接到互聯(lián)網(wǎng)的嵌入式設(shè)備上可能會(huì)造成大問題。

出于這個(gè)原因,我們的SDK計(jì)算功能來限制某些資源,包括連接、流、流緩沖區(qū)等等。這使得系統(tǒng)可以被配置為限制所使用的內(nèi)存量,從而不太可能發(fā)生malloc錯(cuò)誤(并且這只是一個(gè)資源分配錯(cuò)誤)。

通常,系統(tǒng)內(nèi)存不足會(huì)導(dǎo)致系統(tǒng)運(yùn)行困難。所以降低分配錯(cuò)誤的概率是很有意義的。這通常通過限制哪些功能/任務(wù)可以同時(shí)發(fā)生來處理。

作為一個(gè)在這個(gè)領(lǐng)域工作了20年的人,我相信當(dāng)涉及到現(xiàn)代嵌入式連接設(shè)備時(shí),開發(fā)人員應(yīng)該采用最佳malloc實(shí)踐。