精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇讀懂Linux 是如何管理內(nèi)存的

新聞 Linux
每個(gè) Linux 進(jìn)程都會(huì)有地址空間,這些地址空間由三個(gè)段區(qū)域組成:text 段、data 段、stack 段。下面是進(jìn)程地址空間的示例。

基本概念

每個(gè) Linux 進(jìn)程都會(huì)有地址空間,這些地址空間由三個(gè)段區(qū)域組成:text 段、data 段、stack 段。下面是進(jìn)程地址空間的示例。

Linux 如何管理內(nèi)存

數(shù)據(jù)段(data segment) 包含了程序的變量、字符串、數(shù)組和其他數(shù)據(jù)的存儲(chǔ)。數(shù)據(jù)段分為兩部分,已經(jīng)初始化的數(shù)據(jù)和尚未初始化的數(shù)據(jù)。其中尚未初始化的數(shù)據(jù)就是我們說(shuō)的 BSS。數(shù)據(jù)段部分的初始化需要編譯就期確定的常量以及程序啟動(dòng)就需要一個(gè)初始值的變量。所有 BSS 部分中的變量在加載后被初始化為 0 。

和代碼段(Text segment) 不一樣,data segment 數(shù)據(jù)段可以改變。程序總是修改它的變量。而且,許多程序需要在執(zhí)行時(shí)動(dòng)態(tài)分配空間。Linux 允許數(shù)據(jù)段隨著內(nèi)存的分配和回收從而增大或者減小。為了分配內(nèi)存,程序可以增加數(shù)據(jù)段的大小。在 C 語(yǔ)言中有一套標(biāo)準(zhǔn)庫(kù) malloc經(jīng)常用于分配內(nèi)存。進(jìn)程地址空間描述符包含動(dòng)態(tài)分配的內(nèi)存區(qū)域稱為 堆(heap)。

第三部分段是 棧段(stack segment)。在大部分機(jī)器上,棧段會(huì)在虛擬內(nèi)存地址頂部地址位置處,并向低位置處(向地址空間為 0 處)拓展。舉個(gè)例子來(lái)說(shuō),在 32 位 x86 架構(gòu)的機(jī)器上,棧開始于 0xC0000000,這是用戶模式下進(jìn)程允許可見的 3GB 虛擬地址限制。如果棧一直增大到超過(guò)棧段后,就會(huì)發(fā)生硬件故障并把頁(yè)面下降一個(gè)頁(yè)面。

當(dāng)程序啟動(dòng)時(shí),棧區(qū)域并不是空的,相反,它會(huì)包含所有的 shell 環(huán)境變量以及為了調(diào)用它而向 shell 輸入的命令行。舉個(gè)例子,當(dāng)你輸入

cp cxuan lx

時(shí),cp 程序會(huì)運(yùn)行并在棧中帶著字符串 cp cxuan lx ,這樣就能夠找出源文件和目標(biāo)文件的名稱。

當(dāng)兩個(gè)用戶運(yùn)行在相同程序中,例如編輯器(editor),那么就會(huì)在內(nèi)存中保持編輯器程序代碼的兩個(gè)副本,但是這種方式并不高效。Linux 系統(tǒng)支持共享文本段作為替代。下面圖中我們會(huì)看到 A 和 B 兩個(gè)進(jìn)程,它們有著相同的文本區(qū)域。

Linux 如何管理內(nèi)存

數(shù)據(jù)段和棧段只有在 fork 之后才會(huì)共享,共享也是共享未修改過(guò)的頁(yè)面。如果任何一個(gè)都需要變大但是沒(méi)有相鄰空間容納的話,也不會(huì)有問(wèn)題,因?yàn)橄噜彽奶摂M頁(yè)面不必映射到相鄰的物理頁(yè)面上。

除了動(dòng)態(tài)分配更多的內(nèi)存,Linux 中的進(jìn)程可以通過(guò)內(nèi)存映射文件來(lái)訪問(wèn)文件數(shù)據(jù)。這個(gè)特性可以使我們把一個(gè)文件映射到進(jìn)程空間的一部分而該文件就可以像位于內(nèi)存中的字節(jié)數(shù)組一樣被讀寫。把一個(gè)文件映射進(jìn)來(lái)使得隨機(jī)讀寫比使用 read 和 write 之類的 I/O 系統(tǒng)調(diào)用要容易得多。共享庫(kù)的訪問(wèn)就是使用了這種機(jī)制。如下所示

Linux 如何管理內(nèi)存

我們可以看到兩個(gè)相同文件會(huì)被映射到相同的物理地址上,但是它們屬于不同的地址空間。

映射文件的優(yōu)點(diǎn)是,兩個(gè)或多個(gè)進(jìn)程可以同時(shí)映射到同一文件中,任意一個(gè)進(jìn)程對(duì)文件的寫操作對(duì)其他文件可見。通過(guò)使用映射臨時(shí)文件的方式,可以為多線程共享內(nèi)存提供高帶寬,臨時(shí)文件在進(jìn)程退出后消失。但是實(shí)際上,并沒(méi)有兩個(gè)相同的地址空間,因?yàn)槊總€(gè)進(jìn)程維護(hù)的打開文件和信號(hào)不同。

Linux 內(nèi)存管理系統(tǒng)調(diào)用

下面我們探討一下關(guān)于內(nèi)存管理的系統(tǒng)調(diào)用方式。事實(shí)上,POSIX 并沒(méi)有給內(nèi)存管理指定任何的系統(tǒng)調(diào)用。然而,Linux 卻有自己的內(nèi)存系統(tǒng)調(diào)用,主要系統(tǒng)調(diào)用如下

Linux 如何管理內(nèi)存

如果遇到錯(cuò)誤,那么 s 的返回值是 -1,a 和 addr 是內(nèi)存地址,len 表示的是長(zhǎng)度,prot 表示的是控制保護(hù)位,flags 是其他標(biāo)志位,fd 是文件描述符,offset 是文件偏移量。

