操作系统学习笔记--信号量(整型信号量、记录型信号量)
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
整型信号量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
相关文章推荐
- [操作系统学习笔记(4)] 进程同步,信号量
- 操作系统学习笔记(9) 互斥和同步的信号量算法
- 操作系统学习笔记-信号量及PV操作与进程互斥和消费者生产者问题
- 操作系统学习笔记(37)--中断处理过程
- 操作系统学习笔记:CPU调度
- Linux学习笔记__Linux操作系统基础
- C语言/操作系统学习笔记——管道通信
- 《30天自制操作系统》15_day_学习笔记
- 学习笔记——操作系统&体系结构_TLB的处理方式
- 操作系统学习笔记(五)
- IBM Z/OS 操作系统学习笔记(持续更新)
- 多线程开发学习笔记之线程同步——信号量
- 操作系统学习笔记:虚拟内存
- 操作系统学习笔记——线程
- 《30天自制操作系统》02_day_学习笔记
- RTX51 Tiny实时操作系统学习笔记—初识RTX51 Tiny
- 《Orange's 一个操作系统的实现》学习笔记--实践认识保护模式
- 操作系统学习笔记--操作系统基本概念
- 操作系统概念学习笔记一 进程
- Linux操作系统下C语言编程入门学习笔记(...20090601(第一遍学完待整理)...)