亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2013-12-23 04:47:02陶耀東鄭一麟
        關(guān)鍵詞:分配用戶

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

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

        0 引言

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

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

        本文通過對(duì)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)核和用戶所申請(qǐng)內(nèi)存的空間映射。在RTAI 中,rtai_kmalloc 是從內(nèi)核空間分配共享內(nèi)存的接口函數(shù),rtai_malloc 是從用戶空間分配共享內(nèi)存的接口函數(shù)。rtai_kmalloc 從內(nèi)核申請(qǐng)小于KMALLOC_LIMIT(128K)的空間使用系統(tǒng)內(nèi)核函數(shù)kmalloc 分配共享內(nèi)存空間,大于KMALLOC_LIMIT 使用內(nèi)核系統(tǒng)函數(shù)__get_free_pages 分配空間。rtai_malloc 從用戶空間申請(qǐng)時(shí),直接使用系統(tǒng)函數(shù)vmalloc 分配。無論從內(nèi)核或者是用戶分配完,都要設(shè)置頁面保留位,標(biāo)識(shí)出該頁不被置換出。對(duì)于已經(jīng)被分配的,則函數(shù)查找維護(hù)的全局變量,將共享內(nèi)存地址返回[1]。

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

        為解決同步互斥和多次系統(tǒng)調(diào)用的問題,本文研究并實(shí)現(xiàn)一個(gè)共享內(nèi)存管理層,完成對(duì)共享內(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)核模塊或者是用戶模塊,申請(qǐng)共享內(nèi)存空間的模塊選擇涉及到實(shí)際分配所使用的RTAI 函數(shù)。

        (2)共享內(nèi)存塊的并發(fā)訪問,不同的模塊對(duì)一塊數(shù)據(jù)的并發(fā)訪問,保證各個(gè)部分對(duì)同一個(gè)數(shù)據(jù)的一致性訪問??刹捎没コ饬?,來保證同一時(shí)間只有一個(gè)進(jìn)程來訪問一個(gè)關(guān)鍵區(qū)域,防止產(chǎn)生臟數(shù)據(jù)。若對(duì)訪問的數(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)明未使用,再次申請(qǐng)使用只用占用計(jì)數(shù)加一,就可繼續(xù)使用,減少系統(tǒng)函數(shù)的反復(fù)調(diào)用,增加整個(gè)系統(tǒng)的穩(wěn)定性。在此基礎(chǔ)上,增加共享內(nèi)存池的概念,它是已經(jīng)由底層分配函數(shù)分配成功的大塊的共享內(nèi)存,當(dāng)上層若要申請(qǐng)的共享內(nèi)存大小小于該內(nèi)存池的大小,則直接從中分配空間給用戶。同時(shí)也要維護(hù)共享內(nèi)存塊的鏈表,在釋放的時(shí)候能將合適的塊合并。

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

        (5)共享內(nèi)存塊標(biāo)識(shí)。唯一的確定一塊內(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)存池的可用空間大小是指被申請(qǐng)使用的共享內(nèi)存塊使用余下的可被再分配的空間,同時(shí)考慮到邊界對(duì)齊;使用互斥量來保證對(duì)內(nèi)存的并發(fā)訪問。

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

        硬件平臺(tái)為龍芯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)存的管理效率對(duì)各種使用共享內(nèi)存的應(yīng)用具有很重要的意義。本文采用兩級(jí)數(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ū)動(dòng)程序[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)度抖動(dòng)的研究[J]. 小型微型計(jì)算機(jī)系統(tǒng),2010(7):1342-1345.

        猜你喜歡
        分配用戶
        基于可行方向法的水下機(jī)器人推力分配
        應(yīng)答器THR和TFFR分配及SIL等級(jí)探討
        遺產(chǎn)的分配
        一種分配十分不均的財(cái)富
        績效考核分配的實(shí)踐與思考
        關(guān)注用戶
        商用汽車(2016年11期)2016-12-19 01:20:16
        關(guān)注用戶
        商用汽車(2016年6期)2016-06-29 09:18:54
        關(guān)注用戶
        商用汽車(2016年4期)2016-05-09 01:23:12
        Camera360:拍出5億用戶
        100萬用戶
        亚洲成av在线免费不卡| 99偷拍视频精品一区二区| 中文字幕第一页亚洲| 久久久久久人妻一区二区无码Av| 五月婷婷开心五月播五月| 欧美性高清另类videosex| 国产日韩精品中文字无码| 国产精品久久久久影视不卡| 免费人成网站在线播放| 在线一区二区三区国产精品| 国产精品无码专区av在线播放| 国产又色又爽又刺激视频| 玖玖资源网站最新网站| 日韩人妻另类中文字幕| 在线观看免费人成视频| 国产精品无码专区综合网| 97超碰国产一区二区三区| 天天做天天爱夜夜夜爽毛片| 欧洲女人性开放免费网站| 国产女高清在线看免费观看| 久久亚洲一区二区三区四区五| 亚洲一区精品无码| www国产无套内射com| 久久中文字幕亚洲精品最新| 在线不卡av一区二区| 无码国产精品久久一区免费 | 91久久青青草原线免费| 一区二区三区国产精品| 亚洲av区,一区二区三区色婷婷| 99精品国产一区二区| 99精品成人片免费毛片无码| 亚洲精品综合久久国产二区| 久久不见久久见免费视频6| 亚洲av伊人久久综合密臀性色| 久久99精品这里精品动漫6| 美女露出奶头扒开内裤的视频| 亚洲成在人线av品善网好看| 自拍偷拍亚洲一区| 午夜一区二区三区在线观看| 小妖精又紧又湿高潮h视频69| 亚洲av日韩av永久无码色欲|