brk 通過(guò)給出超過(guò)數(shù)據(jù)段之外的第一個(gè)字節(jié)地址來(lái)指定數(shù)據(jù)段的大小。如果新的值要比原來(lái)的大,那么數(shù)據(jù)區(qū)會(huì)變得越來(lái)越大,反之會(huì)越來(lái)越小。

mmap 和 unmap 系統(tǒng)調(diào)用會(huì)控制映射文件。mmp 的第一個(gè)參數(shù) addr 決定了文件映射的地址。它必須是頁(yè)面大小的倍數(shù)。如果參數(shù)是 0,系統(tǒng)會(huì)分配地址并返回 a。第二個(gè)參數(shù)是長(zhǎng)度,它告訴了需要映射多少字節(jié)。它也是頁(yè)面大小的倍數(shù)。prot 決定了映射文件的保護(hù)位,保護(hù)位可以標(biāo)記為 可讀、可寫、可執(zhí)行或者這些的結(jié)合。第四個(gè)參數(shù) flags 能夠控制文件是私有的還是可讀的以及 addr 是必須的還是只是進(jìn)行提示。第五個(gè)參數(shù) fd 是要映射的文件描述符。只有打開的文件是可以被映射的,因此如果想要進(jìn)行文件映射,必須打開文件;最后一個(gè)參數(shù) offset 會(huì)指示文件從什么時(shí)候開始,并不一定每次都要從零開始。

Linux 內(nèi)存管理實(shí)現(xiàn)

內(nèi)存管理系統(tǒng)是操作系統(tǒng)最重要的部分之一。從計(jì)算機(jī)早期開始,我們實(shí)際使用的內(nèi)存都要比系統(tǒng)中實(shí)際存在的內(nèi)存多。內(nèi)存分配策略克服了這一限制,并且其中最有名的就是 虛擬內(nèi)存(virtual memory)。通過(guò)在多個(gè)競(jìng)爭(zhēng)的進(jìn)程之間共享虛擬內(nèi)存,虛擬內(nèi)存得以讓系統(tǒng)有更多的內(nèi)存。虛擬內(nèi)存子系統(tǒng)主要包括下面這些概念。

大地址空間

操作系統(tǒng)使系統(tǒng)使用起來(lái)好像比實(shí)際的物理內(nèi)存要大很多,那是因?yàn)樘摂M內(nèi)存要比物理內(nèi)存大很多倍。

保護(hù)

系統(tǒng)中的每個(gè)進(jìn)程都會(huì)有自己的虛擬地址空間。這些虛擬地址空間彼此完全分開,因此運(yùn)行一個(gè)應(yīng)用程序的進(jìn)程不會(huì)影響另一個(gè)。并且,硬件虛擬內(nèi)存機(jī)制允許內(nèi)存保護(hù)關(guān)鍵內(nèi)存區(qū)域。

內(nèi)存映射

內(nèi)存映射用來(lái)向進(jìn)程地址空間映射圖像和數(shù)據(jù)文件。在內(nèi)存映射中,文件的內(nèi)容直接映射到進(jìn)程的虛擬空間中。

公平的物理內(nèi)存分配

內(nèi)存管理子系統(tǒng)允許系統(tǒng)中的每個(gè)正在運(yùn)行的進(jìn)程公平分配系統(tǒng)的物理內(nèi)存。

共享虛擬內(nèi)存

盡管虛擬內(nèi)存讓進(jìn)程有自己的內(nèi)存空間,但是有的時(shí)候你是需要共享內(nèi)存的。例如幾個(gè)進(jìn)程同時(shí)在 shell 中運(yùn)行,這會(huì)涉及到 IPC 的進(jìn)程間通信問(wèn)題,這個(gè)時(shí)候你需要的是共享內(nèi)存來(lái)進(jìn)行信息傳遞而不是通過(guò)拷貝每個(gè)進(jìn)程的副本獨(dú)立運(yùn)行。

下面我們就正式探討一下什么是 虛擬內(nèi)存

虛擬內(nèi)存的抽象模型

在考慮 Linux 用于支持虛擬內(nèi)存的方法之前,考慮一個(gè)不會(huì)被太多細(xì)節(jié)困擾的抽象模型是很有用的。

處理器在執(zhí)行指令時(shí),會(huì)從內(nèi)存中讀取指令并將其解碼(decode),在指令解碼時(shí)會(huì)獲取某個(gè)位置的內(nèi)容并將他存到內(nèi)存中。然后處理器繼續(xù)執(zhí)行下一條指令。這樣,處理器總是在訪問(wèn)存儲(chǔ)器以獲取指令和存儲(chǔ)數(shù)據(jù)。

在虛擬內(nèi)存系統(tǒng)中,所有的地址空間都是虛擬的而不是物理的。但是實(shí)際存儲(chǔ)和提取指令的是物理地址,所以需要讓處理器根據(jù)操作系統(tǒng)維護(hù)的一張表將虛擬地址轉(zhuǎn)換為物理地址。

為了簡(jiǎn)單的完成轉(zhuǎn)換,虛擬地址和物理地址會(huì)被分為固定大小的塊,稱為 頁(yè)(page)。這些頁(yè)有相同大小,如果頁(yè)面大小不一樣的話,那么操作系統(tǒng)將很難管理。Alpha AXP系統(tǒng)上的 Linux 使用 8 KB 頁(yè)面,而 Intel x86 系統(tǒng)上的 Linux 使用 4 KB 頁(yè)面。每個(gè)頁(yè)面都有一個(gè)唯一的編號(hào),即頁(yè)面框架號(hào)(PFN)。

Linux 如何管理內(nèi)存

