5.3 驱动中的并发
你或许注意到了在consoleread
和consoleintr
中对acquire
的调用。这些调用获得了一个保护控制台驱动程序的数据结构不受并发访问的锁。这里有三种并发风险:运行在不同CPU上的两个进程可能同时调用consoleread
;硬件或许会在consoleread
正在执行时要求CPU传递控制台中断;并且硬件可能在当前CPU正在执行consoleread
时向其他CPU传递控制台中断。第6章探讨了锁在这些场景中的作用。
在驱动程序中需要注意并发的另一种场景是,一个进程可能正在等待来自设备的输入,但是输入的中断信号可能是在另一个进程(或者根本没有进程)正在运行时到达的。因此中断处理程序不允许考虑他们已经中断的进程或代码。例如,中断处理程序不能安全地使用当前进程的页表调用copyout
(注:因为你不知道是否发生了进程切换,当前进程可能并不是原先的进程)。中断处理程序通常做相对较少的工作(例如,只需将输入数据复制到缓冲区),并唤醒上半部分代码来完成其余工作。