成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux內核如何管理內存換入換出,如何實現磁盤緩存?

存儲 存儲軟件
內存swap的機制不再介紹,其實從問題來看,是想知道,內存頁是怎么與換出到磁盤上的內容一一對應的。答案是通過頁表。

[[251672]]

 1:linux是如何管理內存換入換出的?

內存swap的機制不再介紹,其實從問題來看,是想知道,內存頁是怎么與換出到磁盤上的內容一一對應的。答案是通過頁表。拿32位系統舉例子:

 

處理器通過頁表來把一個虛擬地址轉化為實際的物理內存地址。每個進程有屬于它自己的一組頁表;無論何時發生了進程切換,相應的會發生用戶空間的頁表切換。mm_struct中有一個pdg域,就指向該進程所使用的頁表集。對每一個虛擬頁在頁表中都有對應的一個頁表項(PTE),通常x86下的一頁是一個4字節的如下記錄(pgd和pte的結構類似,12-31位是page base描述,0-11位是屬性描述,不過pgd中的pagebase 指向的pte所在頁面的起始地址,而pte的page base指向的物理頁面的起始地址。假設下面是一條pte對頁的描述記錄):

 

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

A:從1位至31位為空:該頁不在進程的地址空間,需在請求調頁

B:1位至31位至少有一位被至位:說明該頁被換出到磁盤。

針對B情況作說明:如果有一位被至位,而PTE的關于該頁的條目被以如下方式解讀:

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

我們再來看swap區,每個活動的swap區在內存中有一個swap區描述符,系統所有的交換區組成一個鏈表,交換區結構為swap_info_struct,該結構中有個重要字段 :struct block_device * bdev ,存放交換區的塊設備的描述符,就是你格式分成swap的設備/分區。

***來看磁盤上的swap區是什么組織的:

每個交換區由一組pageslot組成(一般這些頁槽在磁盤上連續存放),就是說由一組4k大小的塊組成,每塊包含一個換出的頁,。交換區的***個page slot(0號頁槽)用來***存放交換區的管理信息,可用來存放換出頁的***個頁槽為1號頁槽(頁槽索引為1)。所以上面描述換出頁的頁表條目時說“1位至31位至少有一位被至位”,因為0號頁槽不能存換出頁。

到這里,不知道大家對swap頁的標記有沒有一個大體的概念?

2:內核讀入一個文件時,內核是在哪里記錄內存頁和磁盤塊的對應關系,以便將來把臟數據flush回磁盤?具體來說,是在哪些數據結構里記錄這些信息的?

先來看文件在磁盤和內存中的存放方式(ext3舉例):

磁盤:文件由inode以及inode指向的具體數據塊組成,來看看磁盤的Inode結構的描述(source/fs/ext4/ext3.h 下面為3.14內核的中的,source是指內核代碼根目錄,下同。內核版本不同,行號可能不同):

 

第281行有一個“__le32 i_block[EXT3_N_BLOCKS];”

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

下面來說說文件在內存中的存放,文件在內存中存放由VSF層管理,VFS層在打開文件時在內存中依據磁盤的 ext3_inode而建立VFS的inode結構,VFS的inode與磁盤inode是一一對應的,下面摘出該結構的一些內(同前面的內核版本,文件在source/include/linux/fs.h):

是不是發現和磁盤上的inode結構存在相似的地方,但又多了一些內容? 這里與文件映射關系最為密切的是 594行的 struct address_spaces i_data ,該結構內容如下:

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

需要關注的是414行的 radix_tree_root 結構,描述如下(source/include/linux/radix-tree.h):

Height描述樹的高/深度,*rnode指向了其子樹,根樹與子樹的關系:

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

***再來看看物理頁描述符的結構(source/include/linux/mm_types.h,內容和注釋太多,貼出來行號會亂掉,我只截了部分內容,且去掉了行號):

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

總結起來就是:VFS從磁盤讀取inode,并在內存立對應的vfs的inode,vfs層inode中address_space中radix_tree_root中radix_tree_node中slots指向了內存中存放文件的物理頁描述符(找到頁描述符就能找到頁面)。而頁描述符中的mapping指向了 inode的address_space, 同時,頁描述符中index指定了頁在slots中的具體位置 。

責任編輯:武曉燕 來源: 搜狐
相關推薦

2018-03-01 16:25:52

Linux內核內存管理

2020-07-28 08:10:33

Linux內存虛擬

2025-01-06 08:00:09

2022-08-08 08:31:00

Linux內存管理

2024-04-10 13:59:44

JavaScript內存

2020-10-27 11:00:57

LinuxRAM緩存

2018-10-30 12:44:04

Linux系統內存

2018-12-06 10:22:54

Linux內核內存

2024-10-28 07:15:00

SpringBoot緩存預熱數據加載

2025-01-02 11:06:22

2018-10-17 14:25:03

VMware虛擬磁盤

2015-08-03 10:43:58

Linux內核驅動

2020-12-29 09:11:33

LinuxLinux內核

2024-12-18 17:20:07

緩存預熱緩存系統Spring

2023-12-26 15:06:00

Linux內核轉儲

2011-01-11 13:53:33

Linux管理磁盤

2019-03-20 14:29:46

Linux虛擬內存

2025-06-10 01:22:00

2017-12-07 10:39:19

linux磁盤RAID

2014-08-05 11:38:57

linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视频网址 | 国产一区二区三区高清 | 精品美女久久久久久免费 | 99色视频 | 成人免费观看男女羞羞视频 | 色.com| 久久久久亚洲精品 | 毛片一级片| 欧美精品欧美精品系列 | 观看av | aa级毛片毛片免费观看久 | 欧美一区二| 777zyz色资源站在线观看 | 久久精品国产一区 | 亚洲av毛片成人精品 | 超碰激情 | 国产韩国精品一区二区三区 | 国产成人精品久久二区二区 | 91九色porny首页最多播放 | 91精品国产一区二区三区香蕉 | 久久久久久久国产精品影院 | 欧产日产国产精品视频 | 韩国精品一区 | 国产精品久久久久久久久久久久 | 欧美精品一区二区三区在线播放 | 特级特黄特色的免费大片 | 久久久久久久久久久久久久国产 | 久久网亚洲 | 中文字幕久久精品 | 久久久www成人免费无遮挡大片 | 免费一级淫片aaa片毛片a级 | 综合久久网 | 国产精品mv在线观看 | 91干b| 免费99视频 | 亚洲综合大片69999 | 一级毛片免费视频 | 国产 欧美 日韩 一区 | 视频一区中文字幕 | 99精品视频免费观看 | 男女视频在线观看 |