您的位置:首页 > 其它

操作系统学习笔记--信号量(整型信号量、记录型信号量)

2018-04-03 19:44 267 查看
    信号量是一种数据结构(可以是整型数、整型数组、链表、记录型变量(结构体))。信号量的值与相应资源的使用情况有关。信号量的值仅由P、V操作改变。
    整型信号量S(数据结构是一个整型数,用整型数代表信号可用不可用,小于等于0时不可用,大于0时可用)

    整型数P操作(wait)原语 、V操作(signal)原语(用完之后,释放资源)
wait(s): while s<=0; //do no-op //当s≤0时,循环检测s是否≤0
         s:=s-1; //s>=0时
signal(s): s:=s+1;wait(s)和signal(s)是原子操作(最基本、最小的、中间不允许插入任何中断的操作。要执行就要执行完),只要信号量s≤0就不断测试,不满足让权等待。
缺点:不满足让权等待,空闲时仍占着CPU。
优点:实现简单。
    记录型信号量:记录型结构,

type semaphore = record  //一种结构的表示方法,定义为record类型(可以看作结构体类型)
//包含两个数据项:

value: integer; 

L : list of process; //存放进程的PCB,是一个阻塞队列
end
S.value 为资源信号量的初值,表示某类资源的数目。当s.value大于等于0时,表示系统中可用资源的实体数;当s.value<0时,其绝对值代表等待使用资源的进程个数
wait操作:申请一个单位资源。
Procedure wait(S) Var S:semaphore;
begin S.value = S.value -1;
If S.value <0 then block(S,L)  //如果申请资源失败,使正在执行的进程进入阻塞队列(等待队列),block函数指定是哪个资源(S),和等待该资源的进程的阻塞队列(链表L)
end
该PCB链表是一个阻塞队列,当有进程申请S所代表的资源申请不到时,进入链表当中,陷入阻塞状态。
等待队列有多个,等待打印机的站在一个队列,等待磁带机的站在一个队列。(根据等待原因不同,系统当中有多个阻塞队列)。
signal操作:释放一个单位资源
Proceduce signal(S)  //S代表资源的信号量
  Var S:semaphore;

begin
S.value := S.value +1; //系统当中可用资源的数目多个一个(value >0),系统当中等待资源的进程数目少了一个(value <0),
//当value<0时,value+1其绝对值变小
If S.value <= 0 
then wakeup(s.L) //将等待队列中的进程拿出一个放入就绪队列,(唤醒一个等待进程)
end
S.value 初值为1时(系统当中可用临界资源的个数为1),只允许一个进程访问临界资源,是互斥信号量(不能同时被占有)(互斥时,初值为1)
当value=0时,系统当中可用临界资源的个数为0;系统当中等待临界资源的进程个数为0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: