原子操作?是怎么实现?《从哲学层次看操作系统》--锁的实现
不可被中断的一个或一系列操作
32位IA-32处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。
1.禁止/开启中断
中断的启用和禁止是原子的,不能被其他代码插入的
lock(){
disable interrupt;//禁止中断
while(value!=free){
enable interrupt;//启动中断
disable interrunpt ;//使其他线程可以抢占,从而改变value的值
}
value=busy;
enable interrupt;
}
2.测试与设置 特殊指令
将内存指定位置对的存储单元读到一个寄存器,将新的值写到刚才的存储单元
TAS就是Test And Set。它要做的就是跟一个变量进行Test。如果条件满足对其Set另外一个值,如果条件不满足,就继续等待。但是所有这些都是原子操作。
test_and_set(x){
tmp=x;
x=1;
return (tmp);
}
value is initially 0;//值初始为0
lock(){
while(test_and_lock(1)==1) {} //每次执行完原子操作后都有可能会被抢占
}
unlock(){
value=0;// 因为是赋值0,可以直接在总线上产生,不用中断包裹着也没有问题
}