偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux內(nèi)核如何管理內(nèi)存換入換出,如何實(shí)現(xiàn)磁盤(pán)緩存?

存儲(chǔ) 存儲(chǔ)軟件
內(nèi)存swap的機(jī)制不再介紹,其實(shí)從問(wèn)題來(lái)看,是想知道,內(nèi)存頁(yè)是怎么與換出到磁盤(pán)上的內(nèi)容一一對(duì)應(yīng)的。答案是通過(guò)頁(yè)表。

[[251672]]

 1:linux是如何管理內(nèi)存換入換出的?

內(nèi)存swap的機(jī)制不再介紹,其實(shí)從問(wèn)題來(lái)看,是想知道,內(nèi)存頁(yè)是怎么與換出到磁盤(pán)上的內(nèi)容一一對(duì)應(yīng)的。答案是通過(guò)頁(yè)表。拿32位系統(tǒng)舉例子:

 

處理器通過(guò)頁(yè)表來(lái)把一個(gè)虛擬地址轉(zhuǎn)化為實(shí)際的物理內(nèi)存地址。每個(gè)進(jìn)程有屬于它自己的一組頁(yè)表;無(wú)論何時(shí)發(fā)生了進(jìn)程切換,相應(yīng)的會(huì)發(fā)生用戶(hù)空間的頁(yè)表切換。mm_struct中有一個(gè)pdg域,就指向該進(jìn)程所使用的頁(yè)表集。對(duì)每一個(gè)虛擬頁(yè)在頁(yè)表中都有對(duì)應(yīng)的一個(gè)頁(yè)表項(xiàng)(PTE),通常x86下的一頁(yè)是一個(gè)4字節(jié)的如下記錄(pgd和pte的結(jié)構(gòu)類(lèi)似,12-31位是page base描述,0-11位是屬性描述,不過(guò)pgd中的pagebase 指向的pte所在頁(yè)面的起始地址,而pte的page base指向的物理頁(yè)面的起始地址。假設(shè)下面是一條pte對(duì)頁(yè)的描述記錄):

 

注意第0位P位,P位告訴處理器該虛擬頁(yè)目前是否在物理內(nèi)存,P位為1,表示該頁(yè)在內(nèi)存中。P位為0頁(yè)表示不在內(nèi)存,頁(yè)不在內(nèi)存也分下面兩種情況:

A:從1位至31位為空:該頁(yè)不在進(jìn)程的地址空間,需在請(qǐng)求調(diào)頁(yè)

B:1位至31位至少有一位被至位:說(shuō)明該頁(yè)被換出到磁盤(pán)。

針對(duì)B情況作說(shuō)明:如果有一位被至位,而PTE的關(guān)于該頁(yè)的條目被以如下方式解讀:

既,1-7被解讀成一個(gè)交換區(qū)的區(qū)號(hào),而8-31位被解讀成頁(yè)槽索引(page-slot,在swap區(qū)中一個(gè)大小為4k的頁(yè)被稱(chēng)為page–slot,也許是為了區(qū)別與物理頁(yè)的page -frame),這樣該頁(yè)就指向了swap區(qū)的一個(gè)4k的空間。

我們?cè)賮?lái)看swap區(qū),每個(gè)活動(dòng)的swap區(qū)在內(nèi)存中有一個(gè)swap區(qū)描述符,系統(tǒng)所有的交換區(qū)組成一個(gè)鏈表,交換區(qū)結(jié)構(gòu)為swap_info_struct,該結(jié)構(gòu)中有個(gè)重要字段 :struct block_device * bdev ,存放交換區(qū)的塊設(shè)備的描述符,就是你格式分成swap的設(shè)備/分區(qū)。

***來(lái)看磁盤(pán)上的swap區(qū)是什么組織的:

每個(gè)交換區(qū)由一組pageslot組成(一般這些頁(yè)槽在磁盤(pán)上連續(xù)存放),就是說(shuō)由一組4k大小的塊組成,每塊包含一個(gè)換出的頁(yè),。交換區(qū)的***個(gè)page slot(0號(hào)頁(yè)槽)用來(lái)***存放交換區(qū)的管理信息,可用來(lái)存放換出頁(yè)的***個(gè)頁(yè)槽為1號(hào)頁(yè)槽(頁(yè)槽索引為1)。所以上面描述換出頁(yè)的頁(yè)表?xiàng)l目時(shí)說(shuō)“1位至31位至少有一位被至位”,因?yàn)?號(hào)頁(yè)槽不能存換出頁(yè)。

到這里,不知道大家對(duì)swap頁(yè)的標(biāo)記有沒(méi)有一個(gè)大體的概念?

2:內(nèi)核讀入一個(gè)文件時(shí),內(nèi)核是在哪里記錄內(nèi)存頁(yè)和磁盤(pán)塊的對(duì)應(yīng)關(guān)系,以便將來(lái)把臟數(shù)據(jù)flush回磁盤(pán)?具體來(lái)說(shuō),是在哪些數(shù)據(jù)結(jié)構(gòu)里記錄這些信息的?

先來(lái)看文件在磁盤(pán)和內(nèi)存中的存放方式(ext3舉例):

