操作系统:同步与互斥实现方法

4.2.2 实现临界段的硬件方法

利用处理机提供的特殊指令实现临界区加锁

常见硬件指令有:

1、屏蔽中断(单CPU系统

举例:存取count

Parbegin

    A(amount){
		    	          disableInterrupt();
                          R1=count;
		     	          R2=amount;
                          R1=R1+R2;
                          count=R1;
		    	          enableInterrupt(); 
                       };

    B(amount) {
		                 disableInterrupt();//屏蔽中断
                         R1=count;
		                 R2=amount;
                         R1=R1-R2;
                         count=R1;
		                 enableInterrupt();//允许中断
                      };
    Parend;

2、“Test_and_Set”指令(多CPU

该指令功能描述为:

boolean Test_and_Set(boolean target){

      Boolean rv=target;

      target = true;

      return rv;

      }

实质上是一条指令

利用Test&Set指令实现对互斥资源的加锁与解锁:

Lock为全局布尔变量(初值为false

do {

    while Test_and_Set (lock) ;//入口区

    critical section;//临界区

    lock = false;//退出区 false含义为0,解锁

    non-critical section //其余代码区

while(1);

举例:“test&set” 指令实现互斥汇编程序:

  • T&S  Ri,Aj   (读后置1汇编指令。将(Aj)地址所指内存单元内容读到Ri寄存器中,同时将1置入Aj所指的内存单元中)
  • 设Lock为临界段锁变量,则安排如下指令,即可实现加锁与解锁:
  • A1<=&Lock;(将Lock单元地址送A1寄存器。Lock单元初始值为0)
  • Loop:T&S  R1,A1;
  • JRN R1,Loop; (如果R1=1,表示已上锁,则转 Loop 循环,重新测试)
  • 临界段
  • A1 <=&Lock;

  • (A1) <=0;(0置Lock内存单元)

  • 非临界段

3、“Swap”指令

该指令功能描述为

void Swap(boolean  a, boolean  b)	{
	boolean temp=a;
	a = b;
	b = temp;
} 

利用Swap指令实现对临界区的加锁与解锁

Lock为全局布尔变量(初值为false),每个进程设一个局部布尔变量Key

do { 
    key = true;
    while(key==ture)
       Swap (lock, key);//如果key=1则认为lock=0,Swap将其变为lock加锁
    
    critical section;//临界区
    lock = false;    
    non-critical section//其余代码区
while(1);

4.2.3 信号量

信号量机制:“信号量”及“P、V操作”

  • 信号量S为一整型变量
//P操作
P(S): while S≤0  
				  ;空操作
      S = S-1;

//V操作
V(S): S = S+1;

P、V操作是两条原语,即保证P、V操作对变量S的访问是互斥操作。

一、 原语概念与实现

原语:指完成某种功能且不被分割或逻辑上不被中断执行的操作序列。

原语可通过纯硬件实现不可中断性;或通过实现临界段的元方法达到不被逻辑上中断。

实现临界段的元方法:

  • 屏蔽中断(只用于单机)
  • 加硬锁(利用test&set等) 

 举例:用屏蔽中断方法实现Ps)和Vs)的原子性。

P(s){
		disableInterrupt();	
		while (s≤0){ 
		enableInterrupt();//如果s大于0,当执行P操作时,
                           //s不会更新,只会一直空循环,所以要先关中断,再开屏蔽中断
		disableInterrupt();	
		};
		s = s - 1;
		enableInterrupt();
	}
V(s){
		disableInterrupt();	
 		s = s + 1;
		enableInterrupt();
	}

未待完续。。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值