上面就是 Linux 內(nèi)存映射模型了,在這個(gè)頁(yè)模型中,虛擬地址由兩部分組成:偏移量和虛擬頁(yè)框號(hào)。每次處理器遇到虛擬地址時(shí)都會(huì)提取偏移量和虛擬頁(yè)框號(hào)。處理器必須將虛擬頁(yè)框號(hào)轉(zhuǎn)換為物理頁(yè)號(hào),然后以正確的偏移量的位置訪問(wèn)物理頁(yè)。

上圖中展示了兩個(gè)進(jìn)程 A 和 B 的虛擬地址空間,每個(gè)進(jìn)程都有自己的頁(yè)表。這些頁(yè)表將進(jìn)程中的虛擬頁(yè)映射到內(nèi)存中的物理頁(yè)中。頁(yè)表中每一項(xiàng)均包含

  • 有效標(biāo)志(valid flag) :表明此頁(yè)表?xiàng)l目是否有效
  • 該條目描述的物理頁(yè)框號(hào)
  • 訪問(wèn)控制信息,頁(yè)面使用方式,是否可寫以及是否可以執(zhí)行代碼

要將處理器的虛擬地址映射為內(nèi)存的物理地址,首先需要計(jì)算虛擬地址的頁(yè)框號(hào)和偏移量。頁(yè)面大小為 2 的次冪,可以通過(guò)移位完成操作。

如果當(dāng)前進(jìn)程嘗試訪問(wèn)虛擬地址,但是訪問(wèn)不到的話,這種情況稱為 缺頁(yè)異常,此時(shí)虛擬操作系統(tǒng)的錯(cuò)誤地址和頁(yè)面錯(cuò)誤的原因?qū)⑼ㄖ僮飨到y(tǒng)。

通過(guò)以這種方式將虛擬地址映射到物理地址,虛擬內(nèi)存可以以任何順序映射到系統(tǒng)的物理頁(yè)面。

按需分頁(yè)

由于物理內(nèi)存要比虛擬內(nèi)存少很多,因此操作系統(tǒng)需要注意盡量避免直接使用低效的物理內(nèi)存。節(jié)省物理內(nèi)存的一種方式是僅加載執(zhí)行程序當(dāng)前使用的頁(yè)面(這何嘗不是一種懶加載的思想呢?)。例如,可以運(yùn)行數(shù)據(jù)庫(kù)來(lái)查詢數(shù)據(jù)庫(kù),在這種情況下,不是所有的數(shù)據(jù)都裝入內(nèi)存,只裝載需要檢查的數(shù)據(jù)。這種僅僅在需要時(shí)才將虛擬頁(yè)面加載進(jìn)內(nèi)中的技術(shù)稱為按需分頁(yè)。

交換

如果某個(gè)進(jìn)程需要將虛擬頁(yè)面?zhèn)魅雰?nèi)存,但是此時(shí)沒(méi)有可用的物理頁(yè)面,那么操作系統(tǒng)必須丟棄物理內(nèi)存中的另一個(gè)頁(yè)面來(lái)為該頁(yè)面騰出空間。

如果頁(yè)面已經(jīng)修改過(guò),那么操作系統(tǒng)必須保留該頁(yè)面的內(nèi)容,以便以后可以訪問(wèn)它。這種類型的頁(yè)面被稱為臟頁(yè),當(dāng)將其從內(nèi)存中移除時(shí),它會(huì)保存在稱為交換文件的特殊文件中。相對(duì)于處理器和物理內(nèi)存的速度,對(duì)交換文件的訪問(wèn)非常慢,并且操作系統(tǒng)需要兼顧將頁(yè)面寫到磁盤的以及將它們保留在內(nèi)存中以便再次使用。

Linux 使用最近最少使用(LRU)頁(yè)面老化技術(shù)來(lái)公平的選擇可能會(huì)從系統(tǒng)中刪除的頁(yè)面,這個(gè)方案涉及系統(tǒng)中的每個(gè)頁(yè)面,頁(yè)面的年齡隨著訪問(wèn)次數(shù)的變化而變化,如果某個(gè)頁(yè)面訪問(wèn)次數(shù)多,那么該頁(yè)就表示越 年輕,如果某個(gè)呃頁(yè)面訪問(wèn)次數(shù)太少,那么該頁(yè)越容易被換出。

物理和虛擬尋址模式

大多數(shù)多功能處理器都支持 物理地址模式和虛擬地址模式的概念。物理尋址模式不需要頁(yè)表,并且處理器不會(huì)在此模式下嘗試執(zhí)行任何地址轉(zhuǎn)換。Linux 內(nèi)核被鏈接在物理地址空間中運(yùn)行。

Alpha AXP 處理器沒(méi)有物理尋址模式。相反,它將內(nèi)存空間劃分為幾個(gè)區(qū)域,并將其中兩個(gè)指定為物理映射的地址。此內(nèi)核地址空間稱為 KSEG 地址空間,它包含從 0xfffffc0000000000 向上的所有地址。為了從 KSEG 中鏈接的代碼(按照定義,內(nèi)核代碼)執(zhí)行或訪問(wèn)其中的數(shù)據(jù),該代碼必須在內(nèi)核模式下執(zhí)行。鏈接到 Alpha 上的 Linux內(nèi)核以從地址 0xfffffc0000310000 執(zhí)行。

訪問(wèn)控制

頁(yè)面表的每一項(xiàng)還包含訪問(wèn)控制信息,訪問(wèn)控制信息主要檢查進(jìn)程是否應(yīng)該訪問(wèn)內(nèi)存。

必要時(shí)需要對(duì)內(nèi)存進(jìn)行訪問(wèn)限制。例如包含可執(zhí)行代碼的內(nèi)存,自然是只讀內(nèi)存;操作系統(tǒng)不應(yīng)允許進(jìn)程通過(guò)其可執(zhí)行代碼寫入數(shù)據(jù)。相比之下,包含數(shù)據(jù)的頁(yè)面可以被寫入,但是嘗試執(zhí)行該內(nèi)存的指令將失敗。大多數(shù)處理器至少具有兩種執(zhí)行模式:內(nèi)核態(tài)和用戶態(tài)。你不希望訪問(wèn)用戶執(zhí)行內(nèi)核代碼或內(nèi)核數(shù)據(jù)結(jié)構(gòu),除非處理器以內(nèi)核模式運(yùn)行。

