




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1linux操作系統(tǒng)精講操作系統(tǒng)精講大連理工大學(xué)軟件學(xué)院大連理工大學(xué)軟件學(xué)院 邱鐵邱鐵 綜合樓綜合樓413,tel_mail: 參考教材:參考教材:plinux應(yīng)用與開發(fā)典型實(shí)例精講應(yīng)用與開發(fā)典型實(shí)例精講邱鐵、于玉龍、邱鐵、于玉龍、徐子川編著徐子川編著. 清華大學(xué)出版社清華大學(xué)出版社. 2010.52第第16章章 內(nèi)存管理內(nèi)存管理學(xué)習(xí)本章要達(dá)到的目標(biāo):學(xué)習(xí)本章要達(dá)到的目標(biāo):o結(jié)合操作系統(tǒng)原理課程,深入理解結(jié)合操作系統(tǒng)原理課程,深入理解linux系系統(tǒng)物理內(nèi)存管理機(jī)制;統(tǒng)物理內(nèi)存管理機(jī)制;o理解伙伴算法和理解伙伴算法和slab分配器的工作原理;分配器的工作原理;o熟
2、悉操作系統(tǒng)提供的有關(guān)內(nèi)存管理的內(nèi)核函數(shù);熟悉操作系統(tǒng)提供的有關(guān)內(nèi)存管理的內(nèi)核函數(shù);o學(xué)會(huì)在學(xué)會(huì)在linux內(nèi)核態(tài)下申請(qǐng)內(nèi)存空間的方法。內(nèi)核態(tài)下申請(qǐng)內(nèi)存空間的方法。316.1 關(guān)于關(guān)于linux的內(nèi)存管理的內(nèi)存管理在在linux系統(tǒng)中對(duì)物理內(nèi)存的管理系統(tǒng)中對(duì)物理內(nèi)存的管理主要涉及主要涉及o頁(yè)面管理頁(yè)面管理o連續(xù)內(nèi)存區(qū)管理連續(xù)內(nèi)存區(qū)管理o非連續(xù)存儲(chǔ)區(qū)管理非連續(xù)存儲(chǔ)區(qū)管理 4 linux物理內(nèi)存管理方式物理內(nèi)存管理方式 516.1.1 動(dòng)態(tài)存儲(chǔ)管理動(dòng)態(tài)存儲(chǔ)管理o一部分永久地分配給系統(tǒng),作為內(nèi)核代碼段一部分永久地分配給系統(tǒng),作為內(nèi)核代碼段和只讀數(shù)據(jù)段的載體,用來(lái)存放內(nèi)核程序代和只讀數(shù)據(jù)段的載體,用來(lái)存
3、放內(nèi)核程序代碼以及靜態(tài)數(shù)據(jù),這部分稱為操作系統(tǒng)的靜碼以及靜態(tài)數(shù)據(jù),這部分稱為操作系統(tǒng)的靜態(tài)存儲(chǔ)器(態(tài)存儲(chǔ)器(static memory)。)。o其它部分,則在其它部分,則在linux的管理下,進(jìn)行內(nèi)存的管理下,進(jìn)行內(nèi)存的動(dòng)態(tài)申請(qǐng)和釋放,稱為動(dòng)態(tài)存儲(chǔ)器的動(dòng)態(tài)申請(qǐng)和釋放,稱為動(dòng)態(tài)存儲(chǔ)器(dynamic memory)。)。 616.1.2 頁(yè)面管理頁(yè)面管理olinux采用頁(yè)作為內(nèi)存管理的基本單位,其采用頁(yè)作為內(nèi)存管理的基本單位,其采用的標(biāo)準(zhǔn)的頁(yè)面大小為采用的標(biāo)準(zhǔn)的頁(yè)面大小為4kbo因?yàn)橐驗(yàn)?kb是大多數(shù)磁盤塊大小的倍數(shù),傳是大多數(shù)磁盤塊大小的倍數(shù),傳輸效率高,管理方便,無(wú)需考慮輸效率高,管理方便,
4、無(wú)需考慮pse,pae 7o內(nèi)核使用頁(yè)描述符來(lái)跟蹤管理物理內(nèi)存,每?jī)?nèi)核使用頁(yè)描述符來(lái)跟蹤管理物理內(nèi)存,每個(gè)物理頁(yè)面都用一個(gè)頁(yè)描述符表示個(gè)物理頁(yè)面都用一個(gè)頁(yè)描述符表示o頁(yè)描述符用頁(yè)描述符用struct page的結(jié)構(gòu)描述,所的結(jié)構(gòu)描述,所有物理頁(yè)面的描述符,組織在有物理頁(yè)面的描述符,組織在mem_map的數(shù)組中,的數(shù)組中,page結(jié)構(gòu)則是對(duì)物理頁(yè)面進(jìn)行結(jié)構(gòu)則是對(duì)物理頁(yè)面進(jìn)行描述的一個(gè)數(shù)據(jù)結(jié)構(gòu)描述的一個(gè)數(shù)據(jù)結(jié)構(gòu) 8mem_map數(shù)組與物理內(nèi)存的對(duì)應(yīng)關(guān)系數(shù)組與物理內(nèi)存的對(duì)應(yīng)關(guān)系 9olinux采用著名的伙伴(采用著名的伙伴(buddy)算法來(lái))算法來(lái)解決內(nèi)存碎片問題。解決內(nèi)存碎片問題。o伙伴算法把所
5、有的空閑頁(yè)面分為伙伴算法把所有的空閑頁(yè)面分為10個(gè)頁(yè)塊個(gè)頁(yè)塊鏈表,每個(gè)鏈表中的一個(gè)塊含有鏈表,每個(gè)鏈表中的一個(gè)塊含有2的冪次個(gè)的冪次個(gè)頁(yè)面(叫做頁(yè)面(叫做“頁(yè)塊頁(yè)塊”或簡(jiǎn)稱或簡(jiǎn)稱“塊塊” )o實(shí)例具體分析參見教材實(shí)例具體分析參見教材linux應(yīng)用與開發(fā)應(yīng)用與開發(fā)典型實(shí)例精講典型實(shí)例精講第第256頁(yè)頁(yè)10伙伴算法伙伴算法實(shí)例1116.1.3 slab分配模式分配模式o在在linux系統(tǒng)中所用到的對(duì)象如系統(tǒng)中所用到的對(duì)象如inode、task_struct等,經(jīng)常會(huì)涉及到大量對(duì)象等,經(jīng)常會(huì)涉及到大量對(duì)象的重復(fù)生成、使用和釋放問題。的重復(fù)生成、使用和釋放問題。 o這些對(duì)象在生成時(shí),所包括的成員屬性值
6、都這些對(duì)象在生成時(shí),所包括的成員屬性值都賦成確定的數(shù)值,并且在使用完畢,釋放結(jié)賦成確定的數(shù)值,并且在使用完畢,釋放結(jié)構(gòu)前,屬性又恢復(fù)為未使用前的狀態(tài)。構(gòu)前,屬性又恢復(fù)為未使用前的狀態(tài)。 12linux的的slab內(nèi)存分配模式的基本思想內(nèi)存分配模式的基本思想o能夠用合適的方法使得在對(duì)象前后兩次被使能夠用合適的方法使得在對(duì)象前后兩次被使用時(shí),在同一塊內(nèi)存,或同一類內(nèi)存空間,用時(shí),在同一塊內(nèi)存,或同一類內(nèi)存空間,且保留了基本的數(shù)據(jù)結(jié)構(gòu),就可以大大提高且保留了基本的數(shù)據(jù)結(jié)構(gòu),就可以大大提高效率。效率。131416.2 linux的內(nèi)存管理函數(shù)的內(nèi)存管理函數(shù)ovmalloc()是內(nèi)核可以用來(lái)分配連續(xù)虛存
7、,是內(nèi)核可以用來(lái)分配連續(xù)虛存,但非連續(xù)物理內(nèi)存的方法。但非連續(xù)物理內(nèi)存的方法。 okmalloc分配在物理上連續(xù)的內(nèi)存分配在物理上連續(xù)的內(nèi)存,這些內(nèi)這些內(nèi)存是實(shí)際上存在的存是實(shí)際上存在的,并且是連續(xù)的并且是連續(xù)的,根據(jù)根據(jù) slab塊進(jìn)行分配。塊進(jìn)行分配。 1516.3 實(shí)例訓(xùn)練與分析實(shí)例訓(xùn)練與分析o在用戶空間用在用戶空間用valloc/malloc分配內(nèi)存分配內(nèi)存o在內(nèi)核空間用在內(nèi)核空間用kmalloc/vmalloc分配內(nèi)分配內(nèi)存存 1616.3.1 在用戶空間用在用戶空間用valloc/malloc分配內(nèi)存分配內(nèi)存o實(shí)現(xiàn)用實(shí)現(xiàn)用valloc申請(qǐng)申請(qǐng)1mb內(nèi)存單元內(nèi)存單元o程序退出時(shí)釋放。
8、程序退出時(shí)釋放。 17實(shí)例源碼實(shí)例源碼o#define a_megabyte 1024*1024oint main() ochar *some_memery;o int megabyte=a_megabyte;o int exit_code=exit_failure;osome_memery=(char*)valloc(megabyte); /* 申請(qǐng)內(nèi)存申請(qǐng)內(nèi)存 */o if(some_memery!=null)osprintf(some_memery,hello world!n); /* 將字符串寫入將字符串寫入 some_memery 所所 o 指向內(nèi)存指向內(nèi)存 */oprintf(%s
9、,some_memery);ofree(some_memery); /* 釋放內(nèi)存釋放內(nèi)存 */oprintf(memery is free!n);o exit_code=exit_success;o oexit(exit_code);o18運(yùn)行結(jié)果運(yùn)行結(jié)果1916.3.2 在內(nèi)核空間用在內(nèi)核空間用kmalloc/vmalloc分配內(nèi)存分配內(nèi)存編寫編寫mem_kv.c模塊文件實(shí)現(xiàn)對(duì)實(shí)際內(nèi)存與虛擬內(nèi)模塊文件實(shí)現(xiàn)對(duì)實(shí)際內(nèi)存與虛擬內(nèi)存的分配:存的分配:o#define mem_malloc_size 4096/申請(qǐng)內(nèi)存的大小申請(qǐng)內(nèi)存的大小o#define mem_major 252/主設(shè)主設(shè)備號(hào)備號(hào)
10、o#define mem_minor_k 0/次設(shè)次設(shè)備號(hào):實(shí)存?zhèn)涮?hào):實(shí)存o#define mem_minor_v 1/次設(shè)次設(shè)備號(hào):虛存?zhèn)涮?hào):虛存ochar *mem_spkm, *mem_spvm;/定義定義實(shí)存、虛存指針實(shí)存、虛存指針ostruct cdev *mem_cdev;20o/*設(shè)備文件結(jié)構(gòu)體選項(xiàng)設(shè)備文件結(jié)構(gòu)體選項(xiàng) */ostruct file_operations mem_fops = oo.open = mem_open,/打開打開o.release = mem_release, /釋放釋放o.read = mem_read,/讀操作讀操作o.write = mem_wri
11、te,/寫操作寫操作o; 21o將將mem_spkm指向內(nèi)核實(shí)際內(nèi)指向內(nèi)核實(shí)際內(nèi)存空間,將存空間,將mem_spvm指指向內(nèi)核虛擬內(nèi)存向內(nèi)核虛擬內(nèi)存空間,并將其加空間,并將其加載進(jìn)內(nèi)核設(shè)備文載進(jìn)內(nèi)核設(shè)備文件系統(tǒng)中。件系統(tǒng)中。 22o刪除設(shè)備結(jié)構(gòu),刪除設(shè)備結(jié)構(gòu),將將mem_spkm所指向的內(nèi)核所指向的內(nèi)核實(shí)際內(nèi)存空間實(shí)際內(nèi)存空間釋放掉,將釋放掉,將mem_spvm所指向內(nèi)核虛所指向內(nèi)核虛擬內(nèi)存空間釋擬內(nèi)存空間釋放掉。放掉。 void _exit mem_exit(void)if (mem_cdev != null)cdev_del(mem_cdev);/刪除設(shè)備結(jié)構(gòu)printk(kern_inf
12、ocdev_del okn);if (mem_spkm != null)kfree(mem_spkm);/釋放實(shí)存空間printk(kern_infokfree ok!n);if (mem_spvm != null)vfree(mem_spvm);/釋放虛存空間printk(kern_infovfree ok!n);23int mem_open(struct inode *ind, struct file *filp)if (iminor(ind) % 2) = 0)/獲取次設(shè)備號(hào)printk(kern_infoopen kmalloc spacen);elseprintk(kern_info
13、open vmalloc spacen);try_module_get(this_module); /模塊計(jì)數(shù)加1return 0;24ssize_t mem_read(struct file *filp, char *buf, size_t size, loff_t *lofp)int res = -1;char *tmp;struct inode *inodep;inodep = filp-f_dentry-d_inode;if (iminor(inodep) % 2) = 0)/獲取次設(shè)備號(hào)tmp = mem_spkm;elsetmp = mem_spvm;if (size mem_ma
14、lloc_size)size = mem_malloc_size;if (tmp != null)res = copy_to_user(buf, tmp, size);/將內(nèi)核空間的內(nèi)存內(nèi)容復(fù)制到用戶空間if (res = 0)return size;elsereturn 0;25#setupenv.shmakeecho make successfully!insmod mem_kv.ko # 插入模塊# 建立主設(shè)備號(hào)為252,次設(shè)備號(hào)為0的設(shè)備文件掛載點(diǎn):/dev/myalloc0ls /dev/myalloc0 | mknod /dev/myalloc0 c 252 0 & ech
15、o /dev/myalloc0 was caeated successfully!chmod 666 /dev/myalloc0# 建立主設(shè)備號(hào)為252,次設(shè)備號(hào)為1的設(shè)備文件掛載點(diǎn):/dev/myalloc1ls /dev/myalloc1 | mknod /dev/myalloc1 c 252 1 & echo /dev/myalloc1 was caeated successfully!chmod 666 /dev/myalloc12627o編寫編寫mem_test.c文件文件 o實(shí)例源碼參見教材實(shí)例源碼參見教材linux應(yīng)用與開發(fā)典型應(yīng)用與開發(fā)典型實(shí)例精講實(shí)例精講第第264頁(yè)頁(yè)
16、28讀寫的內(nèi)存為用讀寫的內(nèi)存為用kmalloc()申請(qǐng)的實(shí)際申請(qǐng)的實(shí)際內(nèi)存內(nèi)存 29讀寫的內(nèi)存為用讀寫的內(nèi)存為用vmalloc()申請(qǐng)的虛擬申請(qǐng)的虛擬內(nèi)存內(nèi)存 30思考與練習(xí)思考與練習(xí)o1. 在在linux操作系統(tǒng)中,頁(yè)面管理、內(nèi)存操作系統(tǒng)中,頁(yè)面管理、內(nèi)存區(qū)管理、非連續(xù)存儲(chǔ)區(qū)管理之間的關(guān)系是怎區(qū)管理、非連續(xù)存儲(chǔ)區(qū)管理之間的關(guān)系是怎樣的?樣的?o2linux操作系統(tǒng)對(duì)物理內(nèi)存的管理方式操作系統(tǒng)對(duì)物理內(nèi)存的管理方式有哪幾種,各使用了什么算法?有哪幾種,各使用了什么算法?o3動(dòng)態(tài)存儲(chǔ)管理有哪些優(yōu)點(diǎn)?動(dòng)態(tài)存儲(chǔ)管理有哪些優(yōu)點(diǎn)?o4linux采用頁(yè)面作為內(nèi)存管理的基本單采用頁(yè)面作為內(nèi)存管理的基本單位,采用的標(biāo)準(zhǔn)的頁(yè)面大小為位,采用的標(biāo)準(zhǔn)的頁(yè)面大小為4kb,為什,為什么取此值?么取此值?31思考與練習(xí)思考與練習(xí)o5linux解決內(nèi)存碎片問題
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車制造業(yè)2025年供應(yīng)鏈風(fēng)險(xiǎn)管理數(shù)字化解決方案報(bào)告
- 2025屆廣東省梅州市梅江實(shí)驗(yàn)中學(xué)英語(yǔ)八年級(jí)第二學(xué)期期末質(zhì)量檢測(cè)模擬試題含答案
- 2025年元宇宙社交平臺(tái)虛擬現(xiàn)實(shí)社交平臺(tái)運(yùn)營(yíng)模式研究報(bào)告
- 城市污水處理廠智能化升級(jí)改造中的智能化水質(zhì)處理技術(shù)研究報(bào)告
- 2025年醫(yī)院電子病歷系統(tǒng)在醫(yī)院信息化建設(shè)中的邊緣計(jì)算應(yīng)用報(bào)告
- 2025年醫(yī)藥行業(yè)未來(lái)趨勢(shì):仿制藥一致性評(píng)價(jià)下的醫(yī)藥電商發(fā)展報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)與企業(yè)核心競(jìng)爭(zhēng)力提升報(bào)告
- 能源行業(yè)2025年儲(chǔ)能技術(shù)多元化儲(chǔ)能電池材料研發(fā)與創(chuàng)新報(bào)告
- 禮儀培訓(xùn)課件標(biāo)題
- 安全轉(zhuǎn)運(yùn)試題及答案
- 新科hg5300功放說(shuō)明書
- 2023-2024學(xué)年湖南省常德市小學(xué)語(yǔ)文六年級(jí)期末評(píng)估試卷附參考答案和詳細(xì)解析
- 華北理工環(huán)境監(jiān)測(cè)教案02水和廢水監(jiān)測(cè)-4金屬化合物-鋁、汞、鎘、鉛、銅、鋅、鉻、砷等測(cè)定
- 輕質(zhì)碳酸鈣的應(yīng)用及其發(fā)展前景
- 氣污染源自動(dòng)監(jiān)控設(shè)施臺(tái)賬記錄模版校準(zhǔn)記錄
- JJF 1169-2007汽車制動(dòng)操縱力計(jì)校準(zhǔn)規(guī)范
- 新高考高中物理競(jìng)賽專題1力學(xué)50題競(jìng)賽真題強(qiáng)化訓(xùn)練原卷版
- 2023年成都市成華發(fā)展集團(tuán)有限責(zé)任公司招聘筆試模擬試題及答案解析
- 曬紋資料大全
- 山東省泰安市2021-2022學(xué)年高一下學(xué)期期末考試數(shù)學(xué)試題(Word版含答案)
- ××團(tuán)支部換屆選舉選票
評(píng)論
0/150
提交評(píng)論