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

一文看懂什么是頁緩存(Page Cache)

商務辦公
我們知道文件一般存放在硬盤(機械硬盤或固態硬盤)中,CPU 并不能直接訪問硬盤中的數據,而是需要先將硬盤中的數據讀入到內存中,然后才能被 CPU 訪問。

[[409491]]

本文轉載自微信公眾號「Linux內核那些事」,作者songsong001 。轉載本文請聯系Linux內核那些事公眾號。

我們知道文件一般存放在硬盤(機械硬盤或固態硬盤)中,CPU 并不能直接訪問硬盤中的數據,而是需要先將硬盤中的數據讀入到內存中,然后才能被 CPU 訪問。

由于讀寫硬盤的速度比讀寫內存要慢很多(DDR4 內存讀寫速度是機械硬盤500倍,是固態硬盤的200倍),所以為了避免每次讀寫文件時,都需要對硬盤進行讀寫操作,Linux 內核使用 頁緩存(Page Cache) 機制來對文件中的數據進行緩存。

本文使用的 Linux 內核版本為:Linux-2.6.23

什么是頁緩存

為了提升對文件的讀寫效率,Linux 內核會以頁大小(4KB)為單位,將文件劃分為多數據塊。當用戶對文件中的某個數據塊進行讀寫操作時,內核首先會申請一個內存頁(稱為 頁緩存)與文件中的數據塊進行綁定。如下圖所示:

如上圖所示,當用戶對文件進行讀寫時,實際上是對文件的 頁緩存 進行讀寫。所以對文件進行讀寫操作時,會分以下兩種情況進行處理:

  • 當從文件中讀取數據時,如果要讀取的數據所在的頁緩存已經存在,那么就直接把頁緩存的數據拷貝給用戶即可。否則,內核首先會申請一個空閑的內存頁(頁緩存),然后從文件中讀取數據到頁緩存,并且把頁緩存的數據拷貝給用戶。
  • 當向文件中寫入數據時,如果要寫入的數據所在的頁緩存已經存在,那么直接把新數據寫入到頁緩存即可。否則,內核首先會申請一個空閑的內存頁(頁緩存),然后從文件中讀取數據到頁緩存,并且把新數據寫入到頁緩存中。對于被修改的頁緩存,內核會定時把這些頁緩存刷新到文件中。

頁緩存的實現

前面主要介紹了頁緩存的作用和原理,接下來我們將會分析 Linux 內核是怎么實現頁緩存機制的。

1. address_space

在 Linux 內核中,使用 file 對象來描述一個被打開的文件,其中有個名為 f_mapping 的字段,定義如下:

  1. struct file { 
  2.     ... 
  3.     struct address_space *f_mapping; 
  4. }; 

從上面代碼可以看出,f_mapping 字段的類型為 address_space 結構,其定義如下:

  1. struct address_space { 
  2.     struct inode           *host;      /* owner: inode, block_device */ 
  3.     struct radix_tree_root page_tree;  /* radix tree of all pages */ 
  4.     rwlock_t               tree_lock;  /* and rwlock protecting it */ 
  5.     ... 
  6. }; 

address_space 結構其中的一個作用就是用于存儲文件的 頁緩存,下面介紹一下各個字段的作用:

  • host:指向當前 address_space 對象所屬的文件 inode 對象(每個文件都使用一個 inode 對象表示)。
  • page_tree:用于存儲當前文件的 頁緩存。
  • tree_lock:用于防止并發訪問 page_tree 導致的資源競爭問題。

從 address_space 對象的定義可以看出,文件的 頁緩存 使用了 radix樹 來存儲。

radix樹:又名基數樹,它使用鍵值(key-value)對的形式來保存數據,并且可以通過鍵快速查找到其對應的值。內核以文件讀寫操作中的數據 偏移量 作為鍵,以數據偏移量所在的 頁緩存 作為值,存儲在 address_space 結構的 page_tree 字段中。

下圖展示了上述各個結構之間的關系:

如果對 radix樹 不太了解,可以簡單將其看成可以通過文件偏移量快速找到其所在 頁緩存 的結構,有機會我會另外寫一篇關于 radix樹 的文章。

2. 讀文件操作

現在我們來分析一下讀取文件數據的過程,用戶可以通過調用 read 系統調用來讀取文件中的數據,其調用鏈如下:

  1. read() 
  2. └→ sys_read() 
  3.    └→ vfs_read() 
  4.       └→ do_sync_read() 
  5.          └→ generic_file_aio_read() 
  6.             └→ do_generic_file_read() 
  7.                └→ do_generic_mapping_read() 

