5

考虑一个实现 open()、read()、write()、close()、unlocked_ioctl() 和 mmap() 的 linux 设备驱动程序。

现在,假设多个(或相同的)进程同时打开同一个设备(/dev/device)。

这些文件操作是否以任何方式保证彼此是原子的,或者 open()、read()、write()、close() 中的每一个是否应该采用互斥锁,以便它们的一对不会抢占它们而例如,在更改缓冲区数据的过程中(通过相同的 inode)?

如果内核保证它们彼此之间的原子性并且每个操作都找到并保持缓冲区/硬件处于一致状态,则应该没有必要。

请把我重定向到一些参考资料(如果你知道的话)。

谢谢你。

编辑:它在其中一条评论中,但我找到的最佳参考在这里:

http://www.makelinux.net/ldd3/chp-6-sect-6

它还展示了缓解问题的策略,或者通过限制单个用户,或者通过创建副本,或者通过强制用户等待等。

4

1 回答 1

4

设备驱动程序代码在调用系统调用的进程中运行。内核没有在调用模块代码之前锁定的隐式“模块锁”。当单独的进程调用最终出现在您的驱动程序代码中的系统调用时,并发驱动程序调用绝对有可能发生。

正如您所料,内核更倾向于简单性和性能,而不是易于实现。在访问共享状态时,由您来获取必要的自旋锁和信号量。

请参阅Linux 设备驱动程序的第 5 章,其中详细讨论了并发和竞争条件。

并发及其管理

在现代 Linux 系统中,有许多并发源,因此可能存在竞争条件。多个用户空间进程正在运行,它们可以以惊人的组合方式访问您的代码。SMP 系统可以在不同的处理器上同时执行您的代码。内核代码是可抢占的;您的驱动程序代码可能随时丢失处理器,并且替换它的进程也可能在您的驱动程序中运行。设备中断是异步事件,可导致代码并发执行。内核还提供了各种延迟代码执行的机制,例如工作队列、tasklet 和计时器,它们可能导致您的代码在任何时候以与当前进程正在执行的操作无关的方式运行。在现代、可热插拔的世界中,

于 2013-09-18T14:32:02.147 回答