计算机操作系统

读书笔记


第二章 进程的描述与控制 进程同步(重点)

  • 计算机操作系统
  • 前言
  • 进程同步
  • 一、进程同步的基本概念
    • 1.1 两种形式的制约关系
    • 1.2 临界资源(Critical Resouce)
    • 1.3 临界区(critical section)
    • 1.4 同步机制应遵循的规则
  • 二、信号量机制(重要!!!)
    • 1.整型信号量
    • 2.记录型信号量(重点!!!)
    • 3.AND型信号量
    • 4.信号量集
  • 三、几种信号量机制的区别
  • 四、信号量的应用
    • 4.1 进程互斥
    • 4.2 利用信号量实现前驱关系
    • 4.3 利用记录型信号量实现同步
  • 总结

前言

  传统的OS中,为提高资源利用率和系统吞吐量,通常采用多道程序技术,将多道程序同时装入内存,使之并发运行,此时作为资源分配和独立运行的基本单位都是进程,OS的四大特征也都是基于进程而形成的。所以进程是极其重要的,本章将对其进行详细阐述。

  操作系统的主要作用:管理好这些设备,提高它们的利用率和系统的吞吐量。


进程同步


一、进程同步的基本概念

1.1 两种形式的制约关系

  • 间接相互制约关系,如共享某临界资源。(如两个人在图书馆借同一本书,A先借书,B要借书必须等A还了书才能借。)

  • 直接相互制约关系,如进程间的合作。(如流水线生产商品,如A生产了一个商品方到流水线上,B才能在流水线取到商品。)

1.2 临界资源(Critical Resouce)

  进程间只能进行互斥访问的资源。 临界资源分为:硬件临界资源软件临界资源


生产者-消费者问题

问题的描述:

  有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。

  为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有 n 个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。

生产者进程和消费者进程共享的变量

int n;
typedef struct
{......
}item;
int in=0,out=0,counter=0;
item buffer[n];//具有个缓冲区的缓冲池
item nextp,nextc;
void producer()//生产者进程
{while(1){produce an item in nextp;...while(counter==n);buffer[in]=nextp;in=(in+1)%n;counter++;}
}
void consumer()//消费者进程
{while(1){while(counter==0);nextc=buffer[out];out=(out+1)%n;counter--;consumer the item in nextc;...}
}

  注:单独执行和顺序执行两个进程都正确,但并发执行时对 in,out,counter 的访问可能产生同步错误。原因在于:

  • (1) producer 和 consumer 共享一个 counter;

  • (2) 多个 producer 共享 in

  • (3) 多个 consumer 共享 out

由于,当下我们还没学到信号量,更不懂记录型信号量是什么,所以关于生产者-消费者问题我们在后面进行说明。
变量描述:



  例如:P1 进程中有语句 x=x+1x=x+1x=x+1;P2 进程中有语句 x=x−1x=x-1x=x−1;假设 xxx的初值为 5,描述两个进程顺序的执行情况;并给出一种两进程并发执行的情况。

假设:

答:xxx 为临界资源,各并发进程应互斥访问变量 xxx。

1.3 临界区(critical section)

临界区定义:进程中访问临界资源的那段代码。

临界区作用:在共享某个资源时,不允许多个并发进程交叉执行的临界区中的代码,以保证诸进程对临界资源的互斥访问。

一个访问临界资源的进程描述

  • 临界区(Critical Section):
    每个进程中访问临界资源的代码。

  • 进入区(Entry Section):
    在临界区前的一段用于检查临界资源正被访问标志的代码。

  • 退出区(Exit Section):
    在临界区后用于恢复检查临界资源未被访问标志的代码。

  • 剩余区(Remainder Section):
    进程中除上述三个区以外的代码。

注:

  • 进入区就是申请临界资源

  • 临界区就是使用临界资源

  • 退出区就是释放临界资源

1.4 同步机制应遵循的规则

  • 空闲让进:当无进程处于临界区,允许一个进程进入;

  • 忙则等待:当已有进程进入临界区,其它进程必须等待;

  • 有限等待:对要求访问临界资源的进程,应保证在有限时间进入临界区;

  • 让权等待:当进程不能进入临界区,应立即释放 CPU。

二、信号量机制(重要!!!)

