精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

97超碰人人爽| 国产在线欧美日韩| 三上悠亚在线观看视频| 成人黄色91| 亚洲女与黑人做爰| 91传媒在线免费观看| 青青草在线观看视频| 加勒比久久高清| 日本精品一级二级| 2025韩国大尺度电影| 国内精品偷拍视频| 国产日韩欧美高清免费| 亚洲成年人在线| 男人亚洲天堂网| 精品视频在线一区二区| 高清免费成人av| 欧美在线xxx| 久久精品色妇熟妇丰满人妻| 久久久久久一区二区三区四区别墅| 综合欧美亚洲日本| 精品乱码一区二区三区| 中文区中文字幕免费看| 欧美日一区二区在线观看| 日韩精品高清在线观看| 国产3p在线播放| 国产在线看片免费视频在线观看| 国产精品你懂的| 国偷自产av一区二区三区小尤奈| 不卡av电影在线| 欧美日本不卡高清| 中日韩美女免费视频网站在线观看 | 欧美先锋影音| 亚洲精品一区二区三区不| 免费精品99久久国产综合精品应用| 色网在线观看| 中文在线资源观看网站视频免费不卡 | 欧美成人午夜电影| 国产裸体免费无遮挡| 欧美日韩在线视频免费观看| 91色综合久久久久婷婷| 91青青草免费在线看| 91福利免费视频| 91久久亚洲| 久热精品视频在线免费观看| 91成人破解版| 婷婷综合成人| 亚洲精品一区在线观看| 最新免费av网址| a屁视频一区二区三区四区| 激情亚洲一区二区三区四区| 在线观看18视频网站| 尤物网址在线观看| 国产网站一区二区| 美日韩精品免费| 天天摸夜夜添狠狠添婷婷| 国产精品一区一区| 国产在线精品成人一区二区三区| 台湾佬中文在线| 日韩午夜免费视频| 欧美精品久久久久久久免费观看| 午夜剧场免费在线观看| 色天天久久综合婷婷女18| 亚洲桃花岛网站| 国产毛片久久久久久久| 自拍亚洲一区| 亚洲国产免费av| 国产日韩视频一区| 中文字幕日韩在线| 日韩免费高清av| 性折磨bdsm欧美激情另类| 国产精品一区免费在线| 91精品国产综合久久精品| 一女二男3p波多野结衣| 欧美风情在线视频| 欧美日韩激情一区二区三区| 色噜噜狠狠永久免费| 丁香婷婷久久| 欧美精品国产精品| 国产黄色一区二区三区 | 成人国产一区二区| 国产福利资源在线| 成人激情综合网站| 精品伊人久久大线蕉色首页| 亚洲欧洲精品视频| ww久久中文字幕| 日韩欧美精品久久| 色网站免费在线观看| 亚洲视频综合在线| 男女裸体影院高潮| 大桥未久在线视频| 欧美视频在线观看 亚洲欧| 国语对白做受xxxxx在线中国| 日韩pacopacomama| 欧美日韩精品一区二区天天拍小说| 免费精品99久久国产综合精品应用| 国产精品美女久久久久| 精品久久五月天| 中文字幕一区二区三区人妻| 精品一区二区三区中文字幕老牛 | 亚洲精品传媒| 亚洲六月丁香色婷婷综合久久 | 亚洲伦伦在线| 国产精品成人免费视频| 97人妻人人澡人人爽人人精品| 久久 天天综合| 国产亚洲二区| av中文字幕在线| 一区二区激情小说| 免费观看精品视频| 自拍偷拍亚洲| 日韩国产欧美区| 很污很黄的网站| 亚洲福利一区| 日本精品视频网站| 99热这里只有精品在线| 成人av在线电影| 亚洲欧洲中文| 欧美激情网站| 91精品国产福利在线观看| 三级男人添奶爽爽爽视频 | 国产日本欧美在线| 九色porny丨首页入口在线| 欧美日韩一级视频| www.88av| 在线观看国产精品入口| 欧美最猛性xxxxx亚洲精品| 国产又粗又猛又爽| 91视频免费播放| 欧美久久久久久久久久久久久久| 色香欲www7777综合网| 日韩欧美亚洲国产另类| 日本一道本视频| 一区二区日本视频| 99re国产在线播放| 二人午夜免费观看在线视频| 亚洲一区二区综合| 色婷婷一区二区三区在线观看| 曰本一区二区三区视频| 久久99亚洲精品| 国产精品久久久久久69| 成人手机在线视频| youjizz.com亚洲| 精品亚洲美女网站| 日韩电影免费在线观看中文字幕 | 国产精品一区二区三区美女| 日韩视频精品在线| 亚洲av无码精品一区二区| www.日韩大片| av无码久久久久久不卡网站| 亚洲成人av观看| 亚洲天堂2020| 五月婷婷激情视频| 97se亚洲国产综合自在线| 中文字幕日韩精品久久| 成人在线视频观看| 亚洲日本aⅴ片在线观看香蕉| 国产性生活大片| 久久国产人妖系列| 五月天亚洲综合| 精品日本视频| 伊人伊成久久人综合网小说| jizz国产在线观看| 99re在线精品| avav在线播放| 哺乳挤奶一区二区三区免费看| 毛片精品免费在线观看| 国产精品女同一区二区| 中文字幕一区二区三区在线不卡| 美女在线视频一区二区| 青青草国产成人a∨下载安卓| 国产精品久久久久久久久粉嫩av| 懂色av中文在线| 欧美日韩在线一区二区| 国产又粗又长又黄的视频| 蜜桃精品在线观看| 亚洲综合av一区| 国产成人免费视频网站视频社区| 日韩一区二区福利| 一级二级三级视频| 亚洲品质自拍视频| av地址在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产精品久久久久久久免费大片| 91探花在线观看| 亚洲精品一区二区久| 夜夜躁日日躁狠狠久久av| 国产精品卡一卡二| 国产91在线免费观看| 黑丝一区二区三区| 好看的日韩精品| 久久夜夜操妹子| www.99久久热国产日韩欧美.com| av观看在线免费| 同产精品九九九| 免费看黄色av| 国产精品综合二区| 成年人午夜视频在线观看| 亚洲自拍都市欧美小说| 国产精品视频免费在线观看| 成人在线影视| 欧美成人a视频| 国产亚洲欧美在线精品| 国产精品卡一卡二| 亚洲少妇中文字幕| 日韩高清中文字幕一区| 亚洲精品国产suv一区88| 精品视频高潮| 国产精品免费一区| 福利网站在线观看| 伊人精品在线观看| 亚洲高清视频在线播放| 色婷婷综合视频在线观看| 国产18无套直看片| 成人精品视频.| 久久人人爽av| 一区二区三区成人精品| 亚洲免费视频播放| 亚洲日产av中文字幕| 亚洲最大的免费| 欧美xoxoxo| 日韩在线视频国产| 欧美美女色图| 欧美va亚洲va| 高潮毛片又色又爽免费| 亚洲精品乱码久久久久久黑人| 欧亚乱熟女一区二区在线| 青青草精品视频| 国产av天堂无码一区二区三区| 91久久电影| 日韩av电影免费播放| 国产精品极品| 91中文精品字幕在线视频| 麻豆免费版在线观看| 不卡av电影院| 国产黄大片在线观看画质优化| 一本色道久久综合狠狠躁篇怎么玩 | 日韩欧美视频第二区| 小说区图片区色综合区| 国产免费高清一区| 精品国产影院| 国产精品一 二 三| 国内露脸中年夫妇交换精品| 国产精品毛片va一区二区三区| 亚洲开心激情| 成人资源av| 国内自拍欧美| 久久久免费看| 国产不卡一区| 视频一区在线免费观看| 色777狠狠狠综合伊人| 亚洲免费资源在线播放| avav在线看| 日本在线播放一区二区三区| 一区二区在线播放视频| 日韩一区欧美二区| 在线免费观看视频黄| 欧美aaa在线| 青青草原国产在线视频| 韩国视频一区二区| 人妻体体内射精一区二区| 国产xxx精品视频大全| 久久免费精品国产| 97精品视频在线观看自产线路二| 国产精品亚洲一区二区无码| 成人午夜电影久久影院| 成人免费看aa片| 国产欧美日韩麻豆91| 欧美自拍偷拍网| 亚洲欧美一区二区三区国产精品| 麻豆一区产品精品蜜桃的特点| 亚洲一区二区精品3399| 国产午夜精品无码一区二区| 欧美日韩国产一区二区三区| 337p粉嫩色噜噜噜大肥臀| 欧美日韩高清一区二区不卡 | 裤袜国产欧美精品一区| 国产精品一区二区三区在线播放| 亚洲伦理网站| 国产有色视频色综合| 欧美日韩一二三四| 日本a在线天堂| 性色一区二区| 亚洲视频在线不卡| 99久久国产综合色|国产精品| 成人在线手机视频| 亚洲最色的网站| 久久人人爽人人爽人人片av免费| 91麻豆精品国产91久久久更新时间| 高潮一区二区三区乱码| 国产亚洲综合久久| 男女视频在线| 国产精品视频区| 久久动漫网址| 国产精品jizz在线观看老狼| 国产视频一区三区| 色综合五月婷婷| 久久先锋资源网| 久久免费在线观看视频| 欧美在线观看视频一区二区三区| 午夜免费福利视频| 国产一区二区三区在线视频| 怡红院在线播放| 国产精品女人久久久久久| 免费成人蒂法| 黄色一级片国产| 麻豆精品新av中文字幕| 亚洲熟女乱综合一区二区三区| 亚洲三级久久久| 奴色虐av一区二区三区| 亚洲国产高潮在线观看| 成人在线播放| 国产精品看片资源| 欧美日韩一区二区三区四区不卡 | 麻豆视频一区二区| 美国黄色一级毛片| 亚洲国产色一区| aa视频在线免费观看| 少妇高潮久久久久久潘金莲| 99在线视频影院| av日韩中文字幕| 偷拍欧美精品| 色婷婷成人在线| 国产亚洲一区二区三区四区| 91视频免费网址| 亚洲精品一区二区三区精华液| 久草免费在线| 国产精品丝袜白浆摸在线| 自拍欧美一区| 欧美激情国产精品日韩| 丰满少妇久久久久久久| a级黄色片免费看| 欧美一区二区三区性视频| 午夜免费播放观看在线视频| 国产精品99久久久久久www| 日韩欧美ww| 97国产在线播放| www.欧美亚洲| 日韩精品视频免费播放| 精品久久国产老人久久综合| 免费在线播放电影| 成人在线免费网站| 亚洲小说区图片区| 最新版天堂资源在线| 9l视频自拍蝌蚪9l视频成人| 久久人人爽人人| 成人台湾亚洲精品一区二区| 日韩精品一区二区免费| 风流少妇一区二区| 精品一级少妇久久久久久久| 精品久久久久一区| 国产精品偷拍| 国产亚洲精品美女久久久m| 国产一级一区二区| 日韩乱码人妻无码中文字幕久久| 色呦呦一区二区三区| freemovies性欧美| 国产欧美日韩精品在线观看| 亚欧美无遮挡hd高清在线视频| 日本精品一区在线| 亚洲精品亚洲人成人网| 高h震动喷水双性1v1| 97久久伊人激情网| 免费看成人哺乳视频网站| 热久久精品免费视频| 国产精品视频yy9299一区| 国产美女明星三级做爰| 欧美大片网站在线观看| 欧美偷窥清纯综合图区| 精品久久久久久无码国产| 成人免费小视频| 亚洲第一成年人网站| 欧美一级片久久久久久久| 日韩电影免费在线观看| 色网站在线视频| 亚洲国产日韩精品| 成人三级黄色免费网站| 91嫩草免费看| 美女黄网久久| 翔田千里88av中文字幕| 亚洲国产福利在线| 久久er热在这里只有精品66| 欧美一二三不卡| 久久久久国色av免费看影院| 中文字幕在线2018| 久久久久久久久久国产| 国精一区二区| 又色又爽又黄18网站| 色网站国产精品| 欧美黑人猛交的在线视频| 任我爽在线视频精品一| 国产成人精品免费在线| 精品国产乱子伦| 欧美日韩ab片| 日本一二区不卡| 中文字幕一区二区人妻电影丶| 欧美性色黄大片| 国产v日韩v欧美v| 免费观看黄色的网站| 久久久99久久| 国产 欧美 精品|