对文件系统的非阻塞访问

wat*_*ain 7 c linux bsd nonblocking

在编写非阻塞程序(处理多个套接字)时,使用open(2),stat(2)文件或使用opendir(2)打开目录,在某一点需要打开文件,如何确保系统调用不阻止?

对我来说似乎除了使用线程或fork(2)之外别无选择.

Jan*_*dec 2

确实没有其他方法。

实际上,还有另一种阻塞除了线程之外无法处理,那就是页面错误。这些可能发生在程序代码、程序数据、内存分配或从文件映射的数据中。避免它们几乎是不可能的(实际上,您可以将某些页面锁定到内存,但这是特权操作,并且可能会因使内核在其他地方的内存管理工作做得很差而适得其反)。所以:

  1. 您无法真正消除对特定客户端进行阻止的每一个最后机会,因此不要为open和之类的事情烦恼stat。无论如何,网络可能会增加比这些功能更大的延迟。
  2. 为了获得最佳性能,您应该有足够的线程,以便在其他线程因页面错误或类似的困难阻塞点而被阻止时可以调度一些线程。

此外,如果您需要在处理网络请求期间读取和处理或处理和写入数据,使用内存映射访问文件会更快,但这是阻塞的,无法变为非阻塞。因此,现代网络服务器倾向于坚持对大多数内容进行阻塞调用,并且只是有足够的线程来保持 CPU 繁忙,而其他线程正在等待 I/O。

事实上,大多数现代服务器都是多核的,这是您无论如何都需要多个线程的另一个原因。