page cache ,buffer cache,swap space

前幾天師兄問了一個問題,一個程序,需要讀入文件,它第一次執行時間和第二次執行時間一樣嗎?將文件改名後呢,umount文件系統後再mount上呢?

這裏實際上涉及到buffer cache ,page cache兩個概念。
先解釋一下
buffer cache 也叫塊緩衝,是對物理磁盤上的一個磁盤塊進行的緩衝,其大小爲通常爲1k,磁盤塊也是磁盤的組織單位。設立buffer cache的目的是爲在程序多次訪問同一磁盤塊時,減少訪問時間。系統將磁盤塊首先讀入buffer cache 如果cache空間不夠時,會通過一定的策略將一些過時或多次未被訪問的buffer cache清空。程序在下一次訪問磁盤時首先查看是否在buffer cache找到所需塊,命中可減少訪問磁盤時間。不命中時需重新讀入buffer cache。對buffer cache 的寫分爲兩種,一是直接寫,這是程序在寫buffer cache後也寫磁盤,要讀時從buffer cache 上讀,二是後臺寫,程序在寫完buffer cache 後並不立即寫磁盤,因爲有可能程序在很短時間內又需要寫文件,如果直接寫,就需多次寫磁盤了。這樣效率很低,而是過一段時間後由後臺寫,減少了多次訪磁盤 的時間。
buffer cache 是由物理內存分配,linux系統爲提高內存使用率,會將空閒內存全分給buffer cache ,當其他程序需要更多內存時,系統會減少cahce大小,

page cache 也叫頁緩衝或文件緩衝,是由好幾個磁盤塊構成,大小通常爲4k,在64位系統上爲8k,構成的幾個磁盤塊在物理磁盤上不一定連續,文件的組織單位爲一頁, 也就是一個page cache大小,文件讀取是由外存上不連續的幾個磁盤塊,到buffer cache,然後組成page cache,然後供給應用程序。

page cache在linux讀寫文件時,它用於緩存文件的邏輯內容,從而加快對磁盤上映像和數據的訪問。具體說是加速對文件內容的訪問,buffer cache緩存文件的具體內容——物理磁盤上的磁盤塊,這是加速對磁盤的訪問。

swap space 交換空間,是虛擬內存的表現形式。系統爲了應付一些需要大量內存的應用,而將磁盤上的空間做內存使用,當物理內存不夠用時,將其中一些暫時不需的數據交換 到交換空間,也叫交換文件或頁面文件中。做虛擬內存的好處是讓進程以爲好像可以訪問整個系統物理內存。因爲在一個進程訪問數據時,其他進程的數據會被交換 到交換空間中。

現在來分析問題,程序第一次執行時,讀取文件過程,從磁盤讀取到buffer cache 到page cache再到應用程序的進程空間。第二次執行時由於buffer cache中已經有了部分或全部的文件內容,這樣執行時間就要減少些。當然這也要視情景而定,具體有很多。當文件改名後,其數據的物理地址未變,程序執行 時通過文件指針仍能在內存上找到正確數據所以執行時間應該和第二次相同,但是umount文件系統後,這些buffer cache 和page cache信息應該會刪除,因爲若重新掛載另一文件系統時,同樣的文件名可能不對應同一個文件,所以這時執行時間應該和第一次一樣。(個人看法,待修正)

linux中,應用程序訪問文件也就是內核訪問page cache的API有兩種方式,1.通過VFS直接在不同文件的Cache之間或者Cache與應用程序所提供的用戶空間buffer之間拷貝數據,其實現原理如圖7所示。


2,是通過VMM(虛擬內存管理)將Cache項映射到用戶空間,使得應用程序可以像使用內存指針一樣訪問文件,Memory map訪問Cache的方式在內核中是採用請求頁面機制實現的,其工作過程如圖8所示。



首先,應用程序調用mmap(圖中1),陷入到內核中後調用do_mmap_pgoff(圖中2)。該函數從應用程序的地址空間中分配一段區域作爲映射的 內存地址,並使用一個VMA(vm_area_struct)結構代表該區域,之後就返回到應用程序(圖中3)。當應用程序訪問mmap所返回的地址指針 時(圖中4),由於虛實映射尚未建立,會觸發缺頁中斷(圖中5)。之後系統會調用缺頁中斷處理函數(圖中6),在缺頁中斷處理函數中,內核通過相應區域的 VMA結構判斷出該區域屬於文件映射,於是調用具體文件系統的接口讀入相應的Page Cache項(圖中7、8、9),並填寫相應的虛實映射表。經過這些步驟之後,應用程序就可以正常訪問相應的內存區域了。


總的訪問圖如下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章