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

    信号量是一种数据结构(可以是整型数、整型数组、链表、记录型变量(结构体))。信号量的值与相应资源的使用情况有关。信号量的值仅由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


你可能感兴趣的:(操作系统)