临界区
临界区是指进程中的一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域。
互斥,有限等待,可前进
基本机制
禁用中断:
没有中断,没有上下文切换,因此没有并发
硬件将中断处理延迟到中断被启用之后,当进入临界区时禁用中断,离开临界区时,开启中断。
问题:一旦中断被禁用,线程就无法被停止,整个系统都会为你停下来,可能导致其他线程处于饥饿状态。
临界区不可以任意长。在多cpu情况下无法解决互斥问题软件实现
peterson算法
do{
flag[i]=true; // 自己要进去
turn = j; // 把机会让给别人
while(flag[j]&&turn==j);
// 进入临界区
// do something
flag[i]=false;
// 离开临界区
}while(1);
-
bakery算法
image.png
需要忙等待:轮询 进程不断地去询问是否满足条件,会产生cpu的开销
硬件方法
使用原子操作指令
优点: 简单,适用于多CPU中任意数量的进程,支持多临界区,开销小
可能发生饥饿,可能死锁,如果低优先级进程拥有锁,高优先级进程拥有CPU,还在忙等待,就死锁了,在实时调度系统中常见。
Test_and_set
bool testAndSet(bool*p){
bool res = *p;
*p=true;
return res;
}
exchange
void swap(bool *a,bool*b){
bool tmp = *a;
*a=*b;
*b=tmp;
}
while(key==1)exchange(lcok,key);//控制不断循环
硬件实现时的忙等待和无忙等待的权衡
当临界区比较小时,忙等待可能更好一点,不会产生上下文切换时的开销。
