欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux虛擬內(nèi)存和物理內(nèi)存的詳細(xì)資料講解

Wildesbeast ? 來源:今日頭條 ? 作者:編程資源庫 ? 2020-02-24 15:53 ? 次閱讀

虛擬內(nèi)存:

第一層理解

1. 每個(gè)進(jìn)程都有自己獨(dú)立的4G內(nèi)存空間,各個(gè)進(jìn)程的內(nèi)存空間具有類似的結(jié)構(gòu)

2. 一個(gè)新進(jìn)程建立的時(shí)候,將會(huì)建立起自己的內(nèi)存空間,此進(jìn)程的數(shù)據(jù),代碼等從磁盤拷貝到自己的進(jìn)程空間,哪些數(shù)據(jù)在哪里,都由進(jìn)程控制表中的task_struct記錄,task_struct中記錄中一條鏈表,記錄中內(nèi)存空間的分配情況,哪些地址有數(shù)據(jù),哪些地址無數(shù)據(jù),哪些可讀,哪些可寫,都可以通過這個(gè)鏈表記錄

3. 每個(gè)進(jìn)程已經(jīng)分配的內(nèi)存空間,都與對應(yīng)的磁盤空間映射

問題:

計(jì)算機(jī)明明沒有那么多內(nèi)存(n個(gè)進(jìn)程的話就需要n*4G)內(nèi)存

建立一個(gè)進(jìn)程,就要把磁盤上的程序文件拷貝到進(jìn)程對應(yīng)的內(nèi)存中去,對于一個(gè)程序?qū)?yīng)的多個(gè)進(jìn)程這種情況,浪費(fèi)內(nèi)存!

第二層理解

1. 每個(gè)進(jìn)程的4G內(nèi)存空間只是虛擬內(nèi)存空間,每次訪問內(nèi)存空間的某個(gè)地址,都需要把地址翻譯為實(shí)際物理內(nèi)存地址

2. 所有進(jìn)程共享同一物理內(nèi)存,每個(gè)進(jìn)程只把自己目前需要的虛擬內(nèi)存空間映射并存儲(chǔ)到物理內(nèi)存上。

3. 進(jìn)程要知道哪些內(nèi)存地址上的數(shù)據(jù)在物理內(nèi)存上,哪些不在,還有在物理內(nèi)存上的哪里,需要用頁表來記錄

4. 頁表的每一個(gè)表項(xiàng)分兩部分,第一部分記錄此頁是否在物理內(nèi)存上,第二部分記錄物理內(nèi)存頁的地址(如果在的話)

5. 當(dāng)進(jìn)程訪問某個(gè)虛擬地址,去看頁表,如果發(fā)現(xiàn)對應(yīng)的數(shù)據(jù)不在物理內(nèi)存中,則缺頁異常

6. 缺頁異常的處理過程,就是把進(jìn)程需要的數(shù)據(jù)從磁盤上拷貝到物理內(nèi)存中,如果內(nèi)存已經(jīng)滿了,沒有空地方了,那就找一個(gè)頁覆蓋,當(dāng)然如果被覆蓋的頁曾經(jīng)被修改過,需要將此頁寫回磁盤

總結(jié):

優(yōu)點(diǎn):

1.既然每個(gè)進(jìn)程的內(nèi)存空間都是一致而且固定的,所以鏈接器在鏈接可執(zhí)行文件時(shí),可以設(shè)定內(nèi)存地址,而不用去管這些數(shù)據(jù)最終實(shí)際的內(nèi)存地址,這是有獨(dú)立內(nèi)存空間的好處

2.當(dāng)不同的進(jìn)程使用同樣的代碼時(shí),比如庫文件中的代碼,物理內(nèi)存中可以只存儲(chǔ)一份這樣的代碼,不同的進(jìn)程只需要把自己的虛擬內(nèi)存映射過去就可以了,節(jié)省內(nèi)存

3.在程序需要分配連續(xù)的內(nèi)存空間的時(shí)候,只需要在虛擬內(nèi)存空間分配連續(xù)空間,而不需要實(shí)際物理內(nèi)存的連續(xù)空間,可以利用碎片。

