常规文件读取是否能从非阻塞IO中获益?

常规文件读取是否能从非阻塞IO中获益?,io,nonblocking,Io,Nonblocking,对我来说似乎不是,我找到了一个。你觉得怎么样?你发布的链接内容是正确的。以非阻塞模式打开的常规文件套接字将始终“准备”读取;当您实际尝试读取它时,阻塞(或者更准确地说,正如您的消息来源所指出的,休眠)将发生,直到操作成功 无论如何,我认为你的消息来源需要一些镇静剂。一个愤怒的人,也就是说。你是对的,非阻塞模式对常规文件没有好处,不允许这样做。如果可以设置一个辅助标志以及O_NONBLOCK,来改变这一点,那就太好了,但是由于缓存和虚拟内存的工作方式,要定义普通文件的正确“非阻塞”行为意味着什么,

对我来说似乎不是,我找到了一个。你觉得怎么样?

你发布的链接内容是正确的。以非阻塞模式打开的常规文件套接字将始终“准备”读取;当您实际尝试读取它时,阻塞(或者更准确地说,正如您的消息来源所指出的,休眠)将发生,直到操作成功


无论如何,我认为你的消息来源需要一些镇静剂。一个愤怒的人,也就是说。

你是对的,非阻塞模式对常规文件没有好处,不允许这样做。如果可以设置一个辅助标志以及
O_NONBLOCK
,来改变这一点,那就太好了,但是由于缓存和虚拟内存的工作方式,要定义普通文件的正确“非阻塞”行为意味着什么,实际上并不容易。当然,除非您允许程序锁定与文件相关联的内存,否则将存在争用条件。(事实上,为普通文件实现一种非休眠IO的一种方法是
mmap
文件和
mlock
映射。此后,在任何合理的实现中,
read
write
都不会休眠,只要文件偏移量和缓冲区大小保持在映射区域的范围内。)在过去的几个小时里,我一直在深入研究这个问题,我可以证明你引用的链接的作者是正确的。但是,对于v2.6+的本机Linux内核的支持似乎“更好”(非常松散地使用该术语)。“libaio”包包含一个库,它公开了内核提供的功能,但它对所支持的不同类型的文件系统有一些警告,并且它不能移植到Linux 2.6+之外的任何东西


这是关于这个问题的。

对我来说似乎只是有点生气。关于mmap()。。。将文件变为非阻塞状态将是阻塞…;-)定义非阻塞行为对普通文件意味着什么并不难。当下一次
read
请求的数据在页面缓存中时,内核必须向文件发出准备读取的信号。如果到那时它消失了,内核就可以返回
ewoodblock
(并将请求的范围添加到一些强制预取中,当它可用时,文件将被设置为准备读取,依此类推)。如果每个人都正确地实现了,这就不是竞争条件,但是如果许多进程一直试图超越彼此,而没有任何进程取得进展,那么就有可能出现死锁。