【问题标题】:implementing blocking syscalls in Linux在 Linux 中实现阻塞系统调用
【发布时间】:2015-05-24 06:52:50
【问题描述】:

我想了解实现阻塞 I/O 系统调用与非阻塞有何不同?谷歌搜索没有多大帮助,任何链接或参考将不胜感激。

谢谢。

【问题讨论】:

标签: linux-kernel linux-device-driver system-calls


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-25
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2023-03-09
    • 2011-03-02
    • 2020-09-21
    相关资源
    最近更新 更多