日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
了解linux內(nèi)存分頁機制(linux內(nèi)存分頁機制)

了解linux內(nèi)存分頁機制

創(chuàng)新互聯(lián)專注于撫寧企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站開發(fā)。撫寧網(wǎng)站建設(shè)公司,為撫寧等地區(qū)提供建站服務(wù)。全流程按需求定制網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

在操作系統(tǒng)中,內(nèi)存的管理是一個非常重要的問題。在Linux的內(nèi)存管理中,分頁機制是非常核心的一部分。了解了Linux內(nèi)存分頁機制,可以讓我們更好地理解Linux操作系統(tǒng)的工作原理,并同時有效地提升我們的系統(tǒng)維護與管理能力。

為什么需要分頁機制?

在早期的操作系統(tǒng)中,內(nèi)存的管理方式是直接映射,即將內(nèi)存直接映射到物理存儲器。但這種方式會存在一些問題。因為進程會調(diào)用大量的指令和數(shù)據(jù),當內(nèi)存資源不足時,使用直接映射方式時,就會出現(xiàn)無法分配內(nèi)存的情況,而進程將無法正常運行。

分頁機制則可以有效解決這個問題,它將內(nèi)存劃分成了等大小的數(shù)據(jù)塊,即頁,每一頁在物理內(nèi)存上也對應(yīng)著不同的頁框。當進程需要內(nèi)存空間時,分頁機制會自動調(diào)度物理內(nèi)存上的空閑頁框,為程序分配內(nèi)存。這樣,無論進程調(diào)用的指令和數(shù)據(jù)大小是多少,都可以只分配所需的空間大小,避免內(nèi)存浪費。

什么是頁表?

分頁機制中,頁和頁框是一一對應(yīng)的,每個頁都需在物理內(nèi)存上占據(jù)一個頁框。為了建立內(nèi)存的邏輯地址空間和物理地址空間之間一一對應(yīng)關(guān)系,需要建立一個頁表,它記錄了每個頁的物理地址對應(yīng)的頁框地址。頁表通常是一個由操作系統(tǒng)維護的數(shù)據(jù)結(jié)構(gòu),可通過MMU硬件實現(xiàn)分頁機制,并管理進程的內(nèi)存。

頁表通常由兩個部分組成:一部分是頁目錄,另一部分是頁表。頁目錄中記錄著頁表的物理地址,而頁表中是一個映射關(guān)系表。通過頁表,操作系統(tǒng)可以將進程的虛擬地址轉(zhuǎn)換成物理地址,幫助CPU實現(xiàn)內(nèi)存尋址的過程。

頁表還可以實現(xiàn)內(nèi)存保護的功能。在頁表中,可以將某個頁設(shè)置為只讀的,防止程序誤寫該頁的內(nèi)容。也可以將某個頁設(shè)置為一個不可訪問的頁,以防止程序讀寫該頁的內(nèi)容。

Linux分頁管理方式

在Linux中,通過分頁機制來管理進程的內(nèi)存。通常情況下,Linux采用的是4KB大小的物理頁框。對于每個進程,Linux都為其分配了一組獨立的頁表,用于將其虛擬地址空間映射到物理地址空間。

Linux中,頁表的建立、更新、銷毀都是由內(nèi)核來完成的。當進程請求內(nèi)存時,內(nèi)核會根據(jù)頁表為其分配物理頁框并建立映射關(guān)系,如果內(nèi)存不足,則會將一些物理頁框交換到磁盤上進行緩存,從而為新進程騰出一些物理內(nèi)存空間。同時,Linux內(nèi)核還支持多種內(nèi)存管理策略,如伙伴系統(tǒng)和slab分配器等。

在Linux中,分頁機制是實現(xiàn)內(nèi)存管理的核心技術(shù)之一。掌握Linux的內(nèi)存分頁機制,可以更加深入地理解Linux的內(nèi)存管理原理,并通過編寫程序和接受故障來維護和優(yōu)化Linux系統(tǒng)。分頁機制也是內(nèi)存管理的基礎(chǔ),可以幫助我們更清晰地認識計算機硬件和操作系統(tǒng)內(nèi)部的工作方式,對于開發(fā)者和系統(tǒng)管理員來說,了解分頁機制是非常重要的。

相關(guān)問題拓展閱讀:

  • Linux存儲管理方式
  • 《操作系統(tǒng)概念精要》之內(nèi)存篇(三)-分頁的頁表結(jié)構(gòu)

Linux存儲管理方式

這種方式中,將用戶程序的地址空間,注意,是

用戶程序的地址空間

