Linux内核同步-基本概念

来源:互联网 发布:收款语音播报软件 编辑:程序博客网 时间:2024/05/16 05:09

 在linux内核中,为驱动等内核模块提供了互斥与同步的内核机制。如果运行的系统中自始至终只有一个执行路径,那么无须考虑互斥与同步的问题。现在的系统不仅支持多进程而且自持多处理器。当多个执行路径并发执行时需要保证对共享资源的安全访问。一般来讲,互斥是对资源的排他性安排,而同步则要对进程执行的先后顺序做出妥善的安排。我们对共享的资源进行访问的代码段称为临界区(critical section),而导致出现多个执行路径的因素称为并发源。

1.1 Linux系统中的并发源

1).中断执行路径

       中断可以随时打断当前正在执行的代码。当系统正在执行当前进程时,发生了中断,中断处理函数和被中断的进程之间形成并发。在单处理器中,虽然中断处理函数的执行路径与被中断进程黄子健不是真正严格意义哈桑的并发,然而中断处理函数和被中断进程之间却可能形成竞态。软中断的执行可以归结到此类型的并发中。

       内核可以在任何时候唤醒或者调度软中断和tasklet,打断当前正在执行的代码。

2).内核调度器的可抢占性

       在单处理器上,因为调度器的可抢占性,导致进程与进程之间的并发。内核的任务可能会被另一任务抢占。

       睡眠及用户空间同步:在内核执行的进程可能会睡眠,就会唤醒调度程序,调度另一个用户进程执行。

3).对称多处理器的并发执行

       多处理器系统上进程与进程之间是严格意义上的并发,两个或多个处理器可以同时执行代码,每个处理器都可以独资调度运行一个进程,在同一时刻有多个进程在同时运行。 

1.2 可能会引起bug的地方

     1.如果在内核代码操作某一资源时产生一个中断,而且该中断也需要访问这一资源。

     2.如果一段内核代码在访问共享资源时可以被抢占。

     3.内核代码在临界区睡眠

     4.两个处理器同时访问一共享资源


1.3死锁

       死锁分为自死锁和ABBA死锁。自死锁试图获取自己已经获得的锁;ABBA死锁互相持有对方想要的锁,导致相互死锁。避免死锁的方法主要有:加锁顺序、防止发生饥饿、不要重复请求同一锁等。越复杂的加锁方案越有可能造成死锁

参考书籍:linux内核设计与实现

          深入linux设备驱动程序内核机制

0 0