考虑一个实现open(),read(),write(),close(),unlocked_ioctl()以及mmap()的linux设备驱动程序。
现在,假设多个(或相同的)进程同时打开同一个设备(/ dev / device)。
这些文件操作是否以任何方式保证是原子w.r.t.彼此或者每个open(),read(),write(),close()都应该使用互斥锁,以便它们中的一个在更改过程中不会抢占它们,例如缓冲区数据(通过相同的inode)?
如果内核保证彼此的原子性以及每个操作是否找到并使缓冲区/硬件保持一致状态,则不应该这样做。
请重新引导我一些参考(如果你知道的话)。
谢谢。
编辑:它出现在其中一条评论中,但我找到的最佳参考资料是:
http://www.makelinux.net/ldd3/chp-6-sect-6
它还显示了通过限制单个用户,通过强制用户等待来创建副本来缓解问题的策略。
答案 0 :(得分:4)
设备驱动程序代码在调用系统调用的进程中运行。在调用模块代码之前,内核没有隐藏的“模块锁”。当单独的进程调用最终在驱动程序代码中的系统调用时,并发驱动程序调用肯定是可能的。
正如您所料,内核更容易实现简单性和性能。在访问共享状态时,您可以获取必要的自旋锁和信号量。
参见Chapter 5的Linux Device Drivers,其中详细讨论了并发和竞争条件。
并发及其管理
在现代Linux系统中,有许多并发源,因此可能存在竞争条件。正在运行多个用户空间进程,以及它们 可以以惊人的方式组合访问您的代码。 SMP系统可以在不同的处理器上同时执行您的代码。内核代码是可抢占的; 您的驱动程序代码可能随时丢失处理器,以及替换它的过程 也可以在你的驱动程序中运行。设备中断是异步事件 可以导致代码的并发执行。内核还提供了各种延迟代码执行机制,例如工作队列,tasklet和计时器,这些机制可能导致代码在任何时候以与当前进程无关的方式运行。在现代的,可热插拔的世界中,当您处理它时,您的设备可能会消失。