它似乎不是我,我发现一个link that supports my opinion。你怎么看?定时读取文件能否受益于非阻塞IO?
回答
的联系您发布的内容是正确的。以非阻塞模式打开的常规文件套接字将始终“准备就绪”以供读取;当你真正尝试阅读它时,会发生阻塞(或者更准确地说,你的源指出,睡眠),直到操作成功。
在任何情况下,我认为你的源需要一些镇静剂。一个生气的人,就是。
你是正确的,非阻塞模式,普通文件没有任何好处,而且不允许。如果可以设置一个辅助标志以及O_NONBLOCK
来改变这种情况,那将会很不错,但是由于缓存和虚拟内存的工作方式,定义什么正确的“非阻塞”行为实际上并不是一件容易的事情对于普通文件意味着。当然,除非你允许程序锁定与文件关联的内存,否则会有竞争条件。 (事实上,一个方式来实现一种非睡IO为普通文件将mmap
文件和mlock
地图。在此之后,在任何合理的实施,read
和write
绝不会只要睡的文件偏移和仍然是映射区域的范围内的缓冲区大小。)
关于mmap()...它会阻止文件变成非阻塞... ;-) – 2013-11-18 07:06:12
这不是非常难以定义非阻塞行为对普通文件意味着什么。当下一个'read'请求的数据位于页面缓存中时,内核必须发信号通知文件已准备好读取。如果它过去了,内核可能会返回'EWOULDBLOCK'(并且将请求的范围添加到某些必需的预取中,并且当它可用时,文件将被设置为可读取等等)。如果每个人都得到正确执行,这不会是一种竞争条件,但如果许多流程不断尝试彼此解读而没有取得进展,那么就会存在活锁的可能性。 – DepressedDaniel 2017-03-14 02:08:11
我一直在挖掘到这相当严重,在过去几个小时,可以证明该链接的你引用的作者是正确的。但是,在原生Linux Kernel for v2.6 +中,似乎是“更好”(使用该术语非常松散)支持non-blocking IO against regular files。 “libaio”包中包含一个公开内核提供的功能的库,但它对于支持的不同类型的文件系统有一些警告,并且它不能移植到Linux 2.6+以外的任何内容。
而这里的another good article关于这个问题的。
- 1. 适用于Android的非阻塞IO
- 2. IOCP和非阻塞IO
- 3. .net非阻塞IO pre 4.5
- 4. 非阻塞IO和HystrixObservableCommand
- 5. 阻止IO与非阻塞IO;寻找好的文章
- 6. Ruby中的缓冲/ RingBuffer IO + Amazon S3非阻塞区块读取
- 7. 什么是简单的话阻止IO和非阻塞IO?
- 8. Python中的阻塞与非阻塞网络IO
- 9. 阻塞和非阻塞读取之间有什么区别?
- 10. Linux阻塞与非阻塞串行读取
- 11. 使用Ruby的非阻塞IO?
- 12. Winsock的非阻塞IO重叠仍块
- 13. 非阻塞套接字和io
- 14. Android非阻塞从套接字读取
- 15. 红宝石非阻塞行读取
- 16. 非阻塞键盘读取 - C/C++
- 17. Python非阻塞pn532标签读取
- 18. 从非阻塞的SocketChanel读取信息
- 19. 非阻塞文件openat()
- 20. 如何使用非阻塞IO写入文件?
- 21. 非阻塞读Scala中没有制定
- 22. epoll +非阻塞套接字慢于阻塞+超时?
- 23. mpi:阻塞与非阻塞
- 24. Filewatcher是否在Java中考虑了非阻塞IO?
- 25. Netty是否只为网络提供非阻塞IO?
- 26. 在闪存中是否存在非阻塞io?
- 27. Java中的非阻塞CAS是否真的非阻塞?
- 28. 从C#中的标准I/O读取非阻塞读取#
- 29. InnoDB的行锁定与MVCC非阻塞读取相同?
- 30. 使用非阻塞udp读取时丢失消息
只对我发脾气。 – 2011-04-28 01:04:15