簡體   English   中英

對文件系統的非阻塞訪問

[英]Non-blocking access to the file system

在編寫非阻塞程序(處理多個套接字)時,使用open(2),stat(2)文件或使用opendir(2)打開目錄,在某一點需要打開文件,如何確保系統調用不阻止?

對我來說似乎除了使用線程或fork(2)之外別無選擇。

正如Mel Nicholson回答的那樣,對於基於文件描述符的所有內容,您可以使用select / poll / epoll 對於其他所有內容,您可以擁有一個代理線程每個項目(或一個線程池),其中小堆棧將轉換(通過內核調度程序)任何同步阻塞等待使用eventfd選擇/輪詢/ epoll-able異步事件或者是一個unix管道 (需要便攜性)。

代理線程將阻塞直到操作完成,然后寫入eventfd或管道以喚醒select / poll / epoll。

的確,沒有其他方法。

實際上還有另一種阻塞,除了線程之外不能處理,這就是頁面錯誤。 這些可能發生在程序代碼,程序數據,內存分配或從文件映射的數據中。 幾乎不可能避免它們(實際上你可以將一些頁面鎖定到內存中,但它是特權操作,並且可能通過使內核在其他地方執行不良的內存管理工作而適得其反)。 所以:

  1. 你無法真正排除阻止某個特定客戶端的最后機會,所以不要打擾openstat 無論如何,網絡可能會比這些功能增加更大的延遲。
  2. 為了獲得最佳性能,您應該擁有足夠的線程,以便在其他線程因頁面錯誤或類似的困難阻塞點被阻止時可以安排一些線程。

此外,如果您在處理網絡請求期間需要讀取和處理或處理和寫入數據,則使用內存映射訪問文件會更快,但這是阻塞的,不能無阻塞。 因此,現代網絡服務器傾向於堅持大多數東西的阻塞調用,並且只有足夠的線程來保持CPU忙,而其他線程正在等待I / O.

大多數現代服務器都是多核的這一事實是您無論如何都需要多個線程的另一個原因。

您可以使用poll( )命令使用單個線程檢查任意數量的套接字數據。

有關Linux詳細信息請參閱此處 ,或查看有關系統詳細信息的man poll

open( )stat( )將在所有POSIX兼容系統中阻塞它們的線程,除非通過異步策略調用(如在fork

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM