操作系统之锁的实现方式

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

}



你可能感兴趣的:(操作系统之锁的实现方式)