我對lwip內(nèi)存管理的改進(jìn) lwip是一個十分優(yōu)秀的tcp協(xié)議棧,擁有完整的流控算法,而且從網(wǎng)卡到應(yīng)用程序,數(shù)據(jù)只經(jīng)過了2次拷貝,網(wǎng)卡-》ip內(nèi)存->應(yīng)用程序,速度相當(dāng)快
但lwip的內(nèi)存管理卻必須由用戶在移植的時候仔細(xì)考慮,這也正是lwip之所以需要比較大內(nèi)存的原因,對lwip內(nèi)存管理進(jìn)行改進(jìn)可以去處碎片問題和內(nèi)存塊數(shù)目數(shù)量的估算,
網(wǎng)絡(luò)通信中只傳遞2種數(shù)據(jù),發(fā)送數(shù)據(jù)和接收數(shù)據(jù),lwip采用pbuf鏈表的方式,所以發(fā)送包要遠(yuǎn)遠(yuǎn)小于接受包的大小,我們首先統(tǒng)一接受包的大小為以太網(wǎng)最大包,同時采用接受包兼容發(fā)送包的格式,包的頭部信息相同,同時發(fā)送包下一個包的頭部信息在內(nèi)存空間上被緊貼在第一個包信息+數(shù)據(jù)之后,這樣一個接受包大致等于18個發(fā)送包的大小,當(dāng)分配一個接受包時,就分配一個統(tǒng)一大小的接受包,當(dāng)分配一個發(fā)送包的時候,就將一個接受包分割成18個發(fā)送包,分配其中一個,其余的放入空閑鏈表下次分配,回收的時候當(dāng)18個發(fā)送包都被釋放,那么在合成一個空閑的接受包
lwip同時還要維護(hù)等待鏈表,未應(yīng)答鏈表,定時器鏈表,這些都是分配對應(yīng)的內(nèi)存塊,我們在包的信息上添加struct ×pnext的一個域,插入,移出鏈表的時候之間用該域來操作,這樣就不需要分配不同數(shù)目的內(nèi)存塊了
通過以上改進(jìn),lwip的效率進(jìn)一步提高,解決了碎片問題,省去了內(nèi)存查找的時間,也不需要在考慮不同內(nèi)存塊的需求數(shù)目,而rom和ram的需求進(jìn)一步縮小,改進(jìn)后的內(nèi)存分配代碼在ads上編譯只需要400字節(jié)(無os)
* - 本貼最后修改時間:2006-10-11 17:52:28 修改者:eleven11 |