09-临界区

临界区

临界区是指进程中的一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域。

互斥,有限等待,可前进

基本机制

  • 禁用中断:
    没有中断,没有上下文切换,因此没有并发
    硬件将中断处理延迟到中断被启用之后,当进入临界区时禁用中断,离开临界区时,开启中断。
    问题:一旦中断被禁用,线程就无法被停止,整个系统都会为你停下来,可能导致其他线程处于饥饿状态。
    临界区不可以任意长。在多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);//控制不断循环
硬件实现时的忙等待和无忙等待的权衡
当临界区比较小时,忙等待可能更好一点,不会产生上下文切换时的开销。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容