当编写一个非阻塞程序(处理多个套接字),在某一点需要使用open(2),stat(2)文件或使用opendir(2)打开目录打开文件时,如何确保系统调用不阻止?
对我来说似乎除了使用线程或fork(2)之外别无选择.
解决方法
的确,没有其他方法.
实际上还有另一种阻塞,除了线程之外无法处理,这就是页面错误.这些可能发生在程序代码,程序数据,内存分配或从文件映射的数据中.几乎不可能避免它们(实际上你可以将一些页面锁定到内存中,但它是特权操作,并且可能通过使内核在其他地方执行不良的内存管理工作而适得其反).所以:
>你不能真正排除阻止某个特定客户端的最后机会,所以不要打扰open和stat之类的东西.无论如何,网络可能会比这些功能增加更大的延迟.
>为了获得最佳性能,您应该拥有足够的线程,以便在页面错误或类似的困难阻塞点阻止其他线程时安排一些线程.
此外,如果您在处理网络请求期间需要读取和处理或处理和写入数据,则使用内存映射访问文件会更快,但这是阻塞的,不能无阻塞.因此,现代网络服务器倾向于坚持大多数东西的阻塞调用,并且只有足够的线程来保持cpu忙,而其他线程正在等待I / O.
大多数现代服务器都是多核的这一事实是您无论如何都需要多个线程的另一个原因.