操作系统之锁的实现方式

1.以中断启用与禁止来实现锁

    中断的启用和禁止是原子的,不能被其他代码插入的

   lock(){

            disable interrupt

           while(value!=free){

                             enable interrupt

                             disable interrunpt    //使其他线程可以抢占,从而改变value的值

           }

          value=busy

           enable interrupt

   }



2.以测试和设置指令来实现锁

     原子操作:将内存指定位置对的存储单元读到一个寄存器,将新的值写到刚才的存储单元


   test_and_set(x){

            tmp=x;

            x=1;

           return (tmp);

   }



value is initially 0

lock(){

    while(test_and_lock(1)==1) {} //每次执行完原子操作后都有可能会被抢占 

}


unlock(){

    value=0;  因为是赋值0,可以直接在总线上产生,不用中断包裹着也没有问题                                                                          

}



3 以非繁忙等待,中断启用和禁止来实现锁


lock(){

     disable interrupt;

    if(value==free){

         value=busy

    }else{

        添加到锁的等待队列

       切换到下一个线程 

   }

   enable interrupt

}



unlock(){

   disable interrupt

   value=free

   if(有线程在等待锁){

        移到就绪队列

       value=busy

   }

  enable interrupt

}



4 以最少繁忙等待 测试与设置来实现锁

guard 用来保证每次只有一个线程获得value并对其操作

lock(){

   while(test_and_set(guard)){}

  if(value==free){

        value=busy;

       guard=0;

    }else{

              添加到锁的等待队列

              guard=0

              切换线程

   }

}


unlock(){

      while(test_and_set(guard)){}

     value=free

     if(有其他线程在等待锁){

              移到就绪队列

             value=busy            

     }

    guard=0

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值