• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      一種高效RTAI 共享內(nèi)存管理層的研究與實(shí)現(xiàn)*

      2013-12-23 04:47:02陶耀東鄭一麟
      關(guān)鍵詞:共享內(nèi)存鏈表空閑

      王 煜,林 滸,陶耀東,鄭一麟

      (1.中國科學(xué)院 研究生院,北京 100049;2.中國科學(xué)院 沈陽計(jì)算技術(shù)研究所,沈陽 110168)

      0 引言

      隨著數(shù)控加工精度不斷提高,對數(shù)控系統(tǒng)軟件的可靠性要求不斷加強(qiáng),這就要求必須對數(shù)控系統(tǒng)內(nèi)部執(zhí)行情況的實(shí)時(shí)監(jiān)測,將數(shù)控系統(tǒng)內(nèi)部的各種信息發(fā)送給界面實(shí)時(shí)顯示,對發(fā)現(xiàn)錯(cuò)誤做出及時(shí)響應(yīng)。

      數(shù)控系統(tǒng)一般主要包含四個(gè)主要模塊,人機(jī)接口(HMI)、運(yùn)動模塊(MOTION)、可編程邏輯模塊(PLC)和任務(wù)模塊(TASK)。HMI 運(yùn)行在用戶空間,而其他模塊運(yùn)行在內(nèi)核空間,這些模塊之間利用共享內(nèi)存?zhèn)鬏斝枰拿?、狀態(tài)和錯(cuò)誤信息。

      本文通過對RTAI 提供的共享內(nèi)存機(jī)制研究,設(shè)計(jì)并實(shí)現(xiàn)一種高效的共享內(nèi)存管理機(jī)制,減少系統(tǒng)內(nèi)核調(diào)用次數(shù),提高了RTAI 的共享內(nèi)存分配和釋放速率,將其應(yīng)用于現(xiàn)有的數(shù)控系統(tǒng),實(shí)現(xiàn)了數(shù)控系統(tǒng)的高可靠性。

      1 RTAI 共享內(nèi)存的實(shí)現(xiàn)機(jī)制

      RTAI 是Linux 操作系統(tǒng)的一種實(shí)時(shí)擴(kuò)展,它通過設(shè)置保留一塊物理內(nèi)存,并將其映射到使用的進(jìn)程地址空間,用來提供共享內(nèi)存機(jī)制可用于內(nèi)核和用戶空間的通信,維護(hù)了內(nèi)核和用戶所申請內(nèi)存的空間映射。在RTAI 中,rtai_kmalloc 是從內(nèi)核空間分配共享內(nèi)存的接口函數(shù),rtai_malloc 是從用戶空間分配共享內(nèi)存的接口函數(shù)。rtai_kmalloc 從內(nèi)核申請小于KMALLOC_LIMIT(128K)的空間使用系統(tǒng)內(nèi)核函數(shù)kmalloc 分配共享內(nèi)存空間,大于KMALLOC_LIMIT 使用內(nèi)核系統(tǒng)函數(shù)__get_free_pages 分配空間。rtai_malloc 從用戶空間申請時(shí),直接使用系統(tǒng)函數(shù)vmalloc 分配。無論從內(nèi)核或者是用戶分配完,都要設(shè)置頁面保留位,標(biāo)識出該頁不被置換出。對于已經(jīng)被分配的,則函數(shù)查找維護(hù)的全局變量,將共享內(nèi)存地址返回[1]。

      共享內(nèi)存機(jī)制也存在不足,其自身不能實(shí)現(xiàn)多進(jìn)程的讀寫同步,需要應(yīng)用程序自己解決復(fù)雜的同步互斥問題[2]。同時(shí),每次新申請內(nèi)存空間都要通過系統(tǒng)調(diào)用,這樣所需要的頁表分配的開銷比較大,同時(shí)增加了系統(tǒng)的負(fù)擔(dān)。

      為解決同步互斥和多次系統(tǒng)調(diào)用的問題,本文研究并實(shí)現(xiàn)一個(gè)共享內(nèi)存管理層,完成對共享內(nèi)存的高效管理。

      2 共享內(nèi)存管理層設(shè)計(jì)

      該層的設(shè)計(jì)就是實(shí)現(xiàn)一個(gè)共享內(nèi)存的管理器,用戶不再使用由RTAI 提供的共享內(nèi)存接口函數(shù),而使用由該層實(shí)現(xiàn)的接口函數(shù)。主要包含數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),共享內(nèi)存的分配算法設(shè)計(jì)和釋放算法設(shè)計(jì)。

      2.1 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

      依據(jù)共享內(nèi)存塊的相關(guān)屬性,從以下五個(gè)方面的數(shù)據(jù)特性考慮數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì):

      (1)共享內(nèi)存塊的性質(zhì),模塊主要有兩種,內(nèi)核模塊或者是用戶模塊,申請共享內(nèi)存空間的模塊選擇涉及到實(shí)際分配所使用的RTAI 函數(shù)。

      (2)共享內(nèi)存塊的并發(fā)訪問,不同的模塊對一塊數(shù)據(jù)的并發(fā)訪問,保證各個(gè)部分對同一個(gè)數(shù)據(jù)的一致性訪問??刹捎没コ饬?,來保證同一時(shí)間只有一個(gè)進(jìn)程來訪問一個(gè)關(guān)鍵區(qū)域,防止產(chǎn)生臟數(shù)據(jù)。若對訪問的數(shù)據(jù)不是嚴(yán)格要求,可以使訪問的進(jìn)程獲取上次產(chǎn)生的舊數(shù)據(jù),不必忙等,減少系統(tǒng)的負(fù)擔(dān),增加系統(tǒng)的吞吐率。

      (3)共享內(nèi)存塊的分配和訪問效率。確定共享內(nèi)存分配的大小,以及維護(hù)內(nèi)存塊的個(gè)數(shù),不使用某一塊,將占用計(jì)數(shù)減一,為零時(shí)并不立即釋放,只是標(biāo)明未使用,再次申請使用只用占用計(jì)數(shù)加一,就可繼續(xù)使用,減少系統(tǒng)函數(shù)的反復(fù)調(diào)用,增加整個(gè)系統(tǒng)的穩(wěn)定性。在此基礎(chǔ)上,增加共享內(nèi)存池的概念,它是已經(jīng)由底層分配函數(shù)分配成功的大塊的共享內(nèi)存,當(dāng)上層若要申請的共享內(nèi)存大小小于該內(nèi)存池的大小,則直接從中分配空間給用戶。同時(shí)也要維護(hù)共享內(nèi)存塊的鏈表,在釋放的時(shí)候能將合適的塊合并。

      (4)統(tǒng)計(jì)數(shù)據(jù)。利于系統(tǒng)對數(shù)據(jù)的統(tǒng)計(jì)分析,以便于對當(dāng)前系統(tǒng)的性能分析和問題排查。同時(shí)也是最終是否能夠釋放共享內(nèi)存的標(biāo)志。

      (5)共享內(nèi)存塊標(biāo)識。唯一的確定一塊內(nèi)存,在內(nèi)核空間和用戶空間維護(hù)共享內(nèi)存塊地址與使用者之間的映射。

      2.2 數(shù)據(jù)結(jié)構(gòu)

      主要使用共享內(nèi)存池和共享內(nèi)存塊這兩種結(jié)構(gòu)來實(shí)現(xiàn)管理層的設(shè)計(jì)。

      共享內(nèi)存池:由共享內(nèi)存層利用系統(tǒng)分配函數(shù)分配的大塊共享內(nèi)存,使用雙向循環(huán)鏈表連接,由共享內(nèi)存層負(fù)責(zé)地址映射。若存在的內(nèi)存池空間不能滿足需要,內(nèi)存池可再利用底層系統(tǒng)函數(shù)進(jìn)行分配;共享內(nèi)存池的可用空間大小是指被申請使用的共享內(nèi)存塊使用余下的可被再分配的空間,同時(shí)考慮到邊界對齊;使用互斥量來保證對內(nèi)存的并發(fā)訪問。

      共享內(nèi)存塊:在已存在的內(nèi)存池里分配的用戶申請的內(nèi)存空間,采用雙向循環(huán)鏈表連接,存在空閑鏈表,是被用戶釋放的,但并沒有被共享管理層實(shí)際釋放,只是置位該塊可以繼續(xù)使用,同時(shí)要考慮相鄰空閑塊的合并,和非空閑的共享內(nèi)存塊鏈表。

      為了保證共享內(nèi)存塊的分配效率,共享內(nèi)存管理層要維護(hù)一定數(shù)量的空閑內(nèi)存池,使得系統(tǒng)免于重復(fù)的內(nèi)存分配和釋放,該數(shù)量的設(shè)置要考慮到系統(tǒng)的負(fù)載,可由實(shí)際系統(tǒng)需要設(shè)置。

      整個(gè)數(shù)據(jù)模型如圖1 所示。

      圖1 共享內(nèi)存管理層數(shù)據(jù)結(jié)構(gòu)模型

      2.3 分配算法設(shè)計(jì)

      2.3.1 共享內(nèi)存池分配算法

      共享內(nèi)存空間的實(shí)際分配,在內(nèi)核空間利用底層共享內(nèi)存接口函數(shù)rtai_kmalloc 分配共享內(nèi)存,在用戶空間使用rtai_malloc。

      2.3.2 共享內(nèi)存塊分配算法

      首先,在共享內(nèi)存標(biāo)識符表中,查找是否已經(jīng)分配了申請字符串名的共享內(nèi)存,若已經(jīng)分配,修改相應(yīng)計(jì)數(shù)并返回地址;否則,采用首次適配算法,首先在第一個(gè)共享內(nèi)存池的空閑鏈表中,查看是否有符合要求的內(nèi)存塊,若有直接將占用計(jì)數(shù)加一,同時(shí)加入到非空閑鏈表的合適位置。否則,依次查看存在的共享內(nèi)存池,從共享內(nèi)存池的可用空間判斷是否符合用戶要求,若符合,從中減去用戶申請的大小,注意字節(jié)對齊,并同時(shí)加入到非空閑內(nèi)存塊鏈表的合適位置,返回地址。若不符合,則重新申請一個(gè)符合大小規(guī)則的新的共享內(nèi)存池,分配適合用戶使用的內(nèi)存塊,同時(shí)加入到非空閑塊鏈表的合適位置,按照可用空閑塊地址將內(nèi)存池插入到合適的位置,返回地址,見圖2。

      2.4 釋放算法設(shè)計(jì)

      2.4.1 共享內(nèi)存池釋放算法

      共享內(nèi)存池的釋放是共享內(nèi)存空間的實(shí)際釋放,如果當(dāng)前使用計(jì)數(shù)為0,在內(nèi)核空間利用底層共享內(nèi)存接口函數(shù)rtai_kfree,在用戶空間利用底層共享內(nèi)存接口函數(shù)rtai_free。

      2.4.2 共享內(nèi)存塊釋放算法

      利用共享內(nèi)存標(biāo)示符表查找此名標(biāo)示的共享內(nèi)存塊,若找到,將共享內(nèi)存塊的占用計(jì)數(shù)減一,若未找到,則說明未分配共享內(nèi)存,失敗返回,為零放入到合適的空閑塊鏈表,若有相鄰的空閑塊,將其連成一個(gè)連續(xù)的空閑塊,放入合適的位置,否則,直接返回。若空閑塊地址與內(nèi)存池可用地址鄰接,將其歸還給共享內(nèi)存池。最后,清除共享內(nèi)存標(biāo)示符表保存的名和地址的映射,見圖3。

      圖2 共享內(nèi)存塊分配算法流程圖

      圖3 共享內(nèi)存塊釋放算法

      2.5 關(guān)鍵API 設(shè)計(jì)

      void * get_shmem_addr(char * name,unsigned int size),獲得大小為size,指針名為name 的共享內(nèi)存地址。

      int free_shmem_addr(char * name),釋放指針名為name 的共享內(nèi)存。

      void * _get_shmem_addr(unsigned int size),實(shí)際進(jìn)行共享內(nèi)存分配。

      shmem_block * find_with_name(const char *name),查找是否已經(jīng)存在name 指向的字符串名的共享內(nèi)存。

      int get_shmem_pool(int pol),獲得一個(gè)共享內(nèi)存池。

      int free_shmem_pool(shmem_pool * p),釋放內(nèi)存池分配的共享內(nèi)存空間。

      shmem_block* get_shmem_block(unsigned int size,module_type mod),獲取一個(gè)size 大小,性質(zhì)為mod 的內(nèi)存塊。

      int free_shmem_block(shmem_block * b),將內(nèi)存塊釋放,就是將它放入空閑塊鏈表里

      shmem_block* search_in_shmem_pool(shmem_pool * p,unsigned int size),在空閑塊鏈表里面查找是否有合適的空閑塊

      int insert_shmem_block_into_pool(shmem_block* b,shmem_pool* p),將分配好的內(nèi)存塊插入到內(nèi)存池的內(nèi)存塊鏈表里。

      int insert_free_shmem_block_into_pool(shmem_block* b,shmem_pool* p),將空閑塊插入到內(nèi)存池的空閑塊鏈表里

      int free_shmem_pool_block(shmem_pool* p),將和內(nèi)存池可用空間地址毗鄰的空閑內(nèi)存塊返回給內(nèi)存池。

      void * get_addr_shmem_block(shmem_block *b),獲取共享塊所指向的地址。

      void init_shmem_block(shmem_block * b,unsigned int size,module_type mod,unsigned int pol),初始化內(nèi)存塊。

      shmem_block* alloc_shmem_block_from_pool(shmem_pool * p,unsigned int size),從合適的內(nèi)存池里分配內(nèi)存塊。

      API 接口調(diào)用如下圖4 和圖5 所示。

      圖4 分配過程API 調(diào)用

      3 實(shí)驗(yàn)及應(yīng)用

      硬件平臺為龍芯CPU,主頻800MHZ,內(nèi)存256M,軟件環(huán)境為linux2.4 操作系統(tǒng),RTAI-24.1.13實(shí)時(shí)擴(kuò)展。整個(gè)共享內(nèi)存管理層使用C 語言實(shí)現(xiàn),具有很強(qiáng)的移植性。

      實(shí)驗(yàn)計(jì)時(shí)方法,利用MIPS 體系結(jié)構(gòu)的協(xié)處理器0(Coprocessor 0)的count(9)寄存器[8]。在分配之前獲取時(shí)間戳t1,在分配之后獲取時(shí)間戳t2,兩者之差就是所需要的時(shí)間Δt。

      圖5 釋放過程API 調(diào)用

      實(shí)驗(yàn)結(jié)果如下圖6 和圖7 所示。

      圖6 rtai 和shmem 分配和釋放4 字節(jié)的時(shí)間

      圖7 rtai 和shmem 分配和釋放400 字節(jié)的時(shí)間

      由圖6 和圖7 可知,利用shmem 共享內(nèi)存管理,能夠有效的減少共享內(nèi)存的分配時(shí)間和釋放時(shí)間。

      4 結(jié)束語

      共享內(nèi)存在需要內(nèi)核和用戶空間數(shù)據(jù)傳輸?shù)那闆r下,有較高的靈活性,所以在數(shù)控系統(tǒng)中應(yīng)用廣泛,因此提高共享內(nèi)存的管理效率對各種使用共享內(nèi)存的應(yīng)用具有很重要的意義。本文采用兩級數(shù)據(jù)管理結(jié)構(gòu),能夠有效的分配和釋放共享內(nèi)存,使用C語言實(shí)現(xiàn)的該共享內(nèi)存管理層具有很好的可移植性,能夠有效的減少共享內(nèi)存分配和釋放時(shí)間,同時(shí)互斥量的使用也能保證共享內(nèi)存的并發(fā)訪問。實(shí)驗(yàn)結(jié)果證明,本設(shè)計(jì)優(yōu)化了RTAI 共享內(nèi)存管理的相關(guān)功能,提高了數(shù)控系統(tǒng)的工作效率。

      [1]RTAI documentation,available from:https://www. rtai.org/documentation/magma/html/api/

      [2]高甜容,于東,等. 數(shù)控系統(tǒng)中模塊間通信方法的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程,2010,36(12):238-241.

      [3]Mauerer W. Professional Linux Kernel Architecture[M].[S. l.]:John Wiley & Sons Inc.,2008.

      [4]Yu Dong,Hu Yi,Huang Yan,et al. An Open CNC System Based on Component Technology[J]. IEEE,2009,6(2):302-311.

      [5]Scott S,Christos D A,Dimitrios S N. Scalable Locality-conscious Multithreaded Memory Allocation[C]. ACM,2006:84-94.

      [6]魯比尼(Rubini,A.),等,著,魏永明,等,譯. LINUX 設(shè)備驅(qū)動程序[M]. 北京:中國電力出版社,2002.

      [7]魏海濤,姜昱明,李建武,等. 內(nèi)存管理機(jī)制的高效實(shí)現(xiàn)研究[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2009,30(16):3708-3712.

      [8]吳文江,秦承剛,陶耀東. 基于MIPS 處理器和RTAI 的數(shù)控系統(tǒng)中調(diào)度抖動的研究[J]. 小型微型計(jì)算機(jī)系統(tǒng),2010(7):1342-1345.

      猜你喜歡
      共享內(nèi)存鏈表空閑
      恩賜
      詩選刊(2023年7期)2023-07-21 07:03:38
      “鳥”字謎
      小讀者之友(2019年9期)2019-09-10 07:22:44
      通過QT實(shí)現(xiàn)進(jìn)程間的通信
      基于二進(jìn)制鏈表的粗糙集屬性約簡
      跟麥咭學(xué)編程
      基于鏈表多分支路徑樹的云存儲數(shù)據(jù)完整性驗(yàn)證機(jī)制
      彪悍的“寵”生,不需要解釋
      一種基于Tilcon的維護(hù)界面設(shè)計(jì)
      基于PCI總線的多處理器協(xié)同機(jī)制研究
      WLAN和LTE交通規(guī)則
      CHIP新電腦(2016年3期)2016-03-10 14:09:48
      黄石市| 阆中市| 通道| 任丘市| 施甸县| 来凤县| 文成县| 岢岚县| 高台县| 河西区| 克拉玛依市| 五华县| 永年县| 东宁县| 五河县| 武汉市| 阿合奇县| 马边| 清徐县| 台州市| 曲阜市| 云安县| 湖北省| 南郑县| 新乐市| 克山县| 崇文区| 定结县| 邵阳市| 丹东市| 台东市| 柳江县| 且末县| 河源市| 东海县| 沙洋县| 体育| 灵丘县| 泗洪县| 汕尾市| 德庆县|