Linux 如何管理內(nèi)存

訪問(wèn)控制信息被保存在上面的 Page Table Entry ,頁(yè)表項(xiàng)中,上面這幅圖是 Alpha AXP的 PTE。位字段具有以下含義

  • V

表示 valid ,是否有效位

  • FOR

讀取時(shí)故障,在嘗試讀取此頁(yè)面時(shí)出現(xiàn)故障

  • FOW

寫入時(shí)錯(cuò)誤,在嘗試寫入時(shí)發(fā)生錯(cuò)誤

  • FOE

執(zhí)行時(shí)發(fā)生錯(cuò)誤,在嘗試執(zhí)行此頁(yè)面中的指令時(shí),處理器都會(huì)報(bào)告頁(yè)面錯(cuò)誤并將控制權(quán)傳遞給操作系統(tǒng),

  • ASM

地址空間匹配,當(dāng)操作系統(tǒng)希望清除轉(zhuǎn)換緩沖區(qū)中的某些條目時(shí),將使用此選項(xiàng)。

  • GH

當(dāng)在使用單個(gè)轉(zhuǎn)換緩沖區(qū)條目而不是多個(gè)轉(zhuǎn)換緩沖區(qū)條目映射整個(gè)塊時(shí)使用的提示。

  • KRE

內(nèi)核模式運(yùn)行下的代碼可以讀取頁(yè)面

  • URE

用戶模式下的代碼可以讀取頁(yè)面

  • KWE

以內(nèi)核模式運(yùn)行的代碼可以寫入頁(yè)面

  • UWE

以用戶模式運(yùn)行的代碼可以寫入頁(yè)面

  • 頁(yè)框號(hào)

對(duì)于設(shè)置了 V 位的 PTE,此字段包含此 PTE 的物理頁(yè)面幀號(hào)(頁(yè)面幀號(hào))。對(duì)于無(wú)效的 PTE,如果此字段不為零,則包含有關(guān)頁(yè)面在交換文件中的位置的信息。

除此之外,Linux 還使用了兩個(gè)位

  • _PAGE_DIRTY

如果已設(shè)置,則需要將頁(yè)面寫出到交換文件中

  • _PAGE_ACCESSED

Linux 用來(lái)將頁(yè)面標(biāo)記為已訪問(wèn)。

緩存

上面的虛擬內(nèi)存抽象模型可以用來(lái)實(shí)施,但是效率不會(huì)太高。操作系統(tǒng)和處理器設(shè)計(jì)人員都嘗試提高性能。但是除了提高處理器,內(nèi)存等的速度之外,最好的方法就是維護(hù)有用信息和數(shù)據(jù)的高速緩存,從而使某些操作更快。在 Linux 中,使用很多和內(nèi)存管理有關(guān)的緩沖區(qū),使用緩沖區(qū)來(lái)提高效率。

緩沖區(qū)緩存

緩沖區(qū)高速緩存包含塊設(shè)備驅(qū)動(dòng)程序使用的數(shù)據(jù)緩沖區(qū)。

還記得什么是塊設(shè)備么?這里回顧下

塊設(shè)備是一個(gè)能存儲(chǔ)固定大小塊信息的設(shè)備,它支持以固定大小的塊,扇區(qū)或群集讀取和(可選)寫入數(shù)據(jù)。每個(gè)塊都有自己的物理地址。通常塊的大小在 512 - 65536 之間。所有傳輸?shù)男畔⒍紩?huì)以連續(xù)的塊為單位。塊設(shè)備的基本特征是每個(gè)塊都較為對(duì)立,能夠獨(dú)立的進(jìn)行讀寫。常見的塊設(shè)備有 硬盤、藍(lán)光光盤、USB 盤

與字符設(shè)備相比,塊設(shè)備通常需要較少的引腳。

Linux 如何管理內(nèi)存

緩沖區(qū)高速緩存通過(guò)設(shè)備標(biāo)識(shí)符和塊編號(hào)用于快速查找數(shù)據(jù)塊。如果可以在緩沖區(qū)高速緩存中找到數(shù)據(jù),則無(wú)需從物理塊設(shè)備中讀取數(shù)據(jù),這種訪問(wèn)方式要快得多。

頁(yè)緩存

頁(yè)緩存用于加快對(duì)磁盤上圖像和數(shù)據(jù)的訪問(wèn)

它用于一次一頁(yè)地緩存文件中的內(nèi)容,并且可以通過(guò)文件和文件中的偏移量進(jìn)行訪問(wèn)。當(dāng)頁(yè)面從磁盤讀入內(nèi)存時(shí),它們被緩存在頁(yè)面緩存中。

交換區(qū)緩存

僅僅已修改(臟頁(yè))被保存在交換文件中

只要這些頁(yè)面在寫入交換文件后沒(méi)有修改,則下次交換該頁(yè)面時(shí),無(wú)需將其寫入交換文件,因?yàn)樵擁?yè)面已在交換文件中。可以直接丟棄。在大量交換的系統(tǒng)中,這節(jié)省了許多不必要的和昂貴的磁盤操作。

硬件緩存

處理器中通常使用一種硬件緩存。頁(yè)表?xiàng)l目的緩存。在這種情況下,處理器并不總是直接讀取頁(yè)表,而是根據(jù)需要緩存頁(yè)的翻譯。這些是轉(zhuǎn)換后備緩沖區(qū) 也被稱為 TLB,包含來(lái)自系統(tǒng)中一個(gè)或多個(gè)進(jìn)程的頁(yè)表項(xiàng)的緩存副本。

