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

聊聊操作系統的內存管理

系統 其他OS
brk()的作用也只是通知Linux內核哪個范圍的堆內存是可用的,真正的物理內存頁是在進程實際讀寫內存的時候才會申請,而且是由內核根據寫時復制/需求加載自動完成的,應用程序感知不到這點。

?內存管理,是操作系統的主要功能。

操作系統從啟動一直到創建0號進程(idle進程),運行的大部分代碼都跟內存有關。

操作系統的內存管理,大概分這么幾個層次:

1.物理內存管理

物理內存是電腦上的真實內存大小,這個數據可以通過BIOS獲取。

在分頁之后,物理內存的管理結構是個數組,每項表示1個物理內存頁,每頁4096字節。

如下圖:

物理內存的管理結構

在一個簡單的內核demo里,物理內存頁的管理結構可以只有一項:

atomic_t refs;

即,物理內存頁的引用計數:計數為0表示空閑,> 0表示正在使用,具體數字表示共享這一頁的進程個數。

簡單的內核demo一般是不支持SMP架構的,所以自旋鎖(spinlock)也就省了。

在對稱多處理器(SMP)的CPU上,因為全局數據結構會被多個CPU并發訪問,所以要加自旋鎖。

那么,物理內存頁的管理結構至少有2項:

atomic_t spinlock;
atomic_t refs;

自旋鎖的作用,與應用程序里的鎖(mutex)差不多,只是它在獲取失敗之后會不斷地再次獲取,直到成功。

void spin_lock(atomic_t* lock)
{
while (spin_trylock(lock) == 0);
}

這就是給自旋鎖加鎖的函數,while循環直到成功,不成功時就自旋在那里一直轉圈,所以叫自旋鎖。

它在(對稱多處理器)SMP環境里用于保護共享的數據結構:當一個CPU持有自旋鎖時,另一個CPU沒法訪問共享數據。

如果是單個CPU的環境,沒必要用自旋鎖,直接關閉中斷就行了。

單個CPU的情況下,關了中斷就可以阻止內核的并發,共享數據也就不會被踩踏了。

但多個CPU必須使用自旋鎖,因為關中斷只能關閉當前CPU的,沒法關其他CPU的:這時需要自旋鎖保護共享數據。

物理內存的管理數組,是最重要的全局共享數據。

當需要給一個進程申請內存的時候,哪個內存頁是空閑的,哪個已經被使用了,全靠查看這個數組。

加自旋鎖的時候一定要先關中斷,因為如果在加了鎖之后、關中斷之前、正好有個中斷來了,而在中斷處理函數里再次請求加同一個鎖,那就會遞歸死鎖了。

Linux內核的關中斷加鎖的函數叫:spin_lock_irqsave().

Linux內核的分配物理內存頁的函數叫:get_free_pages(),它可以分配1頁或連續的多頁內存。

如果分配多頁內存的話,起始地址是要按頁數對齊的。

2.虛擬內存管理

虛擬內存都是通過進程的頁表管理的。

為了節省物理內存,新創建的進程是與父進程共享同一套物理內存頁的。

只有新進程要寫某個內存頁時,才會給它復制一份新的物理內存頁,然后取消該頁與父進程的共享,這就是寫時復制。

寫時復制的過程

寫時復制的過程:

1)申請一個新內存頁,

2)把老內存頁的內容,復制到新內存頁上,

3)把新內存頁的地址填入子進程的頁表,

4)把老內存頁的引用計數減1。

所以,新進程剛被創建出來時,它的用戶空間并沒有自己的物理內存頁,只有當運行需要時才一點點地通過寫時復制添加,以讓物理內存最大限度的空閑著。

另一個讓物理內存最大限度空閑著的機制,就是需求加載:

1)當mmap一個文件時,操作系統并不會直接為這個文件分配內存,并且把它的內容加載到內存里,

2)而是當進程真去讀這個文件的某一部分時,才給它申請物理內存頁,并且把這一部分內容從磁盤讀到內存。

copy on write,load on read.

不到火燒眉毛的時候,Linux系統是不會把物理內存給進程的?

3.用戶態的內存函數

以上的這些機制都是OS內核里的,應用程序的代碼不需要管這些。

應用程序分配內存的最底層函數,就是brk()系統調用。

brk()函數

brk()是一個系統調用,它的作用就是修改應用程序的數據段的結尾,從而分配或回收應用程序的堆空間。

brk系統調用的功能

C庫里的把它封裝成了sbrk()和brk()兩個函數,讓它使用起來更符合人們的習慣:

