[英]Non-blocking access to the file system
在編寫非阻塞程序(處理多個套接字)時,使用open(2),stat(2)文件或使用opendir(2)打開目錄,在某一點需要打開文件,如何確保系統調用不阻止?
對我來說似乎除了使用線程或fork(2)之外別無選擇。
的確,沒有其他方法。
實際上還有另一種阻塞,除了線程之外不能處理,這就是頁面錯誤。 這些可能發生在程序代碼,程序數據,內存分配或從文件映射的數據中。 幾乎不可能避免它們(實際上你可以將一些頁面鎖定到內存中,但它是特權操作,並且可能通過使內核在其他地方執行不良的內存管理工作而適得其反)。 所以:
open
和stat
。 無論如何,網絡可能會比這些功能增加更大的延遲。 此外,如果您在處理網絡請求期間需要讀取和處理或處理和寫入數據,則使用內存映射訪問文件會更快,但這是阻塞的,不能無阻塞。 因此,現代網絡服務器傾向於堅持大多數東西的阻塞調用,並且只有足夠的線程來保持CPU忙,而其他線程正在等待I / O.
大多數現代服務器都是多核的這一事實是您無論如何都需要多個線程的另一個原因。
您可以使用poll( )
命令使用單個線程檢查任意數量的套接字數據。
有關Linux詳細信息 , 請參閱此處 ,或查看有關系統詳細信息的man poll
。
open( )
和stat( )
將在所有POSIX兼容系統中阻塞它們的線程,除非通過異步策略調用(如在fork
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.