引用虛擬地址后,處理器將嘗試查找匹配的 TLB 條目。如果找到,則可以將虛擬地址直接轉(zhuǎn)換為物理地址,并對(duì)數(shù)據(jù)執(zhí)行正確的操作。如果處理器找不到匹配的 TLB 條目, 它通過(guò)向操作系統(tǒng)發(fā)信號(hào)通知已發(fā)生 TLB 丟失獲得操作系統(tǒng)的支持和幫助。系統(tǒng)特定的機(jī)制用于將該異常傳遞給可以修復(fù)問(wèn)題的操作系統(tǒng)代碼。操作系統(tǒng)為地址映射生成一個(gè)新的 TLB 條目。清除異常后,處理器將再次嘗試轉(zhuǎn)換虛擬地址。這次能夠執(zhí)行成功。

使用緩存也存在缺點(diǎn),為了節(jié)省精力,Linux 必須使用更多的時(shí)間和空間來(lái)維護(hù)這些緩存,并且如果緩存損壞,系統(tǒng)將會(huì)崩潰。

Linux 頁(yè)表

Linux 假定頁(yè)表分為三個(gè)級(jí)別。訪問(wèn)的每個(gè)頁(yè)表都包含下一級(jí)頁(yè)表

Linux 如何管理內(nèi)存

圖中的 PDG 表示全局頁(yè)表,當(dāng)創(chuàng)建一個(gè)新的進(jìn)程時(shí),都要為新進(jìn)程創(chuàng)建一個(gè)新的頁(yè)面目錄,即 PGD。

要將虛擬地址轉(zhuǎn)換為物理地址,處理器必須獲取每個(gè)級(jí)別字段的內(nèi)容,將其轉(zhuǎn)換為包含頁(yè)表的物理頁(yè)的偏移量,并讀取下一級(jí)頁(yè)表的頁(yè)框號(hào)。這樣重復(fù)三次,直到找到包含虛擬地址的物理頁(yè)面的頁(yè)框號(hào)為止。

Linux 運(yùn)行的每個(gè)平臺(tái)都必須提供翻譯宏,這些宏允許內(nèi)核遍歷特定進(jìn)程的頁(yè)表。這樣,內(nèi)核無(wú)需知道頁(yè)表?xiàng)l目的格式或它們的排列方式。

頁(yè)分配和取消分配

對(duì)系統(tǒng)中物理頁(yè)面有很多需求。例如,當(dāng)圖像加載到內(nèi)存中時(shí),操作系統(tǒng)需要分配頁(yè)面。

系統(tǒng)中所有物理頁(yè)面均由 mem_map 數(shù)據(jù)結(jié)構(gòu)描述,這個(gè)數(shù)據(jù)結(jié)構(gòu)是 mem_map_t 的列表。它包括一些重要的屬性

  • count :這是頁(yè)面的用戶數(shù)計(jì)數(shù),當(dāng)頁(yè)面在多個(gè)進(jìn)程之間共享時(shí),計(jì)數(shù)大于 1
  • age:這是描述頁(yè)面的年齡,用于確定頁(yè)面是否適合丟棄或交換
  • map_nr :這是此mem_map_t描述的物理頁(yè)框號(hào)。

頁(yè)面分配代碼使用 free_area向量查找和釋放頁(yè)面,free_area 的每個(gè)元素都包含有關(guān)頁(yè)面塊的信息。

頁(yè)面分配

Linux 的頁(yè)面分配使用一種著名的伙伴算法來(lái)進(jìn)行頁(yè)面的分配和取消分配。頁(yè)面以 2 的冪為單位進(jìn)行塊分配。這就意味著它可以分配 1頁(yè)、2 頁(yè)、4頁(yè)等等,只要系統(tǒng)中有足夠可用的頁(yè)面來(lái)滿足需求就可以。判斷的標(biāo)準(zhǔn)是nr_free_pages> min_free_pages,如果滿足,就會(huì)在 free_area 中搜索所需大小的頁(yè)面塊完成分配。free_area 的每個(gè)元素都有該大小的塊的已分配頁(yè)面和空閑頁(yè)面塊的映射。

分配算法會(huì)搜索請(qǐng)求大小的頁(yè)面塊。如果沒(méi)有任何請(qǐng)求大小的頁(yè)面塊可用的話,會(huì)搜尋一個(gè)是請(qǐng)求大小二倍的頁(yè)面塊,然后重復(fù),直到一直搜尋完 free_area 找到一個(gè)頁(yè)面塊為止。如果找到的頁(yè)面塊要比請(qǐng)求的頁(yè)面塊大,就會(huì)對(duì)找到的頁(yè)面塊進(jìn)行細(xì)分,直到找到合適的大小塊為止。

因?yàn)槊總€(gè)塊都是 2 的次冪,所以拆分過(guò)程很容易,因?yàn)槟阒恍鑼K分成兩半即可。空閑塊在適當(dāng)?shù)年?duì)列中排隊(duì),分配的頁(yè)面塊返回給調(diào)用者。

Linux 如何管理內(nèi)存

如果請(qǐng)求一個(gè) 2 個(gè)頁(yè)的塊,則 4 頁(yè)的第一個(gè)塊(從第 4 頁(yè)的框架開始)將被分成兩個(gè) 2 頁(yè)的塊。第一個(gè)頁(yè)面(從第 4 頁(yè)的幀開始)將作為分配的頁(yè)面返回給調(diào)用方,第二個(gè)塊(從第 6 頁(yè)的頁(yè)面開始)將作為 2 頁(yè)的空閑塊排隊(duì)到 free_area 數(shù)組的元素 1 上。

頁(yè)面取消分配

