direct io是一種不用核心緩存的io,它可以做到直接将使用者空間的記憶體直接寫入磁盤或者将磁盤資料直接讀到使用者空間的緩沖區,這種政策就是不用核心的緩存而使用使用者自己設計的緩存,這一般在資料庫系統中用到,初用linux的人在調用free指令的時候都會大吃一驚,為何檔案cache占用了那麼多的記憶體,太可怕了啊,其實這正是表明了該使用者是初使用者,這正是linux的風格,空閑記憶體閑着也是閑着,既然沒有使用者用,那麼就用來緩存檔案資料,這樣可以盡量加速linux的使用者感覺速度,隻要使用者實際要用記憶體的時候,檔案cahce肯定會讓位,那麼有人會問,即使檔案cache會讓位,那麼将檔案cahce換出也需要時間,其實這個問題的解決很簡單,就是維持系統空閑記憶體在一個範圍内,這就是kswap的作用,可以做一個試驗,就是在系統初啟動的時候,執行cp -r /etc /home/zhaoya/test/,等待,看表,足足八秒,然後執行rm -rf /home/zhaoya/test/etc/,然後再執行cp -r /etc /home/zhaoya/test/,發現隻用了3秒不到,這就是檔案緩存的作用,可是不管怎麼說有的使用者還是對檔案cache不看好,其實不想用檔案cache的人有兩類,一類是覺得檔案cache占用記憶體太多,另一類就是擁有自己的使用者空間的cahce算法,不需要核心的cahce,這兩種中,第一種是錯誤的想法,第二種才是正确的想法。于是linux沒有提供禁用檔案cache的系統調用或者/proc接口,但是卻給了對于單獨檔案禁用cahce的方法,也就是說,如果說你想禁用cahce,那麼如果你是覺得它占用記憶體太多,那麼你就忍忍吧,好好再學學linux,系統不會讓你禁用整個系統的檔案cache,如果你是覺得自己有使用者空間的cahce,那麼你一定是對于操作特殊的檔案擁有自己的政策,于是在open系統調用中提供了O_DIRECT标志,這标志表明這個檔案打開後不再使用核心的cache,而是使用自己的cache,不過在某一個時間,如果你想失效系統中所有的檔案cache,那麼可以将3寫入/proc/sys/vm/drop_cahces檔案,這個可以使用sysctl來進行。
還有一個問題就是帶有O_DIRECT标志打開的檔案的mmap問題,通過讀代碼可以知道,mmap中沒有判斷有沒有O_DIRECT标志的邏輯,并且在mmap中不管打開方式如何,都會采用檔案cache的方式,因為所謂檔案的mmap就是将檔案的核心cache頁面直接映射到使用者空間的虛拟位址空間,mmap的本意就是将檔案映射到使用者空間,而linux中檔案在核心記憶體中的唯一表示就是檔案cache,于是mmap帶有O_DIRECT标志的檔案時,也會使用檔案cache,但是一旦直接read或者write這些直接讀寫的檔案,那麼就會在直接讀寫前将已經mmap到使用者空間的該檔案的核心cache頁面設定為髒,然後等待這些頁面回寫到磁盤後再開始直接io,因為不但這個檔案可能同時被映射到使用者空間,而且别的程序也可能打開該檔案并且不帶有O_DIRECT标志,如此為了不出現資料不一緻的錯誤,O_DIRECT打開的檔案在讀寫的時候必須是獨占該檔案的。具體判斷是否有别的程序映射該檔案的方式就是搜尋該檔案的mapping的優先搜尋樹,一旦這棵樹不為空,那麼就說明有程序映射這個檔案,然後一個一個找到這些vma,并且根據反向映射将這些vma的頁面的程序的頁表置為無效。