另外,事實(shí)上,在每個(gè)進(jìn)程創(chuàng)建加載時(shí),內(nèi)核只是為進(jìn)程“創(chuàng)建”了虛擬內(nèi)存的布局,具體就是初始化進(jìn)程控制表中內(nèi)存相關(guān)的鏈表,實(shí)際上并不立即就把虛擬內(nèi)存對應(yīng)位置的程序數(shù)據(jù)和代碼(比如.text .data段)拷貝到物理內(nèi)存中,只是建立好虛擬內(nèi)存和磁盤文件之間的映射就好(叫做存儲(chǔ)器映射),等到運(yùn)行到對應(yīng)的程序時(shí),才會(huì)通過缺頁異常,來拷貝數(shù)據(jù)。還有進(jìn)程運(yùn)行過程中,要?jiǎng)討B(tài)分配內(nèi)存,比如malloc時(shí),也只是分配了虛擬內(nèi)存,即為這塊虛擬內(nèi)存對應(yīng)的頁表項(xiàng)做相應(yīng)設(shè)置,當(dāng)進(jìn)程真正訪問到此數(shù)據(jù)時(shí),才引發(fā)缺頁異常。

補(bǔ)充理解:

虛擬存儲(chǔ)器涉及三個(gè)概念: 虛擬存儲(chǔ)空間,磁盤空間,內(nèi)存空間

可以認(rèn)為虛擬空間都被映射到了磁盤空間中,(事實(shí)上也是按需要映射到磁盤空間上,通過mmap),并且由頁表記錄映射位置,當(dāng)訪問到某個(gè)地址的時(shí)候,通過頁表中的有效位,可以得知此數(shù)據(jù)是否在內(nèi)存中,如果不是,則通過缺頁異常,將磁盤對應(yīng)的數(shù)據(jù)拷貝到內(nèi)存中,如果沒有空閑內(nèi)存,則選擇犧牲頁面,替換其他頁面。

mmap是用來建立從虛擬空間到磁盤空間的映射的,可以將一個(gè)虛擬空間地址映射到一個(gè)磁盤文件上,當(dāng)不設(shè)置這個(gè)地址時(shí),則由系統(tǒng)自動(dòng)設(shè)置,函數(shù)返回對應(yīng)的內(nèi)存地址(虛擬地址),當(dāng)訪問這個(gè)地址的時(shí)候,就需要把磁盤上的內(nèi)容拷貝到內(nèi)存了,然后就可以讀或者寫,最后通過manmap可以將內(nèi)存上的數(shù)據(jù)換回到磁盤,也就是解除虛擬空間和內(nèi)存空間的映射,這也是一種讀寫磁盤文件的方法,也是一種進(jìn)程共享數(shù)據(jù)的方法 共享內(nèi)存

物理內(nèi)存:

在內(nèi)核態(tài)申請內(nèi)存比在用戶態(tài)申請內(nèi)存要更為直接,它沒有采用用戶態(tài)那種延遲分配內(nèi)存技術(shù)。內(nèi)核認(rèn)為一旦有內(nèi)核函數(shù)申請內(nèi)存,那么就必須立刻滿足該申請內(nèi)存的請求,并且這個(gè)請求一定是正確合理的。相反,對于用戶態(tài)申請內(nèi)存的請求,內(nèi)核總是盡量延后分配物理內(nèi)存,用戶進(jìn)程總是先獲得一個(gè)虛擬內(nèi)存區(qū)的使用權(quán),最終通過缺頁異常獲得一塊真正的物理內(nèi)存。

1.物理內(nèi)存的內(nèi)核映射

IA32架構(gòu)中內(nèi)核虛擬地址空間只有1GB大小(從3GB到4GB),因此可以直接將1GB大小的物理內(nèi)存(即常規(guī)內(nèi)存)映射到內(nèi)核地址空間,但超出1GB大小的物理內(nèi)存(即高端內(nèi)存)就不能映射到內(nèi)核空間。為此,內(nèi)核采取了下面的方法使得內(nèi)核可以使用所有的物理內(nèi)存。

1).高端內(nèi)存不能全部映射到內(nèi)核空間,也就是說這些物理內(nèi)存沒有對應(yīng)的線性地址。不過,內(nèi)核為每個(gè)物理頁框都分配了對應(yīng)的頁框描述符,所有的頁框描述符都保存在mem_map數(shù)組中,因此每個(gè)頁框描述符的線性地址都是固定存在的。內(nèi)核此時(shí)可以使用alloc_pages()和alloc_page()來分配高端內(nèi)存,因?yàn)檫@些函數(shù)返回頁框描述符的線性地址。