信号量(Semaphore):为实现进程同步而设置的特殊变量。

1.整型信号量

把整型信号量定义为用于表示资源数目的一个整型量。如下所示:

typedef int Semaphore;
Semaphore s;

注意:与一般变量不同的是,对于信号量除初始化外,仅能通过两个标准的原子操作 wait(s)和 signal(s)来访问,分别称为 PPP 操作和 VVV 操作。

注:

  • PPP看做进入区操作的事情-(申请资源)

  • VVV看做退出区操作的事情-(释放资源)

信号量的三种操作:

(1)初始化

  根据实际资源数,对 sss 进行初始化(s≥0s≥0s≥0 为非负整数)可描述为:

Semaphore s=5

(2)P 操作, wait(s)

可描述为:

 wait(s){ while (s≤0) { };s=s-1;}

(3)V 操作, signal(s)

可描述为:

 s=s+1;

说明:

  • 仅能通过 wait(s)和 signal(s)来访问 sss。

  • wait(s)和 signal(s)是两个原子操作,在执行时不可中断。

      我们通过例子来理解:

例一:

  比如有两个进程:AAA和BBB一台打印机,S=1S=1S=1(资源数目为1),如果AAA先用打印机,AAA就会先进入进入区申请打印机这个资源,它就会执行上述的P操作,这时候S=1>0S=1>0S=1>0的,此时打印机可以用,所以它执行S:=S−1S:=S-1S:=S−1这个操作,此时AAA处于临界区(它在使用打印机这个资源),这个时候如果BBB也想用打印机这个资源,BBB也需要和AAA一样先进入进入区申请打印机这个资源,由于之前AAA还在使用S=0<=0S=0<=0S=0<=0是成立的,这就意味着没有资源给BBB用,因为就一台打印机(AAA还在用),所以此时BBB申请不上打印机,此时它执行一个do−no−opdo-no-opdo−no−op(一个空操作),当AAA这个进程执行完,它就进入退出区,到了退出区,它就会释放这个资源,也就执行VVV操作,把SSS变成S:=S+1=1S:=S+1=1S:=S+1=1,这个时候打印机的资源数量变为了1,也就是AAA打印完了,释放了资源,这个时候BBB想要使用的话就能够申请上了。

例二:

  假设变量 xxx 初值为 5。P1P1P1 进程中有语句 x=x+1x=x+1x=x+1;P2P2P2进程中有语句 x=x−1x=x-1x=x−1;试利用整型信号量机制来解决进程间的并发,即在访问临界变量 xxx时不出现错误,并进行分析。

解:

  变量 xxx 是临界资源,为保证对其访问的正确性定义整型信号量 sss,并初始化为 1,Semophore s=1;


P1P1P1,P2P2P2 并发的一个实例为:

注:整型信号量不遵循“让权等待”原则。

2.记录型信号量(重点!!!)

  由于整型信号量未遵循让权等待这一原则,会导致忙等所以它并不是最佳的一个方法,所以就引出了信号量的第二个阶段—记录型信号量,记录型信号量的进程申请不上不会忙等(CPU一直申请),它会将申请不上资源的进程阻塞或者等待,然后这些进程就会被链接到链表L上面,通过访问这个链表我们就能知道哪些资源在等待资源,随着资源的使用访问就可以从L上唤醒其中一个进程,使它从阻塞态进入到就绪态,然后等待CPU去调度执行。

记录型信号量采用记录型的数据结构,描述为:
typedef struct
{ int value;
struct process_control_block *list;
} Semaphore;
其中:

value:表示资源个数
list:等待该资源而阻塞的进程链表

  记录型信号量的P、V操作和整型信号量不同:

  它在申请资源时不管能不能申请上都会先让资源数量减1,具体如下:

wait(s)和signal(s)的描述:

wait(s):

wait(Semaphore &s)
{
s.value=s.value-1;
if (s.value<0)
block(s.list);//阻塞并插入到 s.list 阻塞队列
}

signal(s):

signal(Semaphore &s)
{
s.value=s.value+1;
if (s.value≤0)
wakeup(s.list); //唤醒 s.list 队列中的第一个进程
}

  • 说明:
    ➢ wait 操作意味着请求一个单位的资源(进入区)。
    ➢ signal 操作意味着释放一个单位的资源(退出区)。
    ➢ s.value<0 表示该类资源已经分配完毕,此时 s.value 的绝对值就是等待链表 s.list 中的进程个数
    ➢ 若 s.value 的初值为 1,则表示该资源为临界资源,此信号量成为互斥信号量。


