- 论坛徽章:
- 3
|
回复 13# tianhailong
举个buffer的例子:
假设有N个进程想要锁住一个buffer, 首先它们试图取获得buffer的BH_LOCK; 之前已经有一个进程在获得了这个'锁', 那么这N个进程都会陷入睡眠, 它们以独占等待的方式进入睡眠. 而已经获得了这个锁的进程A假设要执行写回操作, 它也会把'锁'的控制权交给块层进行IO传输操作, 自己也在等待这个锁而陷入非独占等待的睡眠.
一旦IO传输完成, 那么回调函数将会释放这个锁. 那么之前获得锁的进程A和独占等待的第一个进程B都会被唤醒.
A和B和N-1个进程, 共同等待的事件是锁被释放, 但A和B(以及N-1个进程)等待的事件发生后执行的操作不同。 B和其他N-1个进程唤醒后的共同动作都是试图获得buffer的控制权, 但同一时间仅有一个能获得, 所以没必要唤醒全部, 只唤醒其中一个就好了. 而A则不同, A并不会抢buffer的控制权, 所以唤醒它之后它爱干吗干吗.
所以,选择独占等待和非独占等待的操作在于, 它们被唤醒后会不会抢某个共有资源的控制权.
---------------------
如果还不能理解的话, 那么考虑进入等待队列的进程 是没有被CPU调度的权利的. 如果共同抢夺某个资源的进程门都一起被唤醒, 那么它们都会获得被调度的权利,。它们被调度后, 第一件事就是抢夺资源, 又因为没有得到资源再次睡眠. 如此反复. 白白浪费了许多CPU时间.
|
|