2011-04-23 43 views
0

我目前正在C++中對硬盤驅動器IO進行模擬,並且我正在使用pthread線程和一個互斥體來執行磁盤上的讀取操作。在C++/Linux中訂購線程

但是我試圖通過訂購我的線程來優化閱讀時間。問題是,我的磁盤正在讀取一個扇區,並且有大量讀取請求到達,其中任何一個都會被執行。我想要的是訂購它們,以便接下來執行具有最近扇區的請求。

這樣,虛擬硬盤驅動器的磁頭也不會過分移動。

我的問題是:使用Linux進程優先級的好方法,以確保最近的讀取請求將先於其他被執行?如果沒有,我可以依靠什麼來做到這一點?

PS:對不起,我的英語。

感謝您的幫助。

回答

3

這是很少依靠進程的優先級方案的具體行爲,特別是在通用操作系統,如Linux是一個好主意,因爲他們並不真正保證你任何特定的行爲。如果某個地址在內存中或某些I/O調用導致該地址暫時停止,那麼將優先級設置爲最高優先級將無濟於事 - 操作系統將運行一些較低優先級的進程,而不會令您感到不快驚訝。

如果您想確定完成磁盤I/O請求的順序或模擬此操作,您可以創建一個線程來保存未決I/O列表並要求執行請求按照它控制的順序一次一個。

2

的I/Linux內核O調度可以重新排序並凝聚讀取(在一定程度上寫入),使他們的順序是磁盤更有利,就像你所描述。這也影響了進程調度器(它也處理線程),因爲等待I/O的線程也會被「重新排序」 - 它們的讀或寫請求按照磁盤爲它們服務的順序完成,而不是按順序他們在其中提出了他們的要求。 (這是真正發生的事情非常簡化的視圖。)

但如果你模擬磁盤I/O,也就是說,如果你沒有真正做實際的I/O時,I/O調度不參與在所有。只有進程調度程序。進程調度程序不知道你在「模擬」硬盤 - 它沒有關於進程的信息,只是關於他們是否需要CPU資源的信息。 (這又是一個事情如何工作的簡化視圖)。

所以進程調度程序不會幫助你重新排序或合併的讀取請求的模擬。您需要在代碼中實現該邏輯。 (閱讀關於I/O調度程序是個好主意。)

如果您確實提交了真正的I/O,那麼在某些情況下重新排序可以提高性能,實際上I/O調度程序的優化算法吞吐量或延遲會影響線程調度的方式(無論如何阻塞I/O - 異步I/O使其更復雜一些)。