您的位置:首页 > 运维架构 > Linux

个人学习笔记---linux内核同步

2015-09-12 10:33 549 查看
一  基本概念

临界区:也称为临界段,就是访问和操作共享数据的代码段。

竞争条件: 2个或2个以上线程在临界区里同时执行的时候,就构成了竞争条件。

所谓同步,其实防止在临界区中形成竞争条件。

如果临界区里是原子操作(即整个操作完成前不会被打断),那么自然就不会出竞争条件。但在实际应用中,临界区中的代码往往不会那么简单,所以为了保持同步,引入了锁机制。但又会产生一些关于锁的问题。

死锁产生的条件:要有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有资源都已被占用。所以线程相互等待,但它们永远不会释放已经占有的资源。于是任何线程都无法继续,死锁发生。

自死锁:如果一个执行线程试图去获得一个自己已经持有的锁,它不得不等待锁被释放。但因为它正在忙着等待这个锁,所以自己永远也不会有机会释放锁,死锁产生。

饥饿(starvation) 是一个线程长时间得不到需要的资源而不能执行的现象。

二   造成并发的原因

1. 用户空间需要同步的原因

用户程序会被调度程序抢占和重新调度。由于用户程序可能会在任何时刻被抢占,所以会使得一个程序正处于临界区时被被自愿抢占了。如果新调度的进程会操作同一个临界区,那么就会形成竞争。

另外在多处理器中会真正存在两个进程同时在临界区中同时运行的情况

2.    内核中可能造成并发的原因有

1)中断——中断几乎可以在任何时刻异步发生,也就是可能随时打断当前正在运行的代码。

2)软中断和tasklet ——内核能在任何时刻唤醒或调度中断和tasklet,打断当前正在执行的代码。

3)内核抢占——因为内核具有抢占性,所以内核中的任务可能会被另一任务抢占。

4)睡眠及用户空间的同步——在内核执行的进程可能会睡眠,这就会唤醒调度程序从而导致调度一个新的用户进程执行。

5)对称多处理——两个或多个处理器可以同时执行代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息