在内核中产生并发访问的并发源主要有如下四种:
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.进程会不会进入睡眠以等待该数据?


本文探讨了Linux系统中产生并发访问的四种主要来源:中断异常、软中断/Tasklet、内核抢占和多处理器并发执行。在单核和多核系统中,这些并发源导致不同的并发行为,例如中断处理程序可能打断进程或软中断的执行。为了解决并发带来的资源和数据保护问题,内核使用preempt_count计数器在特定点禁用抢占,如开启抢占、启用软中断、释放自旋锁和中断处理程序返回时。在内核模式下,如果发现可抢占进程,preempt_schedule_irq将执行抢占调度。
最低0.47元/天 解锁文章
770

被折叠的 条评论
为什么被折叠?