從上面的調用鏈可以看出,read 系統調用最終會調用 do_generic_mapping_read 函數來讀取文件中的數據,其實現如下:

  1. void 
  2. do_generic_mapping_read(struct address_space *mapping, 
  3.                         struct file_ra_state *_ra, 
  4.                         struct file *filp, 
  5.                         loff_t *ppos, 
  6.                         read_descriptor_t *desc
  7.                         read_actor_t actor) 
  8.     struct inode *inode = mapping->host; 
  9.     unsigned long index
  10.     struct page *cached_page; 
  11.     ... 
  12.  
  13.     cached_page = NULL
  14.     index = *ppos >> PAGE_CACHE_SHIFT; 
  15.     ... 
  16.  
  17.     for (;;) { 
  18.         struct page *page; 
  19.         ... 
  20.  
  21. find_page: 
  22.         // 1. 查找文件偏移量所在的頁緩存是否存在 
  23.         page = find_get_page(mapping, index); 
  24.         if (!page) { 
  25.             ... 
  26.             // 2. 如果頁緩存不存在, 那么跳到 no_cached_page 進行處理 
  27.             goto no_cached_page;  
  28.         } 
  29.         ... 
  30.  
  31. page_ok: 
  32.         ... 
  33.         // 3. 如果頁緩存存在, 那么把頁緩存的數據拷貝到用戶應用程序的內存中 
  34.         ret = actor(desc, page, offset, nr); 
  35.         ... 
  36.         if (ret == nr && desc->count
  37.             continue
  38.         goto out
  39.         ... 
  40.  
  41. readpage: 
  42.         // 4. 從文件讀取數據到頁緩存中 
  43.         error = mapping->a_ops->readpage(filp, page); 
  44.         ... 
  45.         goto page_ok; 
  46.         ... 
  47.  
  48. no_cached_page: 
  49.         if (!cached_page) { 
  50.             // 5. 申請一個內存頁作為頁緩存 
  51.             cached_page = page_cache_alloc_cold(mapping); 
  52.             ... 
  53.         } 
  54.  
  55.         // 6. 把新申請的頁緩存添加到文件頁緩存中 
  56.         error = add_to_page_cache_lru(cached_page, mapping, index, GFP_KERNEL); 
  57.         ... 
  58.         page = cached_page; 
  59.         cached_page = NULL
  60.         goto readpage; 
  61.     } 
  62.  
  63. out
  64.     ... 

do_generic_mapping_read 函數的實現比較復雜,經過精簡后,上面代碼只留下最重要的邏輯,可以歸納為以下幾個步驟:

  • 通過調用 find_get_page 函數查找要讀取的文件偏移量所對應的頁緩存是否存在,如果存在就把頁緩存中的數據拷貝到應用程序的內存中。
  • 否則調用 page_cache_alloc_cold 函數申請一個空閑的內存頁作為新的頁緩存,并且通過調用 add_to_page_cache_lru 函數把新申請的頁緩存添加到文件頁緩存和 LRU 隊列中(后面會介紹)。
  • 通過調用 readpage 接口從文件中讀取數據到頁緩存中,并且把頁緩存的數據拷貝到應用程序的內存中。

從上面代碼可以看出,當頁緩存不存在時會申請一塊空閑的內存頁作為頁緩存,并且通過調用 add_to_page_cache_lru 函數把其添加到文件的頁緩存和 LRU 隊列中。我們來看看 add_to_page_cache_lru 函數的實現:

  1.  int add_to_page_cache_lru(struct page *page, struct address_space *mapping, 
  2.                            pgoff_t offset, gfp_t gfp_mask) 
  3.     // 1. 把頁緩存添加到文件頁緩存中 
  4.     int ret = add_to_page_cache(page, mapping, offset, gfp_mask); 
  5.     if (ret == 0) 
  6.         lru_cache_add(page); // 2. 把頁緩存添加到 LRU 隊列中 
  7.     return ret; 

add_to_page_cache_lru 函數主要完成兩個工作:

  • 通過調用 add_to_page_cache 函數把頁緩存添加到文件頁緩存中,也就是添加到 address_space 結構的 page_tree 字段中。
  • 通過調用 lru_cache_add 函數把頁緩存添加到 LRU 隊列中。LRU 隊列用于當系統內存不足時,對頁緩存進行清理時使用。

總結 

本文主要介紹了 頁緩存 的作用和原理,并且介紹了在讀取文件數據時對頁緩存的處理過程。本文并沒有介紹寫文件操作對應的頁緩存處理和當系統內存不足時怎么釋放頁緩存,有興趣的話可以自行閱讀相關的代碼實現。

 

責任編輯:武曉燕 來源: Linux內核那些事
相關推薦

2021-02-08 22:23:16

云計算辦公硬件

2022-03-29 08:02:01

數字孿生能源程序

2021-02-21 11:25:17

云計算IaaSPaaS

2021-10-17 19:48:10

擴展頁表虛擬機

2020-03-31 14:40:24

HashMap源碼Java

2016-08-18 00:21:12

網絡爬蟲抓取網絡

2025-07-11 01:45:00

SIM卡模塊識別

2024-08-12 12:30:27

2019-05-22 09:50:42

Python沙箱逃逸網絡攻擊

2019-07-01 09:22:15

Linux操作系統硬件

2021-08-02 06:56:19

TypeScript編程語言編譯器

2025-01-20 09:15:00

iOS 18.3蘋果iOS 18

2022-09-23 15:07:32

東數西算數據中心IT

2025-07-18 11:52:48

2023-07-14 08:00:00

ORMRust ORMSQL

2025-06-27 02:15:00

芯片流程數字芯片

2025-01-15 09:06:57

servlet服務器Java

2022-09-29 13:09:38

DataClassPython代碼

2023-05-11 15:24:12

2024-05-09 10:11:30

點贊
收藏

51CTO技術棧公眾號

韩国av在线免费观看| 999精品久久久| 人成在线免费网站| 欧美激情综合五月色丁香| 成人精品久久一区二区三区| 麻豆精品国产免费| 欧洲在线一区| 欧美精品久久99久久在免费线| 免费的av在线| 日本一级在线观看| 久99久精品视频免费观看| 日韩视频免费在线观看| 国模私拍在线观看| 欧美少妇激情| 欧美天堂在线观看| 久久久久亚洲av无码专区喷水| 深夜福利视频一区| 国模一区二区三区白浆| 亚洲一区二区成人| 日韩一区二区在线看| 久久精品99国产| 日韩激情美女| 中文字幕乱码亚洲精品一区| 黄色小网站91| 99久久久无码国产精品免费| 久久不射中文字幕| 久久久亚洲欧洲日产国码aⅴ| 亚洲国产精品一区二区久久hs| 亚洲丝袜啪啪| 亚洲国产三级网| 久久综合桃花网| jvid一区二区三区| 欧美性xxxxxxxxx| 日本一级黄视频| 含羞草www国产在线视频| 国产女人aaa级久久久级| 精品乱码一区| 风流少妇一区二区三区91| 国产一区二区伦理| 成人激情黄色网| 影音先锋国产在线| 玖玖国产精品视频| 日本精品视频在线播放| 久久不卡免费视频| 亚洲激情不卡| 久久久久国产精品一区| 久久99久久久| av毛片在线免费看| 99精品国产一区二区三区| 亚洲精品国产suv| 丰满人妻一区二区三区免费视频棣| 亚洲一区二区av| 欧美日韩精品一区二区| 国产精品入口免费软件| 日韩电影大全网站| 91福利精品第一导航| 欧美精品第三页| 日韩三级影视| 婷婷综合五月| 久久久久久久性| 精品国产_亚洲人成在线| 日韩在线观看视频网站| 成人高清免费观看| 欧美精品一区二区三区在线看午夜| 污视频网站在线播放| 91视频精品在这里| 欧美一区二区三区在线播放| av在线二区| 中文字幕在线不卡国产视频| 中文字幕在线亚洲精品| av免费在线免费观看| 亚洲午夜久久久久久久久电影网| 僵尸世界大战2 在线播放| 亚洲精品成人图区| 欧美三级中文字幕在线观看| 一级黄色在线播放| 99国产精品免费网站| 精品夜色国产国偷在线| 日本猛少妇色xxxxx免费网站| 99精品在线观看| 欧美黄色免费网站| www.伊人久久| 久久国产精品99精品国产| 亚洲a级在线观看| 日本精品久久久久久| 国产三级一区二区| 欧美日韩在线免费观看视频| а_天堂中文在线| 欧美午夜美女看片| mm131亚洲精品| 91夜夜蜜桃臀一区二区三区| 亚洲香蕉av在线一区二区三区| 久草手机视频在线观看| 99精品欧美| 国产日韩av在线播放| 欧美视频在线观看一区二区三区| 国产欧美一区二区精品久导航 | 国产美女主播一区| 精品国产乱码久久久久久蜜臀网站| 成人av午夜影院| 台湾成人av| 美足av综合网| 欧美三级日韩在线| 国产二级一片内射视频播放| 99视频精品全国免费| 97热精品视频官网| 一区二区三区免费观看视频| 99久久精品免费精品国产| 中文字幕剧情在线观看一区| 成人ssswww在线播放| 在线观看91av| 精品国产成人亚洲午夜福利| 国产精品分类| 国产日产欧美a一级在线| 日韩精品福利| 亚洲国产日韩综合久久精品| 粉色视频免费看| 奇米777国产一区国产二区| 免费av在线一区| 瑟瑟视频在线免费观看| 99久久99久久精品国产片果冻| 伊人婷婷久久| 欧亚一区二区| 日韩电影在线观看中文字幕| 亚洲av鲁丝一区二区三区 | www.桃色.com| 欧美特黄一级大片| 欧日韩在线观看| 免费国产羞羞网站视频| 亚洲欧美电影一区二区| 中文字幕亚洲乱码| 欧美午夜精品一区二区三区电影| 午夜精品久久17c| 性生活视频软件| 亚洲欧洲综合另类| 国内外免费激情视频| 老司机凹凸av亚洲导航| 欧美激情一区二区三区久久久 | 一本一本久久a久久精品综合小说| 日本视频www| 成人手机在线视频| 日韩精品福利片午夜免费观看| 欧美97人人模人人爽人人喊视频| 中文字幕亚洲欧美日韩在线不卡| 天天爽夜夜爽人人爽| 91视频观看免费| 黄色动漫网站入口| 日韩精品免费一区二区夜夜嗨| 97碰碰碰免费色视频| 天堂资源最新在线| 色综合夜色一区| 全黄一级裸体片| 美女网站久久| 亚洲v欧美v另类v综合v日韩v| 欧美片第1页| 夜夜躁日日躁狠狠久久88av| 成人小视频在线播放| 亚洲国产成人自拍| 在线观看免费的av| 亚洲视频电影在线| 91蜜桃网站免费观看| 美女精品导航| 亚洲国产天堂久久综合| 国偷自拍第113页| 久久精品人人爽人人爽| 免费涩涩18网站入口| 久久神马影院| 亚洲a区在线视频| 国产精品蜜芽在线观看| 精品无人区乱码1区2区3区在线| 一级成人黄色片| 欧美国产一区二区在线观看| www.成人黄色| 亚洲私人影院| 欧美最大成人综合网| 免费一级欧美在线观看视频| 久久夜精品香蕉| 好吊色视频一区二区| 色偷偷久久人人79超碰人人澡| 大吊一区二区三区| 国产一区二区美女诱惑| 欧美日韩在线一| 日韩电影免费网站| 999精品视频一区二区三区| 色在线中文字幕| 日韩天堂在线视频| 欧美一区,二区| 欧美午夜片在线观看| 麻豆亚洲av成人无码久久精品| 99国产精品视频免费观看| 九一精品在线观看| 国产一区久久| 无码免费一区二区三区免费播放 | 久久精品国产美女| 欧美成人xxxx| 97色在线观看免费视频| 免费av在线| 亚洲男人的天堂在线播放| 国产精品毛片一区视频播 | 欧美国产97人人爽人人喊| 下面一进一出好爽视频| 天堂蜜桃91精品| 国产精品视频网站在线观看| 国产影视一区| 国产成人亚洲欧美| 四虎国产精品永久在线国在线| 久久久久久有精品国产| 午夜老司机在线观看| 亚洲精品动漫久久久久| 国产福利第一页| 91成人免费网站| 国产午夜福利精品| 亚洲欧美视频在线观看视频| 性色av蜜臀av色欲av| 国产丶欧美丶日本不卡视频| 亚洲无吗一区二区三区| 免播放器亚洲| 日韩精品综合在线| 2023国产精品久久久精品双| 欧美日韩免费观看一区| 伦理一区二区| 福利视频一区二区三区| 国产精品久久久久久久久久齐齐| 91av国产在线| rebdb初裸写真在线观看| 精品中文字幕乱| 麻豆视频在线观看免费| 中日韩美女免费视频网址在线观看| 五月天婷婷视频| 精品盗摄一区二区三区| 精品国产亚洲一区二区麻豆| 欧美男生操女生| 在线观看毛片av| 欧美色区777第一页| 天天干天天操天天爱| 五月天中文字幕一区二区| 久久久久久久久久综合| 亚洲伦理在线精品| 亚洲国产美女视频| 亚洲欧洲国产日本综合| 小嫩苞一区二区三区| 中文字幕一区二区三| 97精品在线播放| 1区2区3区国产精品| 天天做夜夜爱爱爱| 亚洲男人天堂av| 五月天丁香激情| 亚洲综合丝袜美腿| 久久免费视频6| 亚洲午夜久久久久久久久电影院 | 欧美午夜精品久久久久久超碰 | 欧美亚洲日本在线| 亚洲精品视频免费观看| 欧美片一区二区| 亚洲一区二区四区蜜桃| 国产精品美女毛片真酒店| 午夜精品福利在线| 东京热一区二区三区四区| 色诱视频网站一区| 伊人22222| 日韩欧美视频一区| 色婷婷av一区二区三区之e本道| 亚洲精品在线电影| 日产精品久久久久久久性色| 夜夜嗨av色综合久久久综合网| av成人手机在线| 久久精品福利视频| 免费网站在线观看人| 88xx成人精品| 97人人做人人爽香蕉精品| 成人国产精品久久久| 4438全国亚洲精品观看视频| 精品国产乱码久久久久久蜜柚 | 亚洲视频777| 天天综合视频在线观看| 九九热这里只有精品6| 超碰激情在线| 国产精品你懂得| 欧州一区二区三区| 欧美国产视频在线观看| 欧美hd在线| 99视频在线免费播放| 日av在线不卡| 久久久久99人妻一区二区三区| 91麻豆6部合集magnet| 色撸撸在线视频| 亚洲国产精品久久人人爱| 狠狠人妻久久久久久综合| 欧美福利一区二区| 亚洲欧美日韩综合在线| 久久精品2019中文字幕| 国产乱码精品一区二三赶尸艳谈| 国产精品美女免费| 国产美女撒尿一区二区| 午夜精品区一区二区三| 亚洲成人原创| 手机在线国产视频| 久久亚洲二区三区| 国产探花在线免费观看| 色综合天天在线| 国产成人精品无码高潮| 亚洲性夜色噜噜噜7777| 欧美videos另类精品| 国产精品一区二区三| 久久精品国产亚洲5555| 日本三日本三级少妇三级66| 丝袜美腿亚洲一区| 黄色av电影网站| 亚洲三级久久久| 无码免费一区二区三区| 亚洲第一黄色网| av黄色在线| 国产精品亚洲自拍| 欧美日韩xxxx| 蜜臀av无码一区二区三区| 精品一区二区成人精品| 谁有免费的黄色网址| 精品国产老师黑色丝袜高跟鞋| 国产免费福利视频| x99av成人免费| 香蕉视频亚洲一级| 精品久久一区二区三区蜜桃| 精品白丝av| 97免费公开视频| 亚洲免费看黄网站| 97国产精品久久久| 这里只有精品丝袜| jizzjizz少妇亚洲水多| 日本不卡免费新一二三区| 久久一二三四| 少妇毛片一区二区三区| 五月天一区二区| 欧美一区二不卡视频| 久久久久一本一区二区青青蜜月 | 欧美二区三区在线| 在线亚洲成人| 97人妻精品一区二区三区免| 亚洲一卡二卡三卡四卡无卡久久| av官网在线观看| 欧美成人免费全部观看天天性色| 99精品女人在线观看免费视频| 一区二区三区四区在线视频| 琪琪一区二区三区| 日本欧美一区二区三区不卡视频| 在线观看av一区| yiren22综合网成人| 国产精品永久免费视频| 久久理论电影| 美女被艹视频网站| 亚洲一区二区精品视频| 色婷婷综合视频| 91爱视频在线| 蜜桃一区二区| 8x8x最新地址| ...av二区三区久久精品| 精品国产va久久久久久久| 欧美激情一区二区三区久久久 | 五月天色婷婷综合| 国产在线精品一区二区| 久草视频免费在线播放| 亚洲第一天堂av| 巨茎人妖videos另类| 亚洲国产午夜伦理片大全在线观看网站| 蜜桃一区二区三区四区| 农村妇女精品一区二区| 亚洲国产精品yw在线观看| 韩国美女久久| 在线视频福利一区| 高清在线观看日韩| 6080午夜伦理| 日韩中文综合网| 成功精品影院| 日本在线视频www| 日韩美女啊v在线免费观看| 亚洲精品国产手机| 欧美在线国产精品| 日韩综合精品| 国产精品成人无码专区| 91国产免费看| 日本无删减在线| 欧美二区三区在线| 国产精品综合二区| 69国产精品视频免费观看| 久久不射电影网| 伊人精品一区| 99国产精品免费视频| 欧美性猛交xxxx偷拍洗澡| 91青青在线视频| 国产日韩在线一区二区三区| 日韩成人一区二区| 2021亚洲天堂| 国产一区二区三区中文| 91精品国产乱码久久久竹菊| 国产三级三级三级看三级| 一区二区欧美精品| 成年午夜在线| 精品国产免费人成电影在线观...| 久久国产精品99精品国产 | 91jq激情在线观看| 一区二区视频国产|