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