sbrk()用于申請內存:void* sbrk(int increment);

brk()用于回收內存:int brk(void* addr);

實際上,Linux系統只有1個brk()系統調用,它既設置進程數據段的末尾,又會把這個值返回給應用程序。

Linux內核頭文件的sys_brk()函數

Linux內核的頭文件里,brk()系統調用的處理函數sys_brk()是這么定義的,如上圖。

如果想直接使用系統調用,可以使用Linux的syscall()函數,依次傳入調用號和參數列表,就可以看到哪些是真實的系統調用,哪些是C庫的封裝。

syscall()函數的聲明是:long syscall(long number, ...);

它的參數是可變的,系統調用的參數最多只有6個,因為寄存器的個數有限。

在sbrk() 和 brk()的基礎上再封裝,就是人們經常使用的malloc() 和 free()了。

malloc() 申請的內存是一塊塊的,可以不按次序釋放,而不影響使用。

brk() 和 sbrk() 申請的內存必須按次序釋放,因為它會修改進程的數據段結尾:

數據段結尾(brk)之外的堆空間如果被使用,就屬于段錯誤。

所以,Linux man手冊里說明了,應用程序不要用sbrk()和brk()申請和釋放內存。

brk()的作用也只是通知Linux內核哪個范圍的堆內存是可用的,真正的物理內存頁是在進程實際讀寫內存的時候才會申請,而且是由內核根據寫時復制/需求加載自動完成的,應用程序感知不到這點。

Linux還會把不常用的物理內存頁交換到磁盤上(即swap分區),以騰出更多的內存。

所以,在內存不足時,磁盤的讀寫頻次也會升高。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-03-28 13:54:31

操作系統內存管理

2009-08-17 08:32:56

Linux操作系統內存管理Linux

2023-02-26 14:34:18

OSW操作系統監控

2022-09-22 08:06:29

計算機平板微信

2021-06-11 07:26:16

操作系統內存管理Cpu

2025-01-13 00:30:17

2017-05-16 14:31:09

2024-08-28 17:45:00

內存Linux

2021-01-07 07:53:10

JavaScript內存管理

2021-03-26 06:27:08

操作系統應用軟件瀏覽器

2021-08-16 06:56:21

Slice數組類型內存

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操作系統

2023-11-06 08:47:52

操作系統物理內存

2023-06-09 08:06:14

操作系統調度器LLM

2012-08-13 10:19:03

IBMdW

2018-08-09 16:12:59

操作系統內存分配

2022-11-02 07:23:06

點贊
收藏

51CTO技術棧公眾號

