第16章Linux內(nèi)存管理機制PPT課件_第1頁
第16章Linux內(nèi)存管理機制PPT課件_第2頁
第16章Linux內(nèi)存管理機制PPT課件_第3頁
第16章Linux內(nèi)存管理機制PPT課件_第4頁
第16章Linux內(nèi)存管理機制PPT課件_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、1linux操作系統(tǒng)精講操作系統(tǒng)精講大連理工大學軟件學院大連理工大學軟件學院 邱鐵邱鐵 綜合樓綜合樓413,tel_mail: 參考教材:參考教材:plinux應用與開發(fā)典型實例精講應用與開發(fā)典型實例精講邱鐵、于玉龍、邱鐵、于玉龍、徐子川編著徐子川編著. 清華大學出版社清華大學出版社. 2010.52第第16章章 內(nèi)存管理內(nèi)存管理學習本章要達到的目標:學習本章要達到的目標:o結(jié)合操作系統(tǒng)原理課程,深入理解結(jié)合操作系統(tǒng)原理課程,深入理解linux系系統(tǒng)物理內(nèi)存管理機制;統(tǒng)物理內(nèi)存管理機制;o理解伙伴算法和理解伙伴算法和slab分配器的工作原理;分配器的工作原理;o熟

2、悉操作系統(tǒng)提供的有關(guān)內(nèi)存管理的內(nèi)核函數(shù);熟悉操作系統(tǒng)提供的有關(guān)內(nèi)存管理的內(nèi)核函數(shù);o學會在學會在linux內(nèi)核態(tài)下申請內(nèi)存空間的方法。內(nèi)核態(tài)下申請內(nèi)存空間的方法。316.1 關(guān)于關(guān)于linux的內(nèi)存管理的內(nèi)存管理在在linux系統(tǒng)中對物理內(nèi)存的管理系統(tǒng)中對物理內(nèi)存的管理主要涉及主要涉及o頁面管理頁面管理o連續(xù)內(nèi)存區(qū)管理連續(xù)內(nèi)存區(qū)管理o非連續(xù)存儲區(qū)管理非連續(xù)存儲區(qū)管理 4 linux物理內(nèi)存管理方式物理內(nèi)存管理方式 516.1.1 動態(tài)存儲管理動態(tài)存儲管理o一部分永久地分配給系統(tǒng),作為內(nèi)核代碼段一部分永久地分配給系統(tǒng),作為內(nèi)核代碼段和只讀數(shù)據(jù)段的載體,用來存放內(nèi)核程序代和只讀數(shù)據(jù)段的載體,用來存

3、放內(nèi)核程序代碼以及靜態(tài)數(shù)據(jù),這部分稱為操作系統(tǒng)的靜碼以及靜態(tài)數(shù)據(jù),這部分稱為操作系統(tǒng)的靜態(tài)存儲器(態(tài)存儲器(static memory)。)。o其它部分,則在其它部分,則在linux的管理下,進行內(nèi)存的管理下,進行內(nèi)存的動態(tài)申請和釋放,稱為動態(tài)存儲器的動態(tài)申請和釋放,稱為動態(tài)存儲器(dynamic memory)。)。 616.1.2 頁面管理頁面管理olinux采用頁作為內(nèi)存管理的基本單位,其采用頁作為內(nèi)存管理的基本單位,其采用的標準的頁面大小為采用的標準的頁面大小為4kbo因為因為4kb是大多數(shù)磁盤塊大小的倍數(shù),傳是大多數(shù)磁盤塊大小的倍數(shù),傳輸效率高,管理方便,無需考慮輸效率高,管理方便,

4、無需考慮pse,pae 7o內(nèi)核使用頁描述符來跟蹤管理物理內(nèi)存,每內(nèi)核使用頁描述符來跟蹤管理物理內(nèi)存,每個物理頁面都用一個頁描述符表示個物理頁面都用一個頁描述符表示o頁描述符用頁描述符用struct page的結(jié)構(gòu)描述,所的結(jié)構(gòu)描述,所有物理頁面的描述符,組織在有物理頁面的描述符,組織在mem_map的數(shù)組中,的數(shù)組中,page結(jié)構(gòu)則是對物理頁面進行結(jié)構(gòu)則是對物理頁面進行描述的一個數(shù)據(jù)結(jié)構(gòu)描述的一個數(shù)據(jù)結(jié)構(gòu) 8mem_map數(shù)組與物理內(nèi)存的對應關(guān)系數(shù)組與物理內(nèi)存的對應關(guān)系 9olinux采用著名的伙伴(采用著名的伙伴(buddy)算法來)算法來解決內(nèi)存碎片問題。解決內(nèi)存碎片問題。o伙伴算法把所

