殷錫亮
(哈爾濱僑航通信設備有限公司,哈爾濱 150028)
現(xiàn)代嵌入式處理器上越來越多的使用Linux操作系統(tǒng)。這不僅由于Linux是免費開源的,并有眾多的軟件開發(fā)者共同開發(fā),它也具有實時性等特點,來滿足嵌入式系統(tǒng)開發(fā)所需的特性。雖然Linux本身就提供很好的內存使用機制,但是由于通信軟件對內存使用有其特殊的方式,長期的直接運行于Linux之上會造成很多的內存碎片,造成無法申請到內存。
本文基于Linux操作系統(tǒng)設計了一種虛擬軟件平臺,并著重介紹這個虛擬平臺提供的內存管理機制。
Linux是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統(tǒng)。它能運行主要的UNIX工具軟件、應用程序和網絡協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩(wěn)定的多用戶網絡操作系統(tǒng)。
由于Linux具有的眾多特性,通信設備中越來越多地采用Linux,代替費用昂貴的Vx Works操作系統(tǒng)。盡管會降低一定程度的實時性,但由于實時業(yè)務的逐年下降,取而代之的是非實時的數(shù)據(jù)業(yè)務,系統(tǒng)對于實時性的依賴程度逐漸降低,這也為使用linux提供了可行性。
通信軟件架構一般采用如下圖的軟件架構模式。
圖1
虛擬軟件平臺位于操作系統(tǒng)與上層軟件之間,屏蔽了操作系統(tǒng)的特性,由于其特殊的作用,所以它必須提供諸如TCP/IP通信,進程間通信,進程調度,內存管理,定時器管理,狀態(tài)機等諸多功能,而最為重要的就是內存管理。
系統(tǒng)內存分為堆內存以及棧內存,對于小于2048字節(jié)的內存,一般使用的是棧內存,這種大小的數(shù)據(jù)區(qū)一般用來傳輸信令數(shù)據(jù),對于傳輸更大的數(shù)據(jù)塊,需要申請的是堆內存。
根據(jù)分析通信系統(tǒng)軟件架構,大概需要幾種消息類型,它們使用的數(shù)據(jù)長度大約為128字節(jié),256字節(jié),512字節(jié),1024字節(jié),2 048 字節(jié),4 096字節(jié),8 192字節(jié),16 384字節(jié)等。(如圖2所示)
圖2
在內存池的構建上,我們也根據(jù)需求,分別向操作系統(tǒng)申請堆內存以及棧內存。其中小于以及等于2 048字節(jié)的,申請棧內存,即靜態(tài)數(shù)據(jù)區(qū)內存;對于大于2 048字節(jié)的,申請堆內存,即動態(tài)內存區(qū)內存。但是動態(tài)內存在內存池初始化后對于操作系統(tǒng)來說,它也變成了靜態(tài)的內存,因為所有的內存申請操作以及回收操作,都是這一片在初始化即申請到的系統(tǒng)內存上面進行。
根據(jù)業(yè)務模塊調用傳進的數(shù)據(jù)長度參數(shù),判斷數(shù)據(jù)長度是屬于哪一個數(shù)據(jù)區(qū)間,如果小于64字節(jié),即使用64字節(jié)內存池,如果數(shù)據(jù)長度在64與128之間,則使用128字節(jié)內存池,以此類推。
申請到內存池的內存塊后,內存管理模塊,自動把它從就緒隊列移到運行隊列尾,并根據(jù)系統(tǒng)時間戳,申請串號(內存池行號以及列號),申請內存進程ID,對內存塊標注(形成一個唯一的標識),直到內存申請進程釋放這片內存,內存管理模塊根據(jù)申請串號在運行隊列找到這片內存,并把它內容清空,放回到就緒隊列尾。
如果使用內存管理模塊的應用進程為多線程處理,就必須在申請內存的操作以及釋放內存的操作加入互斥機制,比如線程鎖,或者信號的PV操作,等等,用來保護內存管理機制,使其能夠串行地對內存池進行操作。
抑或為了增加系統(tǒng)的并發(fā)性處理機制,可以在初始化的時候明確應用進程使用幾個線程,為每個線程獨立配備一個內存池,這樣不會出現(xiàn)競爭機制,加快了系統(tǒng)的運行速度。
筆者推薦后一種方法,因為通信軟件的系統(tǒng)特性,這種處理方法更有利于系統(tǒng)穩(wěn)定的運行。
內存作為一個系統(tǒng)軟件運行依賴最為重要的資源,需要統(tǒng)一地進行分配管理,不能由上層的業(yè)務模塊自行調用系統(tǒng)A P I,去直接操作系統(tǒng)內存,這樣會造成內存碎片的產生,降低系統(tǒng)的可靠性。
[1] (美)博韋.深入理解 LINUX內核[M].陳莉群,馮銳,牛欣源,譯.中國電力出版社,2008.
[2] [美]洛夫.Linux系統(tǒng)編程[M].東南大學出版社,2009.
[3] Dharma Prakash AgrawalQing-An Zeng.無線與移動通信系統(tǒng)[M].徐春秀,武穆清,譯.人民郵電出版社,2005.
[4] (美)W.Richard Stevens Stephen A.Rago.UNIX環(huán)境高級編程[M].尤晉元,張亞英,戚正偉,譯.人民郵電出版社,2008.
[5] 嚴蔚敏,吳偉民.數(shù)據(jù)結構(C語言)[M].清華大學出版社,2007.