例:

  假设变量 xxx 初值为 5。P1P1P1 进程中有语句 x=x+1x=x+1x=x+1;P2P2P2 进程中有语句 x=x−1x=x-1x=x−1;P3P3P3 进程中有语句 x=x+2x=x+2x=x+2;试利用记录型信号量机制来避免在访问临界变量 xxx 时出现错误,并进行分析。

  思考:进程执行的正确结果应为多少?

解:
Semophore s; s.value=1;


本例中,时间片 5 时,P1P1P1 终止,此时唤醒阻塞队列中的对首进程P2P2P2,P2P2P2 便通过了进入区,获得了资源。

3.AND型信号量

问题的提出:

  在实际问题中,一个进程可能同时需要多个资源才能执行,即必须同时获得某种资源的多个单位资源量才可以顺利执行。

  例如:在两个进程 PAPAPA和 PBPBPB都要求访问临界资源 DDD 和 EEE。试解决它们之间的进程同步问题。

解:
如果使用记录型信号量,则需要为 DDD 和 EEE 分别设置信号量 sDsDsD和 sEsEsE,且资源量初值都为 1。
Semaphore sD, sE;
sD.value=sE.value=1;

在执行时,可能出现以下并发情况:
PAPAPA : wait(sD); //sD.value=0
PBPBPB : wait(sE); //sE.value=0
PAPAPA : wait(sE); //sE.value=-1,于是 AAA阻塞
PBPBPB : wait(sD); //sD.value=-1,于是 BBB阻塞


AND 同步机制的基本思想

  所有资源一次性分配,待使用完后再一次性释放。即对于进程所需
资源,要么全部分配到进程,要么一个也不分配。

AND 型同步信号量描述

  假设进程 PPP 同时需要 nnn 类资源,为其所需资源分别分配信号量si,i=1…nsi,i=1…nsi,i=1…n,sisisi为表示资源数量的整数。

Swait 操作为:

Swait(s1,s2,…,sn)
{ if(s1≥1)&&(s2≥1)&&…&&(sn≥1){  for(i=1;i<=n;i++)si=si-1;}else{ ①该进程进入到由第一个未得到满足的资源 Si 所对应的阻塞队列;②并将该进程的程序计数器指向 Swait()的开始处,即该进程下一次执行时重新从 Swait()开始。} }

Ssignal 操作为:

Ssignal(s1,s2,…,sn)
{ for(i=1;i<=n;i++) { si=si+1;将因等待资源 Si 而产生的阻塞队列中的所有进程全部转入就绪队列。}
}


例:

  设有三个进程 P1,P2,P3P1,P2,P3P1,P2,P3,系统有 3 种临界资源 A,B,CA,B,CA,B,C。P1P1P1 执行时同时需要 AAA 和 BBB,P2P2P2 执行是同时需要 BBB 和 CCC,P3P3P3 执行时同时需要A,B,CA,B,CA,B,C。试利用 ANDANDAND 型信号量解决 P1,P2,P3P1,P2,P3P1,P2,P3 间的进程同步问题。

解:为资源 A,B,CA,B,CA,B,C 分别分配信号量 sA,sB,sCsA,sB,sCsA,sB,sC,因为都是临界资源所以初值都为 1。

4.信号量集

问题的提出:

  前面的 P,VP,VP,V 操作中,对某类资源的申请或释放每次只能是一个单位。在 ANDANDAND 型机制中,只要 si≥1si≥1si≥1,就允许分配资源。但在实际应用中,进程对某类资源的申请或释放每次可以是多个(n个n个n个);而当某类资源的数量小于某一下限值,就不能分配了。

  存在的问题:一次性的实质申请和一次性的释放,比较低效,因为只要申请或释放的过程中有一个不满足,所有的都不给它,这就是它存在的问题。

信号量集的描述:

  信号量集实际是对 ANDANDAND 型信号量的扩充,对于某类资源 iii,除了为其设置信号量 sisisi 表示资源数量,还设置 dididi 为每次的需求量,设置 tititi 为分配是的下限值。

  假设进程 P 同时需要 n 类资源,为其所需资源分别分配信号量 si,需求量 di,下限值 ti,i=1…n。