噜噜爱69成人精品| 奇米影视四色在线| 黄色福利视频网站| 肉色欧美久久久久久久免费看| 国产成人精品免费视频网站| 亚洲国产精品久久久久久| 国产精品专区一| 91国在线观看| 国产一区二中文字幕在线看| 中文在线播放| 国产精品一级片| 2023亚洲男人天堂| www.26天天久久天堂| 亚洲国产乱码最新视频| 神马影院午夜我不卡| 午夜欧洲一区| 亚洲精品aⅴ中文字幕乱码| 独立日3在线观看完整版| 成人永久aaa| 亚洲一卡二卡三卡四卡无卡网站在线看| 96视频在线观看欧美| 欧美精品一区二区三区四区| 水莓100在线视频| 国产不卡免费视频| 日韩av电影免费在线观看| 青青草国产免费一区二区下载 | 不卡一区视频| 欧美电影免费提供在线观看| 九色视频成人自拍| 色综合久久久久网| 国产福利在线| 日本电影亚洲天堂一区| 日本免费一二区| 国产精品全国免费观看高清 | 欧美被日视频| 一本一本久久a久久精品综合麻豆| 日本午夜免费福利视频| 国产精品色婷婷| 久久久久久久久久久视频| 日韩中文字幕区一区有砖一区| 久99久在线| 麻豆专区一区二区三区四区五区| 亚洲不卡1区| 免费成人av在线| 亚洲第一综合| 久久精品国产亚洲高清剧情介绍 | 黑人精品欧美一区二区蜜桃| 日韩欧美99| 成人不卡免费av| 激情六月天婷婷| 国产蜜臀av在线一区二区三区 | 男人的j进女人的j一区| 亚洲视频电影| 日本一区二区三级电影在线观看 | 欧美综合久久久| 九色porny丨首页在线| 日韩一区二区三区在线观看| 奇米777日韩| 精品中文字幕在线观看| 99成人在线视频| 亚洲永久激情精品| 91社区在线播放| 天海翼一区二区三区四区在线观看| 欧美日韩中文字幕一区二区| 亚洲播播91| 国产精品日本精品| 精彩视频一区二区三区| 国产视色精品亚洲一区二区| 久久看人人摘| 免费一级特黄特色毛片久久看| 亚洲色图在线播放| 五月香视频在线观看| 中文字幕日韩av综合精品| 色狼人综合干| 美女日批免费视频| 欧美xxxx在线观看| 免费久久精品| 岳毛多又紧做起爽| 91麻豆精品国产91久久久久| 国产精品国产| 午夜dv内射一区二区| 精品国产青草久久久久福利| 91精品国产福利在线观看麻豆| 国产欧美在线一区| 精品成人私密视频| 成人午夜av在线| 日韩深夜福利| 羞羞电影在线观看www| 黄网站欧美内射| 成人黄色av网站| 日韩精品www| 亚洲午夜电影在线观看| 蜜臀久久99精品久久久久久9| 九七电影院97理论片久久tvb| 国产精品视频一区二区图片| 国产精品手机视频| 久久九九全国免费精品观看| 亚洲国产欧美在线| 久久精品国产精品亚洲综合| 在线免费看黄网站| 2019最新中文字幕| 中文字幕综合网| 国产精品国产三级国产在线观看 | 77成人影视| 久草在线免费二| 2019中文字幕在线观看| 亚洲综合一二区| 亚洲午夜精品一区 二区 三区| 国产中文字幕在线看| 久草热久草热线频97精品| 精品国产一区二区三区久久久蜜月| 亚洲乱亚洲高清| 国产精欧美一区二区三区蓝颜男同| www.-级毛片线天内射视视| 久久激情视频免费观看| 一区二区三区在线影院| 美国一区二区三区在线播放 | av动漫免费看| 日韩免费观看av| 色拍拍在线精品视频8848| 亚洲一区亚洲| 18国产精品| 麻豆av在线导航| 波多野结衣天堂| 国产精品亚洲综合| 久久精品99久久香蕉国产色戒| 国产农村妇女毛片精品久久麻豆| 国产精品黑丝在线播放| 国产高清不卡| 污污软件在线观看| 国产精品一区二区免费在线观看| 成人免费在线视频网站| 亚洲欧美国产精品| 亚洲一区二区三区不卡国产欧美| 韩国三级在线一区| 亚洲天堂免费| 国产日韩三级| а√天堂中文资源在线bt| 欧美黄色性生活| 国产欧美日韩综合一区在线观看| 国产一级精品aaaaa看| 亚洲一区 在线播放| 人猿泰山h版在线观看| 美女黄视频在线观看| 一区二区三区| 麻豆91精品| 欧美乱大交xxxxx潮喷l头像| 久久国产精品久久久久久| 亚洲一区二区三区精品在线| 日韩精品每日更新| 亚洲尤物在线| 欧美久久成人| 欧美三级在线| 久久久国产精品| 午夜片欧美伦| 国内精品福利| 日韩二区在线观看| 日本大胆欧美人术艺术动态| 午夜亚洲性色福利视频| 日韩精品一二三| 激情综合久久| 中文字幕一区二区三区乱码图片| 欧美裸体在线版观看完整版| 国产一区二区三区视频在线| 最新欧美电影| 日韩成人a**站| 亚洲高清久久| 日日夜夜一区二区| 精品亚洲国产成人av制服丝袜| 丁香婷婷深情五月亚洲| 欧美精彩视频一区二区三区| 亚洲欧美一区二区不卡| 欧美在线影院一区二区| 天天免费综合色| 日韩精品一区在线| 国产亚洲xxx| 国语自产精品视频在线看| 久久精品男人天堂| 国产精品成人一区二区三区吃奶| 亚洲精品免费一区二区三区| 欧美激情导航| 男女啪啪免费视频网站| 亚洲一级免费在线观看| 国产成免费视频| 色操视频在线| 日韩欧乱色一区二区三区在线| 91欧美在线| 日本不卡免费在线视频| 亚洲欧洲色图综合| 91sao在线观看国产| 激情亚洲综合网| 日韩视频在线观看| 欧美蜜桃一区二区三区| 人人妻人人澡人人爽精品欧美一区| 蜜桃视频在线观看免费视频| 老妇喷水一区二区三区| 亚洲福利在线观看| 丝袜人妻一区二区三区| 北条麻妃在线一区二区免费播放 | 日韩免费av片在线观看|