当编写一个非阻塞程序(处理多个套接字)时,它在某个时候需要使用 open(2)、stat(2) 文件打开文件或使用 opendir(2) 打开目录,我如何确保系统调用执行不阻塞?
对我来说,似乎除了使用线程或 fork(2) 之外别无选择。
当编写一个非阻塞程序(处理多个套接字)时,它在某个时候需要使用 open(2)、stat(2) 文件打开文件或使用 opendir(2) 打开目录,我如何确保系统调用执行不阻塞?
对我来说,似乎除了使用线程或 fork(2) 之外别无选择。
确实没有其他方法。
实际上,还有另一种阻塞是线程无法处理的,那就是页面错误。这些可能发生在程序代码、程序数据、内存分配或从文件映射的数据中。避免它们几乎是不可能的(实际上您可以将一些页面锁定到内存中,但这是特权操作,并且可能会使内核在其他地方的内存管理工作不佳而适得其反)。所以:
open
and之类的东西stat
。无论如何,网络可能会增加比这些功能更大的延迟。此外,如果您需要在处理网络请求期间读取和处理或处理和写入数据,使用内存映射访问文件会更快,但这是阻塞的,不能设为非阻塞。因此,现代网络服务器倾向于坚持对大多数内容的阻塞调用,并且只需有足够的线程来保持 CPU 忙碌,而其他线程正在等待 I/O。
大多数现代服务器都是多核的这一事实是您无论如何都需要多个线程的另一个原因。
您可以使用该poll( )
命令使用单个线程检查任意数量的套接字中的数据。
有关 linux 的详细信息,或man poll
有关您的系统的详细信息,请参见此处。
open( )
并且stat( )
将阻塞在所有符合 POSIX 的系统中调用它们的线程,除非通过异步策略调用(如在 a 中fork
)