我想了解实现阻塞I / O系统调用与非阻塞有何不同?谷歌搜索没有多大帮助,任何链接或参考将不胜感激。
感谢。
答案 0 :(得分:1)
http://faculty.salina.k-state.edu/tim/ossg/Device/blocking.html
阻止系统调用会使任务(调用线程)进入休眠状态(阻止它在CPU上运行),并且syscall将仅在事件(或超时)之后返回。非阻塞系统调用不会阻塞线程,它只是检查内核状态并立即返回。
更详细的说明:http://www.makelinux.net/ldd3/chp-6-sect-2
一个重要问题:如果驱动程序无法立即满足请求,它将如何响应?当没有数据可用时,可能会发出读取调用,但预计将来会有更多数据。或者进程可能会尝试写入,但您的设备尚未准备好接受数据,因为您的输出缓冲区已满。通话过程通常不关心这些问题;程序员只需要调用读或写,并在完成必要的工作后返回调用。因此,在这种情况下,您的驱动程序应该(默认情况下)阻止进程,使其进入睡眠状态,直到请求继续进行。 ....
有几种形式的wait_event
内核函数来阻止调用者线程,检查include/linux/wait.h
;线程可以通过不同的方式唤醒,例如使用wake_up
/ wake_up_interruptible
。