5、有的空閑頁面分為伙伴算法把所有的空閑頁面分為10個頁塊個頁塊鏈表,每個鏈表中的一個塊含有鏈表,每個鏈表中的一個塊含有2的冪次個的冪次個頁面(叫做頁面(叫做“頁塊頁塊”或簡稱或簡稱“塊塊” )o實例具體分析參見教材實例具體分析參見教材linux應用與開發(fā)應用與開發(fā)典型實例精講典型實例精講第第256頁頁10伙伴算法伙伴算法實例1116.1.3 slab分配模式分配模式o在在linux系統(tǒng)中所用到的對象如系統(tǒng)中所用到的對象如inode、task_struct等,經(jīng)常會涉及到大量對象等,經(jīng)常會涉及到大量對象的重復生成、使用和釋放問題。的重復生成、使用和釋放問題。 o這些對象在生成時,所包括的成員屬性值

6、都這些對象在生成時,所包括的成員屬性值都賦成確定的數(shù)值,并且在使用完畢,釋放結(jié)賦成確定的數(shù)值,并且在使用完畢,釋放結(jié)構(gòu)前,屬性又恢復為未使用前的狀態(tài)。構(gòu)前,屬性又恢復為未使用前的狀態(tài)。 12linux的的slab內(nèi)存分配模式的基本思想內(nèi)存分配模式的基本思想o能夠用合適的方法使得在對象前后兩次被使能夠用合適的方法使得在對象前后兩次被使用時,在同一塊內(nèi)存,或同一類內(nèi)存空間,用時,在同一塊內(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)核可以用來分配連續(xù)虛存

7、,是內(nèi)核可以用來分配連續(xù)虛存,但非連續(xù)物理內(nèi)存的方法。但非連續(xù)物理內(nèi)存的方法。 okmalloc分配在物理上連續(xù)的內(nèi)存分配在物理上連續(xù)的內(nèi)存,這些內(nèi)這些內(nèi)存是實際上存在的存是實際上存在的,并且是連續(xù)的并且是連續(xù)的,根據(jù)根據(jù) slab塊進行分配。塊進行分配。 1516.3 實例訓練與分析實例訓練與分析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實現(xiàn)用實現(xiàn)用valloc申請申請1mb內(nèi)存單元內(nèi)存單元o程序退出時釋放。

8、程序退出時釋放。 17實例源碼實例源碼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); /* 申請內(nèi)存申請內(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運行結(jié)果運行結(jié)果1916.3.2 在內(nèi)核空間用在內(nèi)核空間用kmalloc/vmalloc分配內(nèi)存分配內(nèi)存編寫編寫mem_kv.c模塊文件實現(xiàn)對實際內(nèi)存與虛擬內(nèi)模塊文件實現(xiàn)對實際內(nèi)存與虛擬內(nèi)存的分配:存的分配:o#define mem_malloc_size 4096/申請內(nèi)存的大小申請內(nèi)存的大小o#define mem_major 252/主設主設備號備號

10、o#define mem_minor_k 0/次設次設備號:實存?zhèn)涮枺簩嵈鎜#define mem_minor_v 1/次設次設備號:虛存?zhèn)涮枺禾摯鎜char *mem_spkm, *mem_spvm;/定義定義實存、虛存指針實存、虛存指針ostruct cdev *mem_cdev;20o/*設備文件結(jié)構(gòu)體選項設備文件結(jié)構(gòu)體選項 */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)核實際內(nèi)指向內(nèi)核實際內(nèi)存空間,將存空間,將mem_spvm指指向內(nèi)核虛擬內(nèi)存向內(nèi)核虛擬內(nèi)存空間,并將其加空間,并將其加載進內(nèi)核設備文載進內(nèi)核設備文件系統(tǒng)中。件系統(tǒng)中。 22o刪除設備結(jié)構(gòu),刪除設備結(jié)構(gòu),將將mem_spkm所指向的內(nèi)核所指向的內(nèi)核實際內(nèi)存空間實際內(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);/刪除設備結(jié)構(gòu)printk(kern_inf

12、ocdev_del okn);if (mem_spkm != null)kfree(mem_spkm);/釋放實存空間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)/獲取次設備號printk(kern_infoopen kmalloc spacen);elseprintk(kern_info

13、open vmalloc spacen);try_module_get(this_module); /模塊計數(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)/獲取次設備號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)容復制到用戶空間if (res = 0)return size;elsereturn 0;25#setupenv.shmakeecho make successfully!insmod mem_kv.ko # 插入模塊# 建立主設備號為252,次設備號為0的設備文件掛載點:/dev/myalloc0ls /dev/myalloc0 | mknod /dev/myalloc0 c 252 0 & ech

15、o /dev/myalloc0 was caeated successfully!chmod 666 /dev/myalloc0# 建立主設備號為252,次設備號為1的設備文件掛載點:/dev/myalloc1ls /dev/myalloc1 | mknod /dev/myalloc1 c 252 1 & echo /dev/myalloc1 was caeated successfully!chmod 666 /dev/myalloc12627o編寫編寫mem_test.c文件文件 o實例源碼參見教材實例源碼參見教材linux應用與開發(fā)典型應用與開發(fā)典型實例精講實例精講第第264頁頁

16、28讀寫的內(nèi)存為用讀寫的內(nèi)存為用kmalloc()申請的實際申請的實際內(nèi)存內(nèi)存 29讀寫的內(nèi)存為用讀寫的內(nèi)存為用vmalloc()申請的虛擬申請的虛擬內(nèi)存內(nèi)存 30思考與練習思考與練習o1. 在在linux操作系統(tǒng)中,頁面管理、內(nèi)存操作系統(tǒng)中,頁面管理、內(nèi)存區(qū)管理、非連續(xù)存儲區(qū)管理之間的關(guān)系是怎區(qū)管理、非連續(xù)存儲區(qū)管理之間的關(guān)系是怎樣的?樣的?o2linux操作系統(tǒng)對物理內(nèi)存的管理方式操作系統(tǒng)對物理內(nèi)存的管理方式有哪幾種,各使用了什么算法?有哪幾種,各使用了什么算法?o3動態(tài)存儲管理有哪些優(yōu)點?動態(tài)存儲管理有哪些優(yōu)點?o4linux采用頁面作為內(nèi)存管理的基本單采用頁面作為內(nèi)存管理的基本單位,采用的標準的頁面大小為位,采用的標準的頁面大小為4kb,為什,為什么取此值?么取此值?31思考與練習思考與練習o5linux解決內(nèi)存碎片問題

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論