2).內(nèi)核地址空間的后128MB專門用于映射高端內(nèi)存,否則,沒有線性地址的高端內(nèi)存不能被內(nèi)核所訪問。這些高端內(nèi)存的內(nèi)核映射顯然是暫時(shí)映射的,否則也只能映射128MB的高端內(nèi)存。當(dāng)內(nèi)核需要訪問高端內(nèi)存時(shí)就臨時(shí)在這個(gè)區(qū)域進(jìn)行地址映射,使用完畢之后再用來進(jìn)行其他高端內(nèi)存的映射。

由于要進(jìn)行高端內(nèi)存的內(nèi)核映射,因此直接能夠映射的物理內(nèi)存大小只有896MB,該值保存在high_memory中。內(nèi)核地址空間的線性地址區(qū)間如下圖所示:

從圖中可以看出,內(nèi)核采用了三種機(jī)制將高端內(nèi)存映射到內(nèi)核空間:永久內(nèi)核映射,固定映射和vmalloc機(jī)制。

2.物理內(nèi)存管理機(jī)制

基于物理內(nèi)存在內(nèi)核空間中的映射原理,物理內(nèi)存的管理方式也有所不同。內(nèi)核中物理內(nèi)存的管理機(jī)制主要有伙伴算法,slab高速緩存和vmalloc機(jī)制。其中伙伴算法和slab高速緩存都在物理內(nèi)存映射區(qū)分配物理內(nèi)存,而vmalloc機(jī)制則在高端內(nèi)存映射區(qū)分配物理內(nèi)存。

伙伴算法

伙伴算法負(fù)責(zé)大塊連續(xù)物理內(nèi)存的分配和釋放,以頁框?yàn)榛締挝?。該機(jī)制可以避免外部碎片。

per-CPU頁框高速緩存

內(nèi)核經(jīng)常請求和釋放單個(gè)頁框,該緩存包含預(yù)先分配的頁框,用于滿足本地CPU發(fā)出的單一頁框請求。

slab緩存

slab緩存負(fù)責(zé)小塊物理內(nèi)存的分配,并且它也作為高速緩存,主要針對內(nèi)核中經(jīng)常分配并釋放的對象。

vmalloc機(jī)制

vmalloc機(jī)制使得內(nèi)核通過連續(xù)的線性地址來訪問非連續(xù)的物理頁框,這樣可以最大限度的使用高端物理內(nèi)存。

3.物理內(nèi)存的分配

內(nèi)核發(fā)出內(nèi)存申請的請求時(shí),根據(jù)內(nèi)核函數(shù)調(diào)用接口將啟用不同的內(nèi)存分配器。

3.1 分區(qū)頁框分配器

分區(qū)頁框分配器 (zoned page frame allocator) ,處理對連續(xù)頁框的內(nèi)存分配請求。分區(qū)頁框管理器分為兩大部分:前端的管理區(qū)分配器和伙伴系統(tǒng),如下圖:

管理區(qū)分配器負(fù)責(zé)搜索一個(gè)能滿足請求頁框塊大小的管理區(qū)。在每個(gè)管理區(qū)中,具體的頁框分配工作由伙伴系統(tǒng)負(fù)責(zé)。為了達(dá)到更好的系統(tǒng)性能,單個(gè)頁框的申請工作直接通過per-CPU頁框高速緩存完成。

該分配器通過幾個(gè)函數(shù)和宏來請求頁框,它們之間的封裝關(guān)系如下圖所示。

這些函數(shù)和宏將核心的分配函數(shù)__alloc_pages_nodemask()封裝,形成滿足不同分配需求的分配函數(shù)。其中,alloc_pages()系列函數(shù)返回物理內(nèi)存首頁框描述符,__get_free_pages()系列函數(shù)返回內(nèi)存的線性地址。

3.2 slab分配器

slab 分配器最初是為了解決物理內(nèi)存的內(nèi)部碎片而提出的,它將內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)看做對象。slab分配器為每一種對象建立高速緩存。內(nèi)核對該對象的分配和釋放均是在這塊高速緩存中操作。一種對象的slab分配器結(jié)構(gòu)圖如下:

可以看到每種對象的高速緩存是由若干個(gè)slab組成,每個(gè)slab是由若干個(gè)頁框組成的。雖然slab分配器可以分配比單個(gè)頁框更小的內(nèi)存塊,但它所需的所有內(nèi)存都是通過伙伴算法分配的。

