2012-01-10 63 views
1

Linux中的CFQ IO調度程序有一組請求隊列。來自進程的同步請求分別進入每個進程請求隊列,而所有異步請求都進入一組共享隊列。CFQ IO調度程序請求隊列

請求如何分類爲同步或異步?在這種情況下異步是否意味着使用內核AIO完成IO? (和所有其他正常的read()/ write()和緩衝fread()/ fwrite()被計爲同步)

回答

1

同步請求是那些進程被阻塞直到它們完成,異步請求是那些進程可以繼續平行完成。

通常,程序所做的所有正常讀取都是同步的,因爲進程無法前進,直到它具有所請求的數據爲止。然而,寫操作通常是異步的 - 只要進程能夠保證看到所有寫操作已經執行,這一點由緩衝區/頁面緩存來處理,進程並不關心數據何時被寫入存儲設備一旦它調用了寫入系統調用。

從那裏開始變得複雜:一個fsync()系統調用是一個同步請求,對於一些元數據改變對已加載文件系統的調用,但對非加載文件系統的調用也是這樣,等等......

+0

這可能聽起來很奇怪,但假設進程的正常寫入請求中的一些數據已經到達異步隊列。現在fsync()稍後被調用。刷新線程是否只將那些髒頁存放到同步隊列中,或者是來自異步隊列的數據也移動到同步隊列中? – itisravi 2012-01-10 12:34:23

+0

我不確定,但我猜前者。 – gby 2012-01-10 19:09:48