上面的這種內(nèi)存方式最造成一種后果,那就是內(nèi)存的碎片化,會(huì)將較大的空閑頁(yè)面分成較小的頁(yè)面。頁(yè)面解除分配代碼會(huì)盡可能將頁(yè)面重新組合成為更大的空閑塊。每釋放一個(gè)頁(yè)面,都會(huì)檢查相同大小的相鄰的塊,以查看是否空閑。如果是,則將其與新釋放的頁(yè)面塊組合以形成下一個(gè)頁(yè)面大小塊的新的自由頁(yè)面塊。每次將兩個(gè)頁(yè)面塊重新組合為更大的空閑頁(yè)面塊時(shí),頁(yè)面釋放代碼就會(huì)嘗試將該頁(yè)面塊重新組合為更大的空閑頁(yè)面。通過(guò)這種方式,可用頁(yè)面的塊將盡可能多地使用內(nèi)存。

例如上圖,如果要釋放第 1 頁(yè)的頁(yè)面,則將其與已經(jīng)空閑的第 0 頁(yè)頁(yè)面框架組合在一起,并作為大小為 2頁(yè)的空閑塊排隊(duì)到 free_area 的元素 1 中

內(nèi)存映射

內(nèi)核有兩種類型的內(nèi)存映射:共享型(shared)和私有型(private)。私有型是當(dāng)進(jìn)程為了只讀文件,而不寫文件時(shí)使用,這時(shí),私有映射更加高效。但是,任何對(duì)私有映射頁(yè)的寫操作都會(huì)導(dǎo)致內(nèi)核停止映射該文件中的頁(yè)。所以,寫操作既不會(huì)改變磁盤上的文件,對(duì)訪問(wèn)該文件的其它進(jìn)程也是不可見的。

按需分頁(yè)

一旦可執(zhí)行映像被內(nèi)存映射到虛擬內(nèi)存后,它就可以被執(zhí)行了。因?yàn)橹粚⒂诚竦拈_頭部分物理的拉入到內(nèi)存中,因此它將很快訪問(wèn)物理內(nèi)存尚未存在的虛擬內(nèi)存區(qū)域。當(dāng)進(jìn)程訪問(wèn)沒(méi)有有效頁(yè)表的虛擬地址時(shí),操作系統(tǒng)會(huì)報(bào)告這項(xiàng)錯(cuò)誤。

頁(yè)面錯(cuò)誤描述頁(yè)面出錯(cuò)的虛擬地址和引起的內(nèi)存訪問(wèn)(RAM)類型。

Linux 必須找到代表發(fā)生頁(yè)面錯(cuò)誤的內(nèi)存區(qū)域的 vm_area_struct 結(jié)構(gòu)。由于搜索 vm_area_struct 數(shù)據(jù)結(jié)構(gòu)對(duì)于有效處理頁(yè)面錯(cuò)誤至關(guān)重要,因此它們以 AVL(Adelson-Velskii和Landis)樹結(jié)構(gòu)鏈接在一起。如果引起故障的虛擬地址沒(méi)有 vm_area_struct 結(jié)構(gòu),則此進(jìn)程已經(jīng)訪問(wèn)了非法地址,Linux 會(huì)向進(jìn)程發(fā)出 SIGSEGV 信號(hào),如果進(jìn)程沒(méi)有用于該信號(hào)的處理程序,那么進(jìn)程將會(huì)終止。

然后,Linux 會(huì)針對(duì)此虛擬內(nèi)存區(qū)域所允許的訪問(wèn)類型,檢查發(fā)生的頁(yè)面錯(cuò)誤類型。如果該進(jìn)程以非法方式訪問(wèn)內(nèi)存,例如寫入僅允許讀的區(qū)域,則還會(huì)發(fā)出內(nèi)存訪問(wèn)錯(cuò)誤信號(hào)。

現(xiàn)在,Linux 已確定頁(yè)面錯(cuò)誤是合法的,因此必須對(duì)其進(jìn)行處理。

 

責(zé)任編輯:張燕妮 來(lái)源: 今日頭條
相關(guān)推薦

2019-07-09 14:17:28

Linux內(nèi)存管理進(jìn)程

2020-07-28 08:10:33

Linux內(nèi)存虛擬

2023-05-05 06:39:52

Java工廠設(shè)計(jì)模式

2022-07-07 12:01:43

ATTCALDERA框架

2019-06-18 08:13:47

內(nèi)網(wǎng)公網(wǎng)NAT

2023-06-26 00:26:40

I/OJava字節(jié)流

2023-11-20 10:11:05

集群節(jié)點(diǎn)Kubernetes

2019-09-24 14:19:12

PythonC語(yǔ)言文章

2017-06-08 22:41:34

框架標(biāo)簽

2016-09-25 14:09:50

bug報(bào)告bug故障

2016-03-30 09:54:59

bug報(bào)告開發(fā)

2019-04-09 11:07:15

HTTPS加密安全

2023-11-28 08:29:31

Rust內(nèi)存布局

2020-04-22 13:27:20

數(shù)據(jù)分析模塊解決

2018-04-09 16:35:10

數(shù)據(jù)庫(kù)MySQLInnoDB

2021-05-09 09:06:24

Python批處理命令

2021-10-18 10:54:48

.NET內(nèi)存管理

2017-09-04 13:44:00

Java

2019-05-07 11:57:26

分布式架構(gòu)負(fù)載均衡

2015-10-22 14:32:44