分為若干個固定大小的區(qū)域,成為“頁”或“頁面”。我們可以知道,這也頁其實是不存在的,只是一種劃分內(nèi)存空間的方法。也就是說,這種方式將用戶的程序

“肢解”

了,分成很多個小的部分,每個部分稱為一個“頁”。

將邏輯地址的前n位作為頁號,后面32-n位作為頁內(nèi)偏移量。

由于進程的最后一頁經(jīng)常裝不滿一個塊,從而形成了不可利指洞用的碎片,稱之為

“頁內(nèi)碎片”

。

作用:實現(xiàn)頁號到物理號的地址映射。

頁表是記錄邏輯空間(虛擬內(nèi)存)中每一頁在內(nèi)存中對應(yīng)的物理塊號。但并非每一頁邏輯空間都會實際對應(yīng)著一個物理塊,只有實際駐留在物理內(nèi)存空間中的頁才會對應(yīng)著物理塊。

系統(tǒng)會為每一個進程建立一張頁表,頁表是需要一直駐留在物理內(nèi)存中的(多級頁表除外),另外頁表的起址和長度存放在 PCB(Process Control Block)進程控制結(jié)構(gòu)體中。

可以在頁表的表項中設(shè)置相關(guān)的權(quán)限控制字段,例如設(shè)置存取控制字段,用于保護該存儲塊的讀寫;若存取控制字段為2位,則可以設(shè)置讀/寫、只讀和只執(zhí)行等存取方式。

物理塊唯念枯是實實在在存在于內(nèi)存中的:

由于執(zhí)行頻率高,要求效率比較高,需要使用硬件實現(xiàn)。

在系統(tǒng)中設(shè)置一個

頁表寄存器(PTR)

,其中存放頁表在內(nèi)存的起始地址和頁表的長度。平時進程未執(zhí)行的時候,頁表的起始地址和頁表長度放在本進程的PCB中。當調(diào)度程序調(diào)度到某個進程的時候,才將這兩個數(shù)據(jù)裝入

頁表寄存器

。

變換過程:

快表的變換機構(gòu)

為了提高地址變換速度,可在地址變換機構(gòu)中增設(shè)一個具有并行查詢能力的特殊高速緩沖寄存器,又稱為”聯(lián)想寄存器”或者“快表”。俗稱TLB。

快表與頁表的功能類似,其實就是將一部分頁表存到 CPU 內(nèi)部的高速緩沖存儲器 Cache。CPU 尋址時先到快表查詢相應(yīng)的頁表項形成物理地址,如果查詢不到,則到內(nèi)存中查詢,并將對應(yīng)頁表項調(diào)入到快表中。但,如果快表的存儲空間已滿,則需要通過算法找到一個暫時不再需要的頁表項,將它換出內(nèi)存。

由于成本的關(guān)系,快表不可能做得很大,通常只存放 16~512 個頁表項,這對中、高亮小型作業(yè)來說,已有可能把全部頁表項放在快表中;但對于大型作業(yè)而言,則只能將其一部分頁表項放入其中。由于對程序和數(shù)據(jù)的訪問往往帶有局限性,因此,據(jù)統(tǒng)計,從快表中能找到所需頁表項的概率可達 90% 以上。這樣,由于增加了地址變換機構(gòu)而造成的速度損失可減少到 10% 以下,達到了可接受的程度。

我們可以采用這樣兩個方法來解決這一問題:

① 對于頁表所需的內(nèi)存空間,可采用離散分配方式,以解決難以找到一塊連續(xù)的大內(nèi)存空間的問題;

只將當前需要的部分頁表項調(diào)入內(nèi)存,其余的頁表項仍駐留在磁盤上,需要時再調(diào)入。

二級頁表的頁表項:

過程:

在采用兩級頁表結(jié)構(gòu)的情況下,對于正在運行的進程,必須將其外層頁表調(diào)入內(nèi)存,而對于內(nèi)頁表則只需調(diào)入一頁或幾頁。為了表征某頁的頁表是否已經(jīng)調(diào)入內(nèi)存,還應(yīng)在外層頁表項中增設(shè)一個狀態(tài)位 S,其值若為 0,表示該頁表分頁不在內(nèi)存中,否則說明其分頁已調(diào)入內(nèi)存。進程運行時,地址變換機構(gòu)根據(jù)邏輯地址中的 P1去查找外層頁表;若所找到的頁表項中的狀態(tài)位為 0,則產(chǎn)生一個中斷信號,請求 OS 將該頁表分頁調(diào)入內(nèi)存。

