国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

操作系統就用一張大表管理內存?

系統 存儲軟件
今天我們不聊具體內存管理的算法,我們就來看看,操作系統用什么樣的一張表,達到了管理內存的效果。

今天我們不聊具體內存管理的算法,我們就來看看,操作系統用什么樣的一張表,達到了管理內存的效果。

我們以 Linux 0.11 源碼為例,發現進入內核的 main 函數后不久,有這樣一坨代碼。

  1. void main(void) { 
  2.     ... 
  3.     memory_end = (1<<20) + (EXT_MEM_K<<10); 
  4.     memory_end &= 0xfffff000; 
  5.     if (memory_end > 16*1024*1024) 
  6.         memory_end = 16*1024*1024; 
  7.     if (memory_end > 12*1024*1024)  
  8.         buffer_memory_end = 4*1024*1024; 
  9.     else if (memory_end > 6*1024*1024) 
  10.         buffer_memory_end = 2*1024*1024; 
  11.     else 
  12.         buffer_memory_end = 1*1024*1024; 
  13.     main_memory_start = buffer_memory_end; 
  14.  
  15.     mem_init(main_memory_start,memory_end); 
  16.     ... 

除了最后一行外,前面的那一大坨的作用很簡單。

其實就只是針對不同的內存大小,設置不同的邊界值罷了,為了理解它,我們完全沒必要考慮這么周全,就假設總內存一共就 8M 大小吧。

那么如果內存為 8M 大小,memory_end 就是

8 * 1024 * 1024

也就只會走倒數第二個分支,那么 buffer_memory_end 就為

2 * 1024 * 1024

那么 main_memory_start 也為

2 * 1024 * 1024

你仔細看看代碼邏輯,看是不是這樣?

當然,你不愿意細想也沒關系,上述代碼執行后,就是如下效果而已。

你看,其實就是定了三個箭頭所指向的地址的三個邊界變量。具體主內存區是如何管理和分配的,要看 mem_init 里做了什么。

  1. void main(void) { 
  2.     ... 
  3.     mem_init(main_memory_start, memory_end); 
  4.     ... 

而緩沖區是如何管理和分配的,就要看再后面的 buffer_init 里干了什么。

  1. void main(void) { 
  2.     ... 
  3.     buffer_init(buffer_memory_end); 
  4.     ... 

不過我們今天只看,主內存是如何管理的,很簡單,放輕松。

進入 mem_init 函數。

  1. #define LOW_MEM 0x100000 
  2. #define PAGING_MEMORY (15*1024*1024) 
  3. #define PAGING_PAGES (PAGING_MEMORY>>12) 
  4. #define MAP_NR(addr) (((addr)-LOW_MEM)>>12) 
  5. #define USED 100 
  6.  
  7. static long HIGH_MEMORY = 0; 
  8. static unsigned char mem_map[PAGING_PAGES] = { 0, }; 
  9.  
  10. // start_mem = 2 * 1024 * 1024 
  11. // end_mem = 8 * 1024 * 1024 
  12. void mem_init(long start_mem, long end_mem) 
  13.     int i; 
  14.     HIGH_MEMORY = end_mem; 
  15.     for (i=0 ; i<PAGING_PAGES ; i++) 
  16.         mem_map[i] = USED; 
  17.     i = MAP_NR(start_mem); 
  18.     end_mem -= start_mem; 
  19.     end_mem >>= 12; 
  20.     while (end_mem-->0) 
  21.         mem_map[i++]=0; 

發現也沒幾行,而且并沒有更深的方法調用,看來是個好欺負的方法。

仔細一看這個方法,其實折騰來折騰去,就是給一個 mem_map 數組的各個位置上賦了值,而且顯示全部賦值為 USED 也就是 100,然后對其中一部分又賦值為了 0。

賦值為 100 的部分就是 USED,也就表示內存被占用,如果再具體說是占用了 100 次,這個之后再說。剩下賦值為 0 的部分就表示未被使用,也即使用次數為零。

是不是很簡單?就是準備了一個表,記錄了哪些內存被占用了,哪些內存沒被占用。這就是所謂的“管理”,并沒有那么神乎其神。

那接下來自然有兩個問題,每個元素表示占用和未占用,這個表示的范圍是多大?初始化時哪些地方是占用的,哪些地方又是未占用的?

還是一張圖就看明白了,我們仍然假設內存總共只有 8M。

可以看出,初始化完成后,其實就是 mem_map 這個數組的每個元素都代表一個 4K 內存是否空閑(準確說是使用次數)。

4K 內存通常叫做 1 頁內存,而這種管理方式叫分頁管理,就是把內存分成一頁一頁(4K)的單位去管理。

1M 以下的內存這個數組干脆沒有記錄,這里的內存是無需管理的,或者換個說法是無權管理的,也就是沒有權利申請和釋放,因為這個區域是內核代碼所在的地方,不能被“污染”。

1M 到 2M 這個區間是緩沖區,2M 是緩沖區的末端,緩沖區的開始在哪里之后再說,這些地方不是主內存區域,因此直接標記為 USED,產生的效果就是無法再被分配了。

2M 以上的空間是主內存區域,而主內存目前沒有任何程序申請,所以初始化時統統都是零,未來等著應用程序去申請和釋放這里的內存資源。

那應用程序如何申請內存呢?我們本講不展開,不過我們簡單展望一下,看看申請內存的過程中,是如何使用 mem_map 這個結構的。

在 memory.c 文件中有個函數 get_free_page(),用于在主內存區中申請一頁空閑內存頁,并返回物理內存頁的起始地址。

比如我們在 fork 子進程的時候,會調用 copy_process 函數來復制進程的結構信息,其中有一個步驟就是要申請一頁內存,用于存放進程結構信息 task_struct。

  1. int copy_process(...) { 
  2.     struct task_struct *p; 
  3.     ... 
  4.     p = (struct task_struct *) get_free_page(); 
  5.     ... 

我們看 get_free_page 的具體實現,是內聯匯編代碼,看不懂不要緊,注意它里面就有 mem_map 結構的使用。

  1. unsigned long get_free_page(void) { 
  2.     register unsigned long __res asm("ax"); 
  3.     __asm__( 
  4.         "std ; repne ; scasb\n\t" 
  5.         "jne 1f\n\t" 
  6.         "movb $1,1(%%edi)\n\t" 
  7.         "sall $12,%%ecx\n\t" 
  8.         "addl %2,%%ecx\n\t" 
  9.         "movl %%ecx,%%edx\n\t" 
  10.         "movl $1024,%%ecx\n\t" 
  11.         "leal 4092(%%edx),%%edi\n\t" 
  12.         "rep ; stosl\n\t" 
  13.         "movl %%edx,%%eax\n" 
  14.         "1:" 
  15.         :"=a" (__res) 
  16.         :"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES), 
  17.         "D" (mem_map + PAGING_PAGES-1) 
  18.         :"di","cx","dx"); 
  19.     return __res; 

就是選擇 mem_map 中首個空閑頁面,并標記為已使用。

好了,本講就這么多,只是填寫了一張大表而已,簡單吧?之后的內存申請與釋放等騷操作,統統是跟著張大表 mem_map 打交道而已,你一定要記住它哦。

 

責任編輯:武曉燕 來源: 低并發編程
相關推薦

2013-08-14 09:21:16

Ubuntu

2019-09-22 18:31:46

Oracleundo空間

2022-11-28 07:21:53

操作系統內存管理

2009-08-17 08:32:56

Linux操作系統內存管理Linux

2021-03-28 13:54:31

操作系統內存管理

2009-12-02 11:02:54

操作系統

2010-02-04 17:16:30

2025-01-13 00:30:17

2021-06-11 07:26:16

操作系統內存管理Cpu

2010-04-20 14:17:21

Unix操作系統

2010-04-14 13:59:45

Unix操作系統

2010-04-07 15:37:16

Unix操作系統

2010-04-08 17:05:21

Unix操作系統

2010-04-13 16:11:15

Unix操作系統

2022-11-17 12:09:51

2024-08-05 00:05:00

操作系統內存管理

2024-08-05 11:20:41

2024-08-28 17:45:00

內存Linux

2021-02-07 09:01:10

Java并發編程

2019-09-11 10:12:12

華為
點贊
收藏

51CTO技術棧公眾號

亚洲免费视频播放| 麻豆传媒在线观看| 羞羞答答国产精品www一本| 欧美在线激情视频| 亚洲视频国产| 丝袜亚洲另类欧美重口| 天使と恶魔の榨精在线播放| 色94色欧美sute亚洲13| 在线看片线路1| 亚洲国产一二三| а√最新版在线天堂| 国产日韩精品久久久| 免费在线观看视频a| 精品制服美女丁香| 日韩欧美电影一区二区| 久久动漫亚洲| 日韩视频在线播放| 日本va欧美va瓶| 欧美日产一区二区三区在线观看| 国语自产精品视频在线看8查询8| 亚洲一区二区三区在线视频 | 成人激情视频在线播放| 美女精品一区最新中文字幕一区二区三区| 久久999免费视频| 韩国三级成人在线| 欧美夫妻性视频| 欧美日本三级| 久久免费视频网站| 亚洲人成精品久久久 | 亚洲免费成人av| 高清孕妇孕交╳╳交| 亚洲精品日韩一| 蜜臀一区二区三区| 色综合视频在线观看| 久久精品视频观看| 亚洲大尺度美女在线| 人人鲁人人莫人人爱精品| 亚洲日本欧美中文幕| 亚洲精品第一| 91tv亚洲精品香蕉国产一区7ujn| 欧美日一区二区| 国产日韩久久| 国产精品一二三在| 九七影院理伦片| 欧美天堂亚洲电影院在线播放| 性欧美videos高清hd4k| 中文字幕精品视频| 亚洲第一福利专区| 国产精品成人观看视频免费| 久久国产麻豆精品| 国产成人手机视频| 欧美性videos高清精品| 毛片在线网站| 欧美激情在线视频二区| 99久久夜色精品国产亚洲96| 日本一区二区三区免费观看| 91偷拍与自偷拍精品| 在线小视频网址| 亚洲韩国欧洲国产日产av| 深夜福利一区| 91福利入口| 国产成人综合视频| 日本一本视频| 亚洲国产精品成人av| 一区二区三区免费在线看| 国产欧美在线看| 国内精品自线一区二区三区视频| 宅男噜噜噜66国产免费观看| 欧美亚洲综合网| 亚洲伊人精品酒店| 波多野结衣一区二区三区在线观看| 国产乱码精品一区二区三区忘忧草| 午夜电影福利网| 亚洲成人av中文字幕| 中文在线综合| 欧美二区三区| 中文字幕综合网| av资源在线播放| 国产精品第3页| 国产精品性做久久久久久| 日本一区二区三区在线观看视频| 中文日韩电影网站| 日韩视频一区| 快色在线观看| 亚洲精品在线不卡| 欧美一区国产在线| 久久久久久久片| 日韩欧美黄色影院| 日韩精品诱惑一区?区三区| 欧美黑人在线观看| 欧美巨大另类极品videosbest | 黄色漫画在线免费观看| 亚洲成年人在线| 色中色综合网| 男人天堂1024| 91精品国产综合久久婷婷香蕉 | 精品国产一级毛片| 日本男女交配视频| 777a∨成人精品桃花网| 美女毛片一区二区三区四区| wwwwww欧美| 日韩欧美亚洲国产另类| 成人羞羞网站入口免费| 成人在线观看a| 亚洲欧洲激情在线| 久久久人人人| 黄色视屏网站在线免费观看| 日韩免费观看在线观看| 久久久av毛片精品| 女人高潮被爽到呻吟在线观看| 国产九色精品| 韩曰欧美视频免费观看| 久久精品色综合| 免费成人午夜视频| 亚洲精品日韩在线| 久久亚洲风情| 黄色大片在线播放| 99re在线国产| 精品日韩中文字幕| 久久国产成人午夜av影院宅| 国产aa视频| 欧美极品少妇全裸体| av不卡一区二区三区| 欧美精品高清| 在线观看污视频| 亚洲精品午夜精品| 国内精品免费**视频| 咪咪网在线视频| 伊人情人网综合| 日韩精品在线免费播放| 麻豆国产精品视频| 鲁鲁在线中文| 亚洲国产成人精品无码区99| 中文字幕日本欧美| 久久综合九色综合欧美98| 日韩毛片免费看| 日本成人黄色网| 久久久久久久久久久久av| 欧美国产1区2区| 色婷婷狠狠五月综合天色拍 | 国产伦精一区二区三区| 性欧美freesex顶级少妇| 亚洲av首页在线| 国产亚洲激情在线| 91亚洲国产成人精品一区二区三| 国产精品蜜月aⅴ在线| 亚洲国产精品久久久久婷蜜芽| 久久亚洲精品国产亚洲老地址| 久久久久国产精品人| 91精品国产自产精品男人的天堂| 91色国产在线| 国产精品99久久久久久人| 亚洲成a人v欧美综合天堂| 99精品美女| jizz性欧美10| 手机看片日韩国产| 久久久av免费| 亚洲一区在线视频观看| 在线观看一区视频| 中文字幕人成乱码在线观看| 极品美女扒开粉嫩小泬| 日本精品免费一区二区三区| 欧美视频精品一区| 日本不卡的三区四区五区| 欧美日韩va| 在线天堂av| 亚洲高清视频一区| 欧美成人精品一区| 午夜精品久久久久久久久久久| 99国产精品| 综合久久2023| 亚洲一级免费观看| av在线亚洲男人的天堂| 亚洲人成绝费网站色www| 自拍偷拍亚洲欧美日韩| 亚洲精品字幕| 在线成人免费| 三级视频网站在线| 久久久成人精品一区二区三区| 性亚洲最疯狂xxxx高清| 欧美日韩精品电影| 国产亚洲综合在线| 99在线精品视频在线观看| 日韩欧美三区| www.91在线| 日韩精品免费播放| 国产99午夜精品一区二区三区| 中文字幕少妇一区二区三区| 欧美视频国产精品| 99久久精品免费看国产| 亚洲国产日韩欧美一区二区三区| 青青伊人久久| 精品视频二区| 91蝌蚪视频在线观看| 久久综合九色欧美狠狠| 91国产视频在线播放| 亚洲精品永久免费精品| 日本久久一区二区| 国产精品少妇自拍| 国产麻豆成人精品|