微服務(wù)PaaS應(yīng)用開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品视频大全| 国产小视频国产精品| 欧美精品久久久久久久久久久| 成 人片 黄 色 大 片| 最新亚洲一区| 在线观看视频99| 韩国三级在线播放| 天堂中文在线播放| 国产精品乱子久久久久| 国产精品成人观看视频免费| 国语对白做受69按摩| 一区二区三区在线| 亚洲美女精品成人在线视频| 97人人爽人人| xxx欧美xxx| 亚洲精品乱码久久久久| 日产中文字幕在线精品一区| 精品人妻无码一区二区| 日韩激情在线观看| 欧美精品久久久久a| 人与嘼交av免费| 久9re热视频这里只有精品| 欧美日韩中文国产| 无码人妻丰满熟妇区96| 午夜小视频福利在线观看| 久久精品男人天堂av| 91日韩久久| 伊人成人在线观看| 亚洲欧美日韩一区在线观看| 九九热最新视频//这里只有精品 | 久久精品九色| 在线日韩av片| 欧美v在线观看| 免费毛片在线看片免费丝瓜视频| 国产精品美女久久久久久久久| 精品国产电影| 亚洲精品网站在线| 国产精品一二三区在线| 成人福利视频网| 中文字幕一区二区三区人妻四季 | 久久久久久久久久一区二区| 欧美91看片特黄aaaa| 亚洲主播在线播放| 欧美 国产 精品| 快射视频在线观看| 国产精品女人毛片| 亚洲乱码国产乱码精品天美传媒| 美丽的姑娘在线观看免费动漫| 成人免费不卡视频| av色综合网| 国产黄色片免费观看| 极品销魂美女一区二区三区| 国产精品久久久久久久久久久新郎 | 欧美一级在线播放| 国产精品久久久久久99| 日韩视频一区| 97视频com| 日韩xxxxxxxxx| 亚洲激情自拍| 77777少妇光屁股久久一区| 久久精品欧美一区二区| 国产精品videossex久久发布| 欧美乱大交xxxxx| 久久久久久久中文字幕| 亚洲午夜黄色| 91国产精品电影| 91午夜视频在线观看| 亚洲欧美日韩精品一区二区 | 日本污视频在线观看| 影音先锋亚洲精品| 91产国在线观看动作片喷水| 午夜婷婷在线观看| 日本va欧美va欧美va精品| 国产精品夜间视频香蕉| 97人妻一区二区精品免费视频| 紧缚奴在线一区二区三区| 91天堂在线视频| 欧美 中文字幕| 久久伊人中文字幕| 亚洲二区三区四区| 操你啦在线视频| 亚洲国产一二三| 日日摸日日碰夜夜爽av| 91精品影视| 欧美一区二区三区四区视频 | 亚洲手机在线观看| 国产精品亚洲成人| 六月婷婷久久| 午夜老司机在线观看| 一区二区视频免费在线观看| 成年人午夜视频在线观看| 国产精品av一区二区三区 | 欧洲天堂在线观看| 综合婷婷亚洲小说| 久久精品视频16| 日韩大陆av| 亚洲缚视频在线观看| 日本少妇色视频| 天天操夜夜操国产精品| 午夜免费久久久久| 中文字幕网址在线| www.激情成人| 亚洲欧美久久久久一区二区三区| 中文在线观看免费| 色素色在线综合| 欧美日韩一区二区区别是什么| 夜色77av精品影院| 欧美xxxx做受欧美.88| 中文字幕在线观看视频网站| 国产呦萝稀缺另类资源| 欧美精品在线一区| 国产探花视频在线观看| 欧洲色大大久久| 人妻激情偷乱频一区二区三区| 成人精品视频| 91国内揄拍国内精品对白| 一级特黄aa大片| 久久久99精品免费观看不卡| 狠狠精品干练久久久无码中文字幕| 亚洲女色av| 精品欧美一区二区在线观看| 无码人中文字幕| 久久不射中文字幕| 国产精品视频入口| 国产在线高清视频| 欧美性三三影院| 亚洲一区二区三区无码久久| 中文字幕免费一区二区| 国产精品入口日韩视频大尺度| 少妇又色又爽又黄的视频| 亚洲欧美一区二区久久| 在线观看免费成人av| 久久综合另类图片小说| 欧美理论片在线观看| 中文字幕欧美在线观看| 国产三级欧美三级日产三级99| r级无码视频在线观看| 欧美a级大片在线| 日韩小视频网址| 亚洲视屏在线观看| 久久久久久久久久久99999| 免费毛片小视频| 久久国产精品免费精品3p| 欧美激情精品久久久久久| 国产免费无遮挡| 日韩毛片视频在线看| 午夜精品免费看| 久久久久亚洲| 亚洲a成v人在线观看| 99在线视频观看| 欧美电影一区二区三区| 免费三级在线观看| 狠狠网亚洲精品| 欧美日韩激情四射| 亚洲一区二区三区免费| 欧美激情精品久久久久久蜜臀| 性做久久久久久久| 亚洲国产综合色| 97人妻精品一区二区三区免费 | 美女网站免费观看视频| 嫩草一区二区三区| 国产精品吹潮在线观看| 97人人在线| 在线综合亚洲欧美在线视频| 午夜免费激情视频| 国产91精品一区二区麻豆网站 | 精品国产制服丝袜高跟| 精品一区二区三区四| proumb性欧美在线观看| 国产一区二区在线视频播放| 夜夜春成人影院| 国产女同一区二区| h片在线免费| 亚洲精品第一国产综合精品| 在线天堂中文字幕| 国产亚洲制服色| 小明看看成人免费视频| 欧美精品综合| 免费av一区二区三区| 97成人超碰| 欧美黑人狂野猛交老妇| 五月婷婷丁香网| 欧美日韩精品一区二区天天拍小说 | 国产精品你懂的在线欣赏| 久久精品久久99| 亚洲美女一区| 亚洲永久激情精品| 第一区第二区在线| 日韩暖暖在线视频| 成人短视频在线| 亚洲精品国产电影| 亚洲视频在线观看一区二区 | 久久精品视频亚洲| 亚洲女人18毛片水真多| 在线亚洲一区二区| 加勒比av在线播放| 国产亲近乱来精品视频| 麻豆av免费看| 日韩精彩视频在线观看| 99色这里只有精品| 精品国产99| 国产精品久久久久久久久久久久午夜片 | 国自在线精品视频| 欧美三级黄网| 亚洲精品自拍偷拍| 国产日本精品视频| 日本电影亚洲天堂一区| 久久久久国产精品夜夜夜夜夜| 久久久精品2019中文字幕之3| 一级黄色免费毛片| 日韩va亚洲va欧美va久久| 精品久久久久久无码中文野结衣| 日本女优一区| 久久伊人资源站| 99ri日韩精品视频| 成人中文字幕+乱码+中文字幕| 伊人久久国产| 午夜精品久久久久久久白皮肤| 老司机99精品99| 在线a欧美视频| 欧美色综合一区二区三区| 欧美电视剧在线看免费| 一区二区日韩在线观看| 色www精品视频在线观看| 日韩黄色a级片| 一区二区在线电影| 日韩三级在线观看视频| 国产精品午夜在线| b站大片免费直播| eeuss国产一区二区三区| 特黄特色免费视频| 黄一区二区三区| 日本中文字幕精品—区二区| 日韩精品一二三区| 国产a级一级片| 亚洲制服av| 蜜桃传媒一区二区三区| 亚洲国产美女| 人人干视频在线| 欧美视频在线观看| 成人高清dvd| 国产精品videossex久久发布| 一级全黄肉体裸体全过程| 91影院成人| 在线看视频不卡| 99精品综合| 国产又爽又黄ai换脸| 国产精品久久久久蜜臀| 亚洲欧美久久久久一区二区三区| 日本久久一二三四| 伊甸园精品99久久久久久| 欧美成人自拍| 日本一道在线观看| 欧美日韩少妇| 国内精品视频一区二区三区| 在线 亚洲欧美在线综合一区| 999一区二区三区| 在线精品亚洲| 色综合久久久久无码专区| 久久精品30| 黑人粗进入欧美aaaaa| 奇米在线7777在线精品| 久热精品在线观看视频| 国内精品免费**视频| 九九九久久久久久久| 国产成人免费视频网站 | 国产精品国产自产拍在线| 日本一区二区视频在线播放| 中文字幕一区日韩精品欧美| 极品颜值美女露脸啪啪| 精品毛片网大全| 国产精品免费无遮挡无码永久视频| 欧美亚洲国产一区二区三区va| 一区二区三区精彩视频| 日韩精品专区在线影院观看| 日韩中文字幕免费观看| 亚洲欧美国产视频| 欧美成人二区| 国内精品久久久久| 日韩在线观看不卡| 91传媒视频免费| 亚州精品视频| 一本久久a久久精品vr综合 | 三年中国国语在线播放免费| 久久精品999| 苍井空张开腿实干12次| 久久综合五月天婷婷伊人| 韩国三级hd中文字幕| 亚洲欧美一区二区三区国产精品| 中文在线观看免费网站| 色婷婷香蕉在线一区二区| 国产原创中文av| 精品无人国产偷自产在线| 亚洲免费视频一区二区三区| 欧美激情xxxxx| 国产香蕉久久| 狠狠色伊人亚洲综合网站色| 水蜜桃久久夜色精品一区| 国产资源在线免费观看| 人妖欧美一区二区| 久久免费精品国产| 国产精品久久久久久久久果冻传媒 | 欧美熟乱15p| 欧美图片激情小说| 蜜臀av性久久久久蜜臀av麻豆| 韩国三级视频在线观看| 国产精品久久久久久户外露出| 久久精品亚洲无码| 欧美美女黄视频| 嫩草研究院在线观看| 久久久久国产精品免费网站| 免费一区二区三区四区| 精品伊人久久大线蕉色首页| 欧美精品福利| 91精品999| 久久久亚洲精品石原莉奈| 免费在线视频一区二区| 欧美三级视频在线观看| 欧美在线一卡| 久久久久久久久网站| 玖玖精品一区| 一区二区在线观| 日韩av一区二| 法国伦理少妇愉情| 亚洲成人免费在线| www.黄色片| 伦伦影院午夜日韩欧美限制| yy6080久久伦理一区二区| 久久99精品久久久久久青青日本| 欧美体内she精视频在线观看| 久久久久久综合网| 日本一二三不卡| 欧美日韩a v| 精品亚洲一区二区三区在线观看| 6699嫩草久久久精品影院| 91久久极品少妇xxxxⅹ软件| 欧美国产一级| 九九热免费在线观看| 国产精品区一区二区三| 中日韩av在线| 一区二区欧美久久| 国产私拍福利精品视频二区| 蜜桃成人在线| 久久狠狠婷婷| 老熟妇一区二区| 在线观看日韩国产| 国产视频网址在线| 国产精品igao视频| 精品久久不卡| 91n.com在线观看| 日本一区二区视频在线| 天天综合久久综合| 中文字幕日韩综合av| 日韩福利影视| 国产午夜精品视频一区二区三区| 国产精品亚洲专一区二区三区 | 欧美三级电影一区二区三区| 成人av色在线观看| 亚洲天堂一区二区三区四区| 黑人无套内谢中国美女| 亚洲一二三四区| 手机福利小视频在线播放| 日韩av电影手机在线| 激情五月色综合国产精品| 在线观看高清免费视频| 最新国产成人在线观看| 午夜精品久久久久久久99热黄桃| 久久久噜噜噜久久| 外国成人在线视频| 在线观看av网页| 亚洲欧美日韩在线| 天堂网av2014| 国产精品对白刺激| 一个色综合网| 国产高清成人久久| 在线免费观看日本欧美| 中文字幕资源网在线观看| 精品国产一区二区三区免费| 三级不卡在线观看| √天堂中文官网8在线| 亚洲国产精品推荐| 成人国产精品| 欧美在线观看视频免费| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲精品国产久| 精品国产31久久久久久| 91大神在线网站| 国产精品美女久久久久av福利| 久久性色av| 久久精品视频免费在线观看| 日韩第一页在线| 国产精品麻豆| 日本wwww视频| 樱桃视频在线观看一区| 邻居大乳一区二区三区| 91网站免费看| 丝袜亚洲精品中文字幕一区| 五月天av网站| 尤物yw午夜国产精品视频| 99a精品视频在线观看|