slab高速緩存分專用緩存和通用緩存。專用緩存是對特定的對象,比如為內(nèi)存描述符創(chuàng)建高速緩存。通用緩存則是針對一般情況,適合分配任意大小的物理內(nèi)存,其接口即為kmalloc()。

3.3 非連續(xù)內(nèi)存區(qū)內(nèi)存的分配

內(nèi)核通過vmalloc()來申請非連續(xù)的物理內(nèi)存,若申請成功,該函數(shù)返回連續(xù)內(nèi)存區(qū)的起始地址,否則,返回NULL。vmalloc()和kmalloc()申請的內(nèi)存有所不同,kmalloc()所申請內(nèi)存的線性地址與物理地址都是連續(xù)的,而vmalloc()所申請的內(nèi)存線性地址連續(xù)而物理地址則是離散的,兩個(gè)地址之間通過內(nèi)核頁表進(jìn)行映射。

vmalloc()的工作方式理解起來很簡單:

1).尋找一個(gè)新的連續(xù)線性地址空間;

2).依次分配一組非連續(xù)的頁框;

3).為線性地址空間和非連續(xù)頁框建立映射關(guān)系,即修改內(nèi)核頁表;

vmalloc()的內(nèi)存分配原理與用戶態(tài)的內(nèi)存分配相似,都是通過連續(xù)的虛擬內(nèi)存來訪問離散的物理內(nèi)存,并且虛擬地址和物理地址之間是通過頁表進(jìn)行連接的,通過這種方式可以有效的使用物理內(nèi)存。但是應(yīng)該注意的是,vmalloc()申請物理內(nèi)存時(shí)是立即分配的,因?yàn)閮?nèi)核認(rèn)為這種內(nèi)存分配請求是正當(dāng)而且緊急的;相反,用戶態(tài)有內(nèi)存請求時(shí),內(nèi)核總是盡可能的延后,畢竟用戶態(tài)跟內(nèi)核態(tài)不在一個(gè)特權(quán)級。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 4G
    4G
    +關(guān)注

    關(guān)注

    15

    文章

    5533

    瀏覽量

    119577
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10909

    瀏覽量

    213129
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11351

    瀏覽量

    210493