磁盤(pán):文件由inode以及inode指向的具體數(shù)據(jù)塊組成,來(lái)看看磁盤(pán)的Inode結(jié)構(gòu)的描述(source/fs/ext4/ext3.h 下面為3.14內(nèi)核的中的,source是指內(nèi)核代碼根目錄,下同。內(nèi)核版本不同,行號(hào)可能不同):

 

第281行有一個(gè)“__le32 i_block[EXT3_N_BLOCKS];”

最前面的le 全稱(chēng)為 little-endian,表示排序方式:低階字節(jié)在高位位置與其對(duì)應(yīng)的是be :big-endian。 如代碼注釋這個(gè)數(shù)據(jù)指向了具體存放文件數(shù)據(jù)的塊(這里我們不講間接塊)。到此,估計(jì)已經(jīng)了解了文件在磁盤(pán)上的存放的管理。

下面來(lái)說(shuō)說(shuō)文件在內(nèi)存中的存放,文件在內(nèi)存中存放由VSF層管理,VFS層在打開(kāi)文件時(shí)在內(nèi)存中依據(jù)磁盤(pán)的 ext3_inode而建立VFS的inode結(jié)構(gòu),VFS的inode與磁盤(pán)inode是一一對(duì)應(yīng)的,下面摘出該結(jié)構(gòu)的一些內(nèi)(同前面的內(nèi)核版本,文件在source/include/linux/fs.h):

是不是發(fā)現(xiàn)和磁盤(pán)上的inode結(jié)構(gòu)存在相似的地方,但又多了一些內(nèi)容? 這里與文件映射關(guān)系最為密切的是 594行的 struct address_spaces i_data ,該結(jié)構(gòu)內(nèi)容如下:

(同前面的內(nèi)核版本,文件在source/include/linux/fs.h):

需要關(guān)注的是414行的 radix_tree_root 結(jié)構(gòu),描述如下(source/include/linux/radix-tree.h):

Height描述樹(shù)的高/深度,*rnode指向了其子樹(shù),根樹(shù)與子樹(shù)的關(guān)系:

圖中也描述了子樹(shù)的結(jié)構(gòu)的重要部分slots,slots指針數(shù)組指向了具體物理頁(yè)的頁(yè)描述符,如果基樹(shù)樹(shù)高為1,則slots可以指向[RADIX_TESS_MAP_SIZE]個(gè)頁(yè)面,如下面的結(jié)構(gòu)描述:(source/include/linux/radix-tree.h):

***再來(lái)看看物理頁(yè)描述符的結(jié)構(gòu)(source/include/linux/mm_types.h,內(nèi)容和注釋太多,貼出來(lái)行號(hào)會(huì)亂掉,我只截了部分內(nèi)容,且去掉了行號(hào)):

其中兩個(gè)字段 mapping 和index, 如果該頁(yè)被用于文件映射,則mapping用于指向文件inode的address_space結(jié)構(gòu),而index(頁(yè)索引)呢?index是與文件inode->address_space->radix_tree_root->radix_tree_node->slots[]相關(guān)的,我直接載圖好了:(且下面載圖中***說(shuō)的圖15-1就是前面已貼出的 根樹(shù)與子樹(shù)的關(guān)系圖):

總結(jié)起來(lái)就是:VFS從磁盤(pán)讀取inode,并在內(nèi)存立對(duì)應(yīng)的vfs的inode,vfs層inode中address_space中radix_tree_root中radix_tree_node中slots指向了內(nèi)存中存放文件的物理頁(yè)描述符(找到頁(yè)描述符就能找到頁(yè)面)。而頁(yè)描述符中的mapping指向了 inode的address_space, 同時(shí),頁(yè)描述符中index指定了頁(yè)在slots中的具體位置 。

責(zé)任編輯:武曉燕 來(lái)源: 搜狐
相關(guān)推薦

2018-03-01 16:25:52

Linux內(nèi)核內(nèi)存管理

2020-07-28 08:10:33

Linux內(nèi)存虛擬

2025-01-06 08:00:09

2024-04-10 13:59:44

JavaScript內(nèi)存

2020-10-27 11:00:57

LinuxRAM緩存

2022-08-08 08:31:00

Linux內(nèi)存管理

2018-12-06 10:22:54

Linux內(nèi)核內(nèi)存

2018-10-30 12:44:04

Linux系統(tǒng)內(nèi)存

2024-10-28 07:15:00

SpringBoot緩存預(yù)熱數(shù)據(jù)加載

2025-01-02 11:06:22

2015-08-03 10:43:58

Linux內(nèi)核驅(qū)動(dòng)

2020-12-29 09:11:33

LinuxLinux內(nèi)核

2018-10-17 14:25:03

VMware虛擬磁盤(pán)

2011-01-11 13:53:33

Linux管理磁盤(pán)

2025-06-10 01:22:00

2023-12-26 15:06:00

Linux內(nèi)核轉(zhuǎn)儲(chǔ)

2019-03-20 14:29:46

Linux虛擬內(nèi)存

2024-12-18 17:20:07

緩存預(yù)熱緩存系統(tǒng)Spring

2017-12-07 10:39:19

linux磁盤(pán)RAID

2014-08-05 11:38:57

linux
點(diǎn)贊
收藏

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