在内核中产生并发访问的并发源主要有如下四种:
1.中断和异常,中断发生后,中断处理程序和被中断的进程之间可能产生并发访问。
2.软中断和tasklet,软中断和tasklet随时可能会被调度,执行,从而打断当前正在执行的进程上下文。
3.内核抢占,调度器支持可抢占特性,会导致进行和进程之间的并发访问。
4.多处理器并发执行,多处理器可以同事执行多个进程。
上述情况需要针对单核和多核系统区别对待,对于单处理器系统,主要有如下的并发源:
1.中断处理程序可以打断软中断和TASKLET的执行。
2.软中断和TASKLET之间不会并发执行,但可以打断进程上下文执行。
3.在支持抢占的内核上,进程上下文之间会产生并发。
4.在不支持抢占的内核中,进程上下文之间不会产生并发。
对于SMP系统,情况会更复杂:
1.同一类型的中断处理程序不会并发执行,但是不同类型的中断可能送达不同的CPU,因此不同类型的中断处理程序可能会并发执行。
2.同一类型的软中断会在不同的CPU上并发执行。
3.同一类型的TASKLET是串行执行的,不会在多个CPU上并发执行。
4.不同CPU上的进程上下文会并发执行。
并发要解决的问题是保护资源和数据,而不是保护代码,关于数据需要做如下思考:
1.除了从当前内核代码路径外,似乎否还可以从其他内核代码路径会访问这些数据,如从中断处理程序,工作线程处理程序,TASKLET处理程序,软中断等等。
2.如从当前内核带啊路径访问数据时发生抢占,被调度,执行的进程会不会访问该数据?
3.进程会不