多級頁表和二級頁表類似。多級頁表和二級頁表是為了節(jié)省物理內(nèi)存空間。使得頁表可以在內(nèi)存中離散存儲。(單級頁表為了隨機訪問必須連續(xù)存儲,如果虛擬內(nèi)存空間很大,就需要很多頁表項,就需要很大的連續(xù)內(nèi)存空間,但是多級頁表不需要。)

為什么引入分段存儲管理?

引入效果:

它將用戶程序的地址空間分為若干個大小不同的的段,每個段可以定義一組完整的信息。

段號表示段名,每個段都從0開始編址,并且采用一段連續(xù)的地址空間。

在該地址結(jié)構(gòu)中,允許一個作業(yè)最長有64K個段,每個段的更大長度為64KB。

在分段式存儲管理系統(tǒng)中,為每一個分段分配一個連續(xù)的分區(qū)。進程的各個段,可以離散地裝入內(nèi)存中不同的分區(qū)中。

作用:實現(xiàn)從邏輯地址到物理內(nèi)存區(qū)的映射。

為了保證程序能夠正常運行,就必須能夠從物理內(nèi)存中找出每個邏輯段所對應(yīng)的位置。為此在系統(tǒng)中會為每一個進程建立一張

段表

。每個段在表中有一個表項,其中記錄了該段在內(nèi)存中的起始地址和段的長度。一般將段表保存在內(nèi)存中。

在配置了段表之后,執(zhí)行的過程可以通過查找段表,找到每一個段所對應(yīng)的內(nèi)存區(qū)。

為了實現(xiàn)進程從邏輯地址到物理地址的變換功能,在系統(tǒng)設(shè)置了段表寄存器,用于存放段表的起始地址和段表長度TL。

在進行地址變換時,系統(tǒng)將邏輯地址中的段號與段表長度TL 進行比較。若 S > TL,表示段號太大,是訪問越界,于是產(chǎn)生越界中斷信號。若未越界,則根據(jù)段表的始址和該段的段號,計算出該段對應(yīng)段表項的位置,從中讀出該段在內(nèi)存的起始地址。然后,再檢查段內(nèi)地址 d 是否超過該段的段長 SL。若超過,即 d>SL,同樣發(fā)出越界中斷信號。若未越界,則將該段的基址 d 與段內(nèi)地址相加,即可得到要訪問的內(nèi)存。

分頁和分段系統(tǒng)相似之處:兩者都采用離散分配方式,且都是通過地址映射機構(gòu)實現(xiàn)地址變換。

但在概念上兩者完全不同,主要表現(xiàn)在下述三個方面:

分頁系統(tǒng)以頁面作為內(nèi)存分配的基本單位,能有效地提高內(nèi)存利用率,而分段系統(tǒng)以段作為內(nèi)存分配的基本單位,它能夠更好地滿足用戶多方面的需要。

段頁式地址結(jié)構(gòu)由段號、段內(nèi)頁號及頁內(nèi)地址三部分所組成

段頁式系統(tǒng)的基本原理是分段和分頁原理的結(jié)合,即先將用戶程序分成若干個段,再把每個段分成若干個頁,并為每一個段賦予一個段名。如下圖展示了一個作業(yè)地址空間的結(jié)構(gòu)。該作業(yè)有三個段:主程序段、子程序段和數(shù)據(jù)段;頁面大小為 4 KB:

在段頁式系統(tǒng)中,為了實現(xiàn)從邏輯地址到物理地址的變換,系統(tǒng)中需要同時配置段表和頁表。段表的內(nèi)容與分段系統(tǒng)略有不同,它不再是內(nèi)存始址和段長,而是頁表始址和頁表長度。下圖展示出了利用段表和頁表進行從用戶地址空間到物理(內(nèi)存)空間的映射。

在段頁式系統(tǒng)中,為了便于實現(xiàn)地址變換,須配置一個段表寄存器,其中存放段表始址和段長 TL。進行地址變換時,首先利用段號 S,將它與段長 TL 進行比較。若 S

在段頁式系統(tǒng)中,為了獲得一條指令或數(shù)據(jù),須三次訪問內(nèi)存。之一次訪問是訪問內(nèi)存中的段表,從中取得頁表始址;第二次訪問是訪問內(nèi)存中的頁表,從中取出該頁所在的物理塊號,并將該塊號與頁內(nèi)地址一起形成指令或數(shù)據(jù)的物理地址;第三次訪問才是真正從第二次訪問所得的地址中取出指令或數(shù)據(jù)。