收藏 人收藏

    評論

    相關(guān)推薦

    一文詳解Linux虛擬內(nèi)存技術(shù)

      以存儲(chǔ)單元為單位來管理顯然不現(xiàn)實(shí),因此Linux把虛存空間分成若干個(gè)大小相等的存儲(chǔ)分區(qū),Linux把這樣的分區(qū)叫做頁。為了換入、換出的方便,物理內(nèi)存也就按頁的大小分成若干個(gè)塊。由于
    發(fā)表于 07-17 17:29 ?618次閱讀
    一文詳解<b class='flag-5'>Linux</b><b class='flag-5'>虛擬內(nèi)存</b>技術(shù)

    物理內(nèi)存虛擬內(nèi)存之間的轉(zhuǎn)換

    內(nèi)存操作:涉及到了物理內(nèi)存虛擬內(nèi)存之間的轉(zhuǎn)換,需要用到兩個(gè)函數(shù): ioremap 和 iounmap。ioremap :函 數(shù) 用 于 獲 取 指 定 物 理 地 址 空 間 對 應(yīng)
    發(fā)表于 12-17 06:48

    如何定義虛擬內(nèi)存?

    虛擬內(nèi)存中。這是通過地址轉(zhuǎn)換完成的。圖4. 虛擬地址映射到虛擬物理內(nèi)存地址轉(zhuǎn)換如前所述,物理
    發(fā)表于 04-11 10:20

    Linux虛擬內(nèi)存物理內(nèi)存的深刻分析

    進(jìn)程這種情況,浪費(fèi)內(nèi)存!第二層理解每個(gè)進(jìn)程的4G內(nèi)存空間只是虛擬內(nèi)存空間,每次訪問內(nèi)存空間的某個(gè)地址,都需要把地址翻譯為實(shí)際物理
    發(fā)表于 05-31 08:00

    虛擬內(nèi)存是什么_虛擬內(nèi)存有什么用

    虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存
    發(fā)表于 11-01 10:03 ?9759次閱讀
    <b class='flag-5'>虛擬內(nèi)存</b>是什么_<b class='flag-5'>虛擬內(nèi)存</b>有什么用

    簡單剖析虛擬內(nèi)存與交換分區(qū)

    很多朋友會(huì)把虛擬內(nèi)存認(rèn)為就是交換分區(qū)。其實(shí),虛擬內(nèi)存并非真正存在的物理空間,它僅僅是一個(gè)虛擬的東西。
    的頭像 發(fā)表于 02-09 08:44 ?6355次閱讀

    虛擬內(nèi)存是什么意思

    虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存
    的頭像 發(fā)表于 03-14 14:50 ?7628次閱讀

    虛擬內(nèi)存怎么設(shè)置_虛擬內(nèi)存注意事項(xiàng)

    虛擬內(nèi)存是什么呢?虛擬內(nèi)存,它只是相對于我們平時(shí)用的內(nèi)存而說的,就比如如果系統(tǒng)的物理內(nèi)存的空間是處于入不敷出的狀態(tài)的時(shí)候,電腦的操作系統(tǒng)此時(shí)
    發(fā)表于 06-11 10:45 ?2154次閱讀

    Linux:測試進(jìn)程占用的虛擬內(nèi)存大小

    Linux:測試進(jìn)程占用的虛擬內(nèi)存大小
    的頭像 發(fā)表于 06-23 09:23 ?2926次閱讀
    <b class='flag-5'>Linux</b>:測試進(jìn)程占用的<b class='flag-5'>虛擬內(nèi)存</b>大小

    Linux虛擬內(nèi)存究竟是什么?

    前不久組內(nèi)又有一次我比較期待的分享:”Linux虛擬內(nèi)存”。
    的頭像 發(fā)表于 06-21 16:41 ?2057次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>虛擬內(nèi)存</b>究竟是什么?

    虛擬內(nèi)存的作用和原理 如何調(diào)整虛擬內(nèi)存設(shè)置

    虛擬內(nèi)存,也稱為虛擬內(nèi)存管理或頁面文件,是計(jì)算機(jī)操作系統(tǒng)中的一種內(nèi)存管理技術(shù)。它允許系統(tǒng)使用硬盤空間作為額外的RAM(隨機(jī)存取存儲(chǔ)器),以彌補(bǔ)物理內(nèi)
    的頭像 發(fā)表于 12-04 09:13 ?811次閱讀

    虛擬內(nèi)存不足如何解決 虛擬內(nèi)存物理內(nèi)存的區(qū)別

    虛擬內(nèi)存不足的解決方案 虛擬內(nèi)存不足是計(jì)算機(jī)用戶經(jīng)常遇到的問題,尤其是在運(yùn)行大型軟件或多任務(wù)處理時(shí)。以下是一些解決虛擬內(nèi)存不足問題的方法: 增加物理
    的頭像 發(fā)表于 12-04 09:14 ?602次閱讀

    什么是虛擬內(nèi)存分頁 Windows系統(tǒng)虛擬內(nèi)存優(yōu)化方法

    虛擬內(nèi)存分頁概述 在Windows操作系統(tǒng)中,虛擬內(nèi)存是通過分頁機(jī)制實(shí)現(xiàn)的。分頁允許系統(tǒng)將內(nèi)存中的數(shù)據(jù)移動(dòng)到硬盤上,以便為當(dāng)前運(yùn)行的程序騰出空間。這個(gè)過程對于保持系統(tǒng)的流暢運(yùn)行至關(guān)重要,尤其是在
    的頭像 發(fā)表于 12-04 09:16 ?626次閱讀

    Linux下如何管理虛擬內(nèi)存 使用虛擬內(nèi)存時(shí)的常見問題

    Linux系統(tǒng)中,虛擬內(nèi)存管理是操作系統(tǒng)內(nèi)核的一個(gè)重要功能,負(fù)責(zé)管理物理內(nèi)存和磁盤上的交換空間。以下是對Linux下如何管理
    的頭像 發(fā)表于 12-04 09:19 ?635次閱讀

    虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用

    在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,虛擬內(nèi)存是一種重要的資源管理技術(shù),它允許系統(tǒng)使用硬盤空間來擴(kuò)展物理內(nèi)存的容量。然而,當(dāng)系統(tǒng)運(yùn)行的程序和進(jìn)程超出了物理內(nèi)存
    的頭像 發(fā)表于 12-04 09:49 ?295次閱讀