Swait 操作为:

Swait(s1,t1,d1,s2,t2,d2…,sn,tn,dn)
{ if(s1≥t1)&&(s2≥t2)&&…&&(sn≥tn)for(i=1;i<=n;i++) si=si-di;else{①该进程进入到由第一个未得到满足的资源 Si 所对应的阻塞队列;②并将该进程的程序计数器指向 Swait()的开始处,即该进程下一次执行时重新从 Swait()开始。}
}

进入区

Ssignal 操作为:

Ssignal(s1,t1,d1,s2,t2,d2…,sn,tn,dn)
{ for(i=1;i<=n;i++) { si=si+di;将因等待资源 i 而产生的阻塞队列中的所有进程全部转入就绪队列。}
}

退出区

信号量集的几种特殊形式

  • ① Swait(S,d,d)。
    此时只对一种资源申请,但允许每次申请 ddd 个资源,当现有资源数少于 ddd 时,不予分配。

  • ② Swait(S,1,1)。
    此时只对一种资源申请,每次申请 1 个资源,当现有资源数少于 1 时,不予分配。

  • ③ Swait(S,1,0)。
    这是一种很特殊且很有用的信号量操作。当S≥1S≥1S≥1 时,允许多个进程进入某特定区;当 SSS 变为 0 后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。

三、几种信号量机制的区别

  • 申请资源未满足时是否需要阻塞

  整型信号量中,在申请资源未满足时,不释放 CPU,不阻塞;其余三种信号量机制,在申请未满足时,都自我阻塞,并到等待该资源的阻塞队列中。

  • 申请资源的种类个数

  整型信号量和记录型信号量机制中,进程每次申请1种资源的1个;ANDANDAND 型信号量机制中,进程每次同时申请 n(n≥1)n(n≥1)n(n≥1)种,每种申请 1 个;信号量集中,进程每次同时申请 n(n≥1)n(n≥1)n(n≥1)种,每种申请 d(d≥1)d(d≥1)d(d≥1)个。

  • 资源释放唤醒后的重新调度

  整型信号量中,无唤醒,重新调度执行是仍先检测;记录型信号量中,每次只唤醒阻塞链表中的第一个进程,且该进程无需重新检测直接进入临界区执行;ANDANDAND 型和信号量集中,每次将某种资源的阻塞队列中所有进程全部唤醒,且在调度执行时重新进行检测执行 SwaitSwaitSwait 操作。

四、信号量的应用

4.1 进程互斥

  实现互斥就是在PPP、VVV操作之间加入临界操作,也就是在进入区和退出区之间加入临界区,这样就能实现进程互斥。

  • 1.利用信号量实现进程互斥

① 选择合适的信号量机制,将信号量 sss 初值设置为 1;
② 在进程中的进入区使用 PPP 操作,在退出区使用 VVV 操作。

  • 这里我们要注意:Var mutex: semaphore :=1,代表互斥信号量为1.
  • parbegin和parend这两句话中间的进程是可以并发的,没有这两句话,p1,p2,p3只是顺序执行

4.2 利用信号量实现前驱关系

  • 2.利用信号量实现前趋关系

① 创建进程,每个进程中分别包含对应的程序段或语句;
② 为每个构成前趋关系的进程对都设置一个公用信号量 s,且初值为 0;
③ 设有 Pi→PjPi→PjPi→Pj,则
在前趋进程 $Pi 中:语句或程序段; signal(s);
在后继进程 Pj中:wait(s); 语句或程序段;

4.3 利用记录型信号量实现同步


总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