顯然,這使訪問內(nèi)存的次數(shù)增加了近兩倍。為了提高執(zhí)行速度,在地址變換機構(gòu)中增設(shè)一個高速緩沖寄存器。每次訪問它時,都須同時利用段號和頁號去檢索高速緩存,若找到匹配的表項,便可從中得到相應(yīng)頁的物理塊號,用來與頁內(nèi)地址一起形成物理

參考鏈接:

《操作系統(tǒng)概念精要》之內(nèi)存篇(三)-分頁的頁表結(jié)構(gòu)

之前討論了分段和分頁,現(xiàn)在看下頁表的主要涉及的頁表結(jié)構(gòu)。

大多數(shù)現(xiàn)代計算機系統(tǒng)支持大邏輯地址空間(2^32 ~ 2^64)。這種情況下,頁表本身可以非常大。

例如:假如具有32位邏輯地址空間的一個計算機系統(tǒng)。如果系統(tǒng)的頁大小為4KB(2^12)。那么頁表可以多達100萬的條目 (2^32/ 2^12)。假設(shè)某個項目有4字節(jié)。那么每個進程需要4MB的地址物理地址來存儲頁表本身。顯然,我們并不想在內(nèi)存中連續(xù)分配這么多頁表。

這個問題的一個簡單的解決方法就是講頁表劃分為更小的塊。完成這種劃分方法有很多種。

最簡單的方法就是使用兩層分頁算法,就是將頁表再分頁,例如,再次假設(shè)一個系統(tǒng),具有32位邏輯地址空間和4K大小的頁。一個邏輯地址被分為20位的頁碼和12位的頁偏移。

因此要對20位的頁表進行再分頁,所以該頁碼可以分10位的頁碼和10位的偏移。這樣一個邏輯地址就會分為如下表示。

其中p1表示的用來訪問外部頁表的索引,而p2是內(nèi)部頁表的頁偏移。采用這種結(jié)構(gòu)的地址轉(zhuǎn)換方法。由于地址轉(zhuǎn)換有外向內(nèi),所以這種也稱為

向前映射頁表

在這種分頁結(jié)構(gòu)的方案中,假設(shè),系統(tǒng)是64位系統(tǒng),那么當它的地址空間就有2^64, 當再以4KB作為地址的話,那么頁表就會2^52個條目,那么就把頁表進行細分,從而形成三級分層分頁,四級分層分頁等等。

為了裝換每個邏輯地址,74位的系統(tǒng)需要7個級別的分頁型敗明,如此多的內(nèi)存訪問時不可取的,從而分層分頁在64位的系統(tǒng)并不是更優(yōu)的。

處理大于32位的地址空間的常用方法是

哈希頁表

,采用虛擬頁碼作為哈希表值。哈希頁表的每一個條目都包括一個鏈表,該鏈表的元素哈希到同意位置(這表示它們有了哈希沖突)。每個元素由三個字段組成:虛擬頁碼,映射的幀碼,指向鏈表內(nèi)下一個元素的指針。

該算法的工作如下:虛擬地址的虛擬頁碼哈希到哈希表。用虛擬頁碼與鏈表內(nèi)的之一個元素的之一個字段相比較。如果匹配,那么相應(yīng)的幀碼(第二個字段)就用來形成物理地址。如果不匹配,那么與鏈表內(nèi)的后續(xù)節(jié)點的之一個字段進行比較。以查找匹配的頁碼。該方案如圖:

這里書上提到的虛擬頁碼可以只看作是頁碼。(之所以叫虛擬頁碼,是因為根據(jù)虛擬內(nèi)存的概念,邏輯地址空間可以比物理地址大,所以多出來的部分被稱為虛擬的,具體介紹會在下一章提到)。

已提出用于64位地址空間的這個方案的一個變體。

此變體采用

聚簇頁表

類似于哈希頁表。不過哈希表內(nèi)的每個條目引用多個頁而不是單個頁。單個頁表的條目可以映射到多個物理幀。聚簇頁表對于

稀疏

地址空間特別有用。這里引用的是不連續(xù)的并且散布在整個地址空間。

通常,每個進程都有一個關(guān)聯(lián)的頁表。該進程所使用的每個頁都在也表中有一項(或者每個虛擬頁都有一項)。這種表示方法比較自然,因為進程是通過虛擬地址來引用頁的。然后是操作系統(tǒng)將這些地址轉(zhuǎn)換為物理內(nèi)存地址。

由于頁表是按照虛擬地址排序的,操作系統(tǒng)可計算所對應(yīng)條目在頁表的位置,可以直接使用該值。這種方法缺點就是:當每個頁表包含百萬級的數(shù)目時。會有性能問題,而且需要大量的內(nèi)存來保存頁表信息。

解決的方法處理上面的兩種方法外,還有一種就是

倒置頁表

。

這里先介紹一個IBM RT 的倒置頁表的表示方法:

對于每個真正的內(nèi)存頁或者幀,倒置頁表只有一個條目。每個條目包含

保存在真正內(nèi)存位置上的頁的虛擬地址

,以及擁有

該頁的進程信息

。具體的過程如圖:

這里的進程的信息就是以前提到的 空間地址標識符(ASID)。主要原因是由于一個倒置頁表通常包含了多個不同的映射物理內(nèi)存的地址空間。具體進程的每個邏輯頁可映射相應(yīng)的物理幀。

采用卜告倒置頁表的系統(tǒng)在實現(xiàn)共享內(nèi)存的時候會有問題,因為共享內(nèi)存的實枯肆現(xiàn)為:將多個地址空間映射到同一個物理地址。這種方法,不能用于倒置頁表,因為每個物理頁只有一個虛擬的頁條目,一個物理頁不能有多個共享的虛擬地址。

IA-32 系統(tǒng)的內(nèi)存管理可以分為分段和分頁兩個部分,工作如下:CPU 生成邏輯地址,并交給分段單元,分段單元為每個邏輯地址生成 一個線性地址。 然后線性地址交給分頁單元,以生成內(nèi)存的物理地址。

IA-32 架構(gòu)允許一個段的大小最多可以達到4G, 每個進程最多有16K個段。進程的邏輯地址空間分為兩部分。

之一部分最多由8K段組成,這部分是單個進程私有;

第二部分也是最多由8K段組成,這部分是所有進程共享。

之一部分保存在

局部描述符表(LTD)

中,第二部分保存在

全局描述符表(GDT)

中,他們的每個 條目都是8個字節(jié),包括一個段的詳細信息。比如段基地址和段界限。

邏輯地址一般為二元數(shù)組(選擇器,偏移),選擇器是一個16位的數(shù):

其中s表示段號,g表示實在LTD中還是在GDT中, p表示保護信息。

段的尋址過程為:

IA-32架構(gòu)的頁可分為4K,或者4M 。采用4K的頁,IA-32采用二級分頁方法。其中的32位的尋址和表示請參照二級分頁算法。

為了提高物理內(nèi)存的使用率,IA-32 的頁表可以被交換存在磁盤。因此,頁目錄的條目通過一個

有效位

,以表示該條目所指的頁表實在內(nèi)存還是在磁盤上。如果頁表再磁盤上,則操作系統(tǒng)可通過其他31位來表示頁表的磁盤位置。之后根據(jù)需要調(diào)入內(nèi)存。

隨著軟件開發(fā)人員的逐步發(fā)現(xiàn),32位架構(gòu)的4GB內(nèi)存限制,Inter通過

頁地址擴展

,以便允許訪問大于4GB的物理地址空間。

引入頁地址擴展,主要是將兩級的分頁方案擴展到了三級方案, 后者的最后兩位用于指向頁目錄指針表。

頁地址擴展使得地址地址空間從32位增加到了36位。Linux和Mac OS X 都支持了這項技術(shù)。

X86-64 支持更大的邏輯和物理地址空間。支持64位的地址空間意味著可尋址的內(nèi)存達到驚人的2^64字節(jié)。64位系統(tǒng)有能力訪問那么多的內(nèi)存,但是實際上,目前設(shè)計的地址遠沒有那么多。

目前提供的x86-64 架構(gòu)的機器最多采用四級分頁,支持48位的虛擬地址。它的頁面大小可以4KB,2MB,或者1G。

雖然Intel的芯片占了大部分的市場,但是移動設(shè)備的架構(gòu)一直采用的是32位ARM的架構(gòu)。現(xiàn)在的iPhone 和iPad 都或得了ARM的授權(quán)。Android的智能手機也都是ARM的處理器。

ARM支持的頁面大?。?/p>

ARM架構(gòu)還支持兩級TLB(高速緩存)。在外部,有兩個微TLB: 一個用于數(shù)據(jù),另一個用于指令。微TLB也支持 (ASID)進程地址空間標識符。 在內(nèi)部 有一個主 TLB。 地址轉(zhuǎn)換從微TLB級開始。如果沒有找到,那么再檢查主TLB。如果還沒找到,再通過頁表進行硬件查找。

關(guān)于linux內(nèi)存分頁機制的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


網(wǎng)站題目:了解linux內(nèi)存分頁機制(linux內(nèi)存分頁機制)
網(wǎng)站路徑:http://m.5511xx.com/article/dhohhjg.html