操作系统 第二章 进程的描述与控制(4)进程同步(重点)相关推荐

  1. 模拟进程创建、终止、阻塞、唤醒原语_操作系统第二章--进程的描述与控制

    操作系统第二章--进程的描述与控制 前趋图和程序执行 前趋图 前趋图是一个有向无循环图DAG,用来描述进程之间执行的前后关系 初始结点:没有前趋的结点 终止结点:没有后继的结点 重量:表示该结点所含有 ...

  2. 操作系统第二章进程的描述与控制

    第二章进程的描述与控制 前驱图和程序执行 程序并发执行 程序的并发执行 程序并发执行时的特征 间断性 失去封闭性 不可再现性 进程的描述 进程的定义 进程是程序的一次执行 进程是一个程序及其数据在处理 ...

  3. 操作系统第二章-进程的描述与控制

    前趋图和程序执行 1.前趋图 所谓前趋图(PG),是指一个有向无环图,可记为DAG,用于描述进程之间执行的先后顺序,具体见书上P35. 没有前趋的结点称为初始结点,没有后继的结点称为终止结点,每个结点 ...

  4. 【操作系统】 第二章 进程的描述与控制

    第二章 进程的描述与控制 2.1 什么是进程 程序代码+相关数据+程序控制块PCB 当处理器开始执行一个程序的代码时,称这个执行的实体为进程 2.1.1 进程和进程控制块PCB PCB(Process ...

  5. 【操作系统】第二章--进程的描述与控制--笔记与理解(2)

    笔记理解之后可以进行深入解释→[操作系统]第二章–进程的描述与控制–深入与解释(2) 文章目录 第二章--进程的描述与控制--笔记与理解(2) 经典进程的同步问题 生产者-消费者问题 读者-写者问题 ...

  6. 【操作系统】第二章-进程的描述与控制

    第二章.进程的描述与控制 前言 在传统的操作系统中,为了提高资源利用率和系统吞吐量,通常采用多道程序技术,将多个程序同时装入内存,并使之并发运行,传统意义上的程序不再能独立运行.此时,作为资源分配和独 ...

  7. 考研OR工作----计算机操作系统简答题及疑难知识点总结(第二章 进程的描述与控制)

    计算机操作系统从第二章开始内容会变得异常多,还是希望能够帮助到大家,在这一章阿婆主还会把书上的典型的PV操作题给打上来,给大家用作参考,如果有问题的地方,还请大家在文章下方留言,我好更正,或者你们有更 ...

  8. 第二章 进程的描述与控制

    一.名词解释 1.进程上下文 进程执行活动全过程的静态描述. 包括计算机中与执行该进程有关的各寄存器的值.程序段在经过编译之后形成的机器指令代码集(正文段).数据集.各种堆栈和PCB结构. * 进程控 ...

  9. 操作系统学习笔记——第二章 进程的描述与控制(二)

    2.3 进程控制 进程控制是对系统中的全部进程实施有效的管理,包括进程创建.终止.进程阻塞和唤醒. 一.进程的创建 二.进程的终止 三.进程的阻塞与唤醒 四.进程的挂起与激活 一.进程的创建 创建原语 ...

最新文章

  1. 概率统计 —— 常犯错误
  2. java 反射深度克隆_C#使用反射(Reflection)实现深复制与浅复制
  3. 1209F - Koala and Notebook
  4. pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)
  5. python爬取csdn用户头像
  6. SVN: Can't create session svn
  7. java面向对象程序_面向对象编程基础(java)
  8. 查找命令find和其他常用查找命令
  9. C语言除法向上、向下取整
  10. Linux命令brctl介绍
  11. Android云测云真机调试平台
  12. 大数据的典型应用场景及展望-札记
  13. win10笔记本自带蓝牙连接xbox one s无线手柄(也适用于耳机等蓝牙设备)
  14. u盘iso安装服务器系统怎么安装win7系统安装,u盘装系统怎么直接安装win7系统iso文件...
  15. 再谈计算机编程的学习
  16. pdo mysql num rows_PDO参数说明
  17. 关于SSD写放大问题
  18. shell小实验详解1——for循环语句实现求奇数和与偶数和+小技巧使用!!!
  19. Socks5代理Socks5 Proxy
  20. photon 服务器操作系统,PhotonServer游戏服务器端教程

热门文章

  1. Detours库APIHook演示抓取微信界面绘制文字函数
  2. 动态规划--01背包问题详解
  3. IT技术人员的六大方向
  4. AntDB数据库与DSG强强联手,助力通信行业核心系统国产化
  5. sqlserver数据库可疑解决办法
  6. USB OTG原理简述
  7. html怎么修改表格行列间距,html表格如何设置间距
  8. StringUtils的使用
  9. ARM SMMU介绍
  10. Java~设计模式之观察者模式 || 班长大喊老师来啦