文章目录

  • 【第四章】进程同步
    • | 本章概念
      • 1.进程同步相关概念
      • 2.软件同步机制
      • 3.硬件同步机制
      • 4.信号量机制
      • 5.管程机制(了解)
    • | 本章算法
      • 1.生产者-消费者 进程同步问题
      • 2.读者-写者 进程同步问题
      • 3.信号量与进程数的关系
    • | 课后简答题

【第四章】进程同步

| 本章概念

1.进程同步相关概念

  • 进程同步的目的:使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性

  • 进程间的制约关系:互斥关系(进程互斥使用临界资源)、同步关系(进程间相互合作)

  • 临界资源:一次只允许一个 进程使用,称这样的资源为临界 资源或互斥资源或共享变量。进程间应采取互斥方式,实现对临界资源的共享。

  • 进入区:用于检查是否可以进入临界区的代码段

    临界区:进程中涉及临界资源的代码段;

    退出区:将临界区正被访问的标志恢复为未被访问标志。

    剩余区:其它代码

item nextConsumed;
while (1) {//进入区while (counter == 0)/* do nothing */nextConsumed = buffer[out];out = (out + 1) % BUFFER_SIZE;counter--; //临界区//退出区break;//其它区
}
  • 解决临界区问题的同步机制,需要遵循下列4条准则:空闲让进、忙则等待、有限等待、让权等待(当进程不能进入自己的临界区时,应该立即释放处理机,避免进程陷入忙等)
  • 进程同步的机制有:软件同步机制、硬件同步机制、信号量机制、管程机制

2.软件同步机制

  • 使用编程方法解决临界区问题,有难度、具有局限性,现在很少采用

  • 介绍一种重要的软件同步机制算法 —— Peterson算法

    算法思想:如果双方都想进入临界区,可以尝试让进程“孔融让梨”,主动让对方先使用临界区

//共享变量
bool flag[2];  //数组,下标对应进程号,元素表示对应下标的进程有无进入临界区的意愿
int turn = 0;  //若在P1中 turn=0,则表示若P0想进入临界区,P1愿意让P0插队进入临界区;若在P0中 turn=1,则表示若P1想进入,P0愿意让P1插队进入临界区//P0进程
//【进入区】
flag[0] = true; //P0想进入临界区,则flag[0]表示为true
turn = 1;  //P0进入临界区的时候若P1也想进,则turn=1表示P0愿意给P1插队
while(flag[1] && turn==1); //若P1正在占用临界区(flag[1]==true)或者 P1不愿意让P0插队,则P0进入就绪状态,等待P1用完临界资源
critical section;  //【临界区】
flag[0] = false; //【退出区】使用完临界资源,则想进入临界区改为false
ramainder section;  //【剩余区】//P1进程
flag[1] = true;
turn = 0;
while(flag[0] && turn==0);
critical section;
flag[1] = false;
remainder section;

3.硬件同步机制

  • 缺点:不符合“让权等待”原则,浪费CPU时间。很难解决复杂的同步问题

  • 关中断:

    • 进入锁测试之前关闭中断,完成锁测试并上锁之后才打开中断(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也不能发生进程切换,进而不可能发生两个进程同时访问临界区的情况)
    • 优点:简单、高效
    • 缺点:不适用于多处理机,只适用于操作系统内核进程,不适用于用户进程(因为开 / 关中断指令只运行在内核态,这组指令如果能让用户用会很危险)
  • 互斥锁:

    • 设临界区的类名为S。为了保证每一次临界区中只能有一个程序段被执行, 又设锁定位 key[S]。key[S] 表示该锁定位属于类名为S的临界区。
    • key[S]=1时表示类名为S的临界区可用, 位 key[S]=0时表示类名为S的临界区不可用。
  • TestAndSet 指令:是一种借助一条硬件指令——“测试并建立”指令TS(Test-andSet)以实现互斥的方法。在许多计算机中都提供了这种指令

//lock表示当前临界区是否被加锁,true加了,false没加
bool TestAndSet (bool *lock){bool old = *lock;*lock = true;return old;
}//进程Pi
while(TestAndSet(&lock));
//临界区代码
.....
lock = false; //解锁
//剩余区代码
.....
  • Swap指令:用硬件实现的,执行过程中不允许被中断,只能一气呵成
//Swap 指令的作用是交换两个变量的值
Swap (bool *a , bool *b){bool temp;temp = *a;*a = *b;*b = temp;
}//进程Pi
do{key = true;do{Swap(lock,key);}while(key != false)//临界区代码......lock = false;//剩余区代码......
}while(true)

4.信号量机制

  • 软件同步机制和硬件同步机制,都无法实现“让权等待”
  • 原语:只能一气呵成,不能被中断。原语是由关中断 / 开中断指令实现的。因此若能把进入区、退出区的操作用原语来实现,则可避免同时访问临界区的问题
  • wait(S) 原语和 Signal(S) 原语,可以理解为一个名为wait / signal的方法(函数),S即为我们传入的参数——信号量。
  • PV操作:
    • 常常把 wait(S) 写成 P操作,Signal(S) 写成V操作。即:Wait(s)又称为P(S),为进入操作;Signal(s)又称为V(S),V为退出操作
    • P.V操作必须成对出现,有一个P操作就一 定有一个V操作
    • 当为互斥操作时,它们同处于同一进程;当为同步操作时,则不在同一进程中出现
  • 信号量机制缺点:同步操作分散、易读性差、不利于修改和维护、正确性难以保证

下面介绍一些常见信号量:

  • 整型信号量:S为整型变量。缺点:进程忙等
wait(S):while s<=0 ; /*do no-op*/s:=s-1;signal(S):s:=s+1;
  • 记录型信号量:去除忙等的信号量

    • 每个信号量S除一个整数值S.value外,还有一个进程等待队列S.list,存放阻塞在该信号量的各个进程PCB
    • 信号量只能通过初始化和两个标准的原语PV来访问,作为OS核心代码执行,不受进程调度的打断
    • 初始化指定一个非负整数值,表示空闲资源总数(又称为"资源信号量"),若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数
wait(semaphores *S) { //请求一个单位的资源S->value --; //资源减少一个if (S->value<0) block(S->list) //进程自我阻塞
}
signal(semaphores *S) //释放一个单位资源
{S->value++; //资源增加一个if (S->value<=0) wakeup(S->list); //唤醒等待队列中的一个进程
}
  • AND型信号量:

    • 基本思想:将进程在整个运行过程中需要的所有 资源,一次性全部分配给进程,待进程使用完后再一起释放。
    • 对若干个临界资源的分配,采用原子操作。
    • 在wait(S)操作中增加了一个“AND”条件,故称之为AND同步
Swait(S1,S2,…,Sn) {while (TRUE) {if (Si>=1 && … && Sn>=1) {for (i =1;i<=n;i++) Si--){break;}}}}else {//......}
}}

信号量集——扩充AND信号量:对进程所申请的所有资源以及每类资源不同的资源需求量,在 一次P、V原语操作中完成申请或释放

  • 信号量的应用:信号量必须置一次且只能置一次初值,初值不能为负数;除了初始化,只能通过执行P、V操作来访问信号量

    • 利用信号量实现进程互斥:设置互斥信号量
    • 利用信号量实现前趋关系
    • 利用信号量实现进程同步:设置同步信号量
//信号量实现互斥
semaphore mutex;
mutex=1; // 初始化为1
while(1)
{wait(mutex);临界区;signal(mutex);剩余区;
}
//信号量实现进程同步
P1(){C1;signal(s);…
}P2(){…wait(s); C2;
}

5.管程机制(了解)

  • 由编程语言解决同步互斥问题

  • 一个管程定义了一个数据结构和能为并发进程所执行(在该 数据结构上)的一组操作

  • 管程的功能:互斥(管程中的变量只能被管 程中的操作访问、任何时候只有一个进程在管程中操作、类似临界区、由编译器完成)、同步


| 本章算法

1.生产者-消费者 进程同步问题

  • 需要注意的地方

    • 用于实现互斥的wait(mutex)和signal(mutex)必须成对出现
    • 每个程序中的多个wait操作的顺序不能颠倒,应先执行对资源信号量的wait操作,再执行对互斥信号量的wait操作,否则可能会引起进程死锁。
  • 具体代码与实现,请参考:https://blog.csdn.net/liushall/article/details/81569609

//生产者-消费者 伪代码var items = 0, space = 10, mutex = 1;
var in = 0, out = 0;
item buf[10] = { NULL };producer {while( true ) {wait( space );  // 等待缓冲区有空闲位置, 在使用PV操作时,条件变量需要在互斥锁之前wait( mutex );  // 保证在product时不会有其他线程访问缓冲区// productbuf.push( item, in );  // 将新资源放到buf[in]位置 in = ( in + 1 ) % 10;signal( mutex );  // 唤醒的顺序可以不同signal( items );  // 通知consumer缓冲区有资源可以取走}
}consumer {while( true ) {wait( items );  // 等待缓冲区有资源可以使用wait( mutex );  // 保证在consume时不会有其他线程访问缓冲区// consumebuf.pop( out );  // 将buf[out]位置的的资源取走out = ( out + 1 ) % 10;signal( mutex );  // 唤醒的顺序可以不同signal( space );  // 通知缓冲区有空闲位置}
}

2.读者-写者 进程同步问题

  • 有两组并发进程:读者和写者, 共享一组数据区

  • 要求:允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。

  • 分类:读者优先(第一类 读者写者问题) ;写者优先(第二类 读者写者问题)

  • 具体代码与实现,请参考:https://blog.csdn.net/qq_35235032/article/details/106652964?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106652964-blog-104970354.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106652964-blog-104970354.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=1

//读者优先(伪代码)// 互斥读者与读者
semaphore rmutex = 1;
// 互斥读者与写者,写者与写者
semaphore mutex = 1;
// 表示读者数量,需看成临界资源,即进来一个读者就+1操作
int readcount = 0;// 读者进程
void reader()
{while(TRUE){// 互斥其他读者,只允许一个读者进入P(rmutex);if(readcount == 0)// 如果读者数目为0,所以就必须互斥写者P(mutex);// 读者数+1readcount++;// 释放,让其他读者进来修改readcountV(rmutex);/* 读操作 */// 读者离开,需要访问readcountP(rmutex);readcount--;// 如果此时没有读者了,表示写者可以进行写了if(readcount == 0)V(mutex);// 释放readcount资源V(rmutex);}
}void writer()
{while(TRUE){// 写者和一般消费者进程一样,获取信号量值P(mutex);/* 写操作 */// 让文件可读和可写V(mutex);}
}void main()
{reader();writer();reader();/*.......*/
}
//写者优先(伪代码)// 互斥读者与写者
semaphore mutex = 1;
// 互斥读者
semaphore rmutex = 1;
// 互斥写者
semaphore wmutex = 1;
// 表示是否还有写者
semaphore readable = 1;// 读者数量,写者数量
int readcount = 0, writecount = 0;void reader()
{// 先看是否可读P(readable);// 互斥其他读者修改readcountP(rmutex);if(readcount == 0)// 如果没有读者,需要互斥写者P(mutex);readcount++;V(rmutex);V(readable);/* 读取中 */P(rmutex);readcount--;if(readcount == 0)V(mutex);V(rmutex);
}void writer()
{// 互斥其他写者,写入writecountP(wmutex);if(writecount == 0)// 此时不能让写者以后的读者进去P(readable)writecount++;V(wmutex);// 互斥在写者之前的读者P(mutex);/* 写入中 */// 写入完成离开V(mutex);P(wmutex);writecount--;if(writecount == 0)// 让写者以后的读者可读V(readable);V(wmutex);}void main()
{reader();writer();reader();/* ... */
}

3.信号量与进程数的关系

书本课后13题.若信号量的初值为2,当前值为-1,则表示有多少个等待进程?请分析。

信号量初值:表示系统中的资源数量

当信号量 <0 的时候,表示资源已经分配完毕,进程自我阻塞。

因而,” 等待进程 “ 的数量等于 |负值的信号量的绝对值|

因此题目中,有 |-1| = 1个等待进程

书本课后14题.有m个进程共享同一临界资源,若使用信号量机制实现对某个临界资源的互斥访问,请求出信号量的变化范围。

信号量初值为信号量的最大值,表示最多可以分配的请求

若信号量初值为1,则信号量最大为1,最小量为1-m(总有一个进程会进行,因此最多有1-m个阻塞的)

因而变化范围为 [1-m , 1]

书本课后15题.若有4个进程共享同一程序段,而且每次最多允许3个进程进入该程序段,则信号量值的变化范围是什么?

程序段作为共享资源,最多允许3个进程进人其中,因此设置信号量初值为3。当4个进程共享该程序段时,在每个进程申请进入时,信号量都会执行减1操作。

当第1个进程申请进入时,信号量值变为2;

第2个进程申请进入时,信号量值变为1;

第3个进程申请进入时,信号量值变为0,

第4个进程申请进入时,信号量值变为-1。

因此,信号量的变化范围是3,2,1,0,-1


| 课后简答题

【第四章 | 进程同步】《操作系统 慕课版》课后答案 + 复习相关推荐

  1. 汤小丹计算机操作系统慕课版课后题答案第五章:储存器管理

    一. 简答题 储存器管理的基本任务,是为多道程序的并发执行提供良好的储存器环境.请问:"良好的储存器环境"应包含哪些方面? (1)独立性:各进程应拥有独立的地址空间,运行不会相互干 ...

  2. 汤小丹计算机操作系统慕课版课后题答案第六章:虚拟储存器

    简答题 常规储存器管理方式具有哪两大特征?他们对系统性能有哪些影响? 一次性:将全部作业装入内存才运行.会导致内存装不下或者装的太少影响系统性能. 驻留性:调入内存后直到运行结束都不会调出内存.浪费内 ...

  3. Java进阶:java程序设计慕课版课后答案浪潮优派

    摘要 Spring框架自诞生来就备受开发者青睐,很多开发者一致认为它是目前最屌的Java项目,正是因为它的"过人之处",市面上99%的企业都在使用Spring框架. 所以,Spri ...

  4. 牛逼!java程序设计慕课版课后答案浪潮优派

    这些面试题包含哪些内容? 借花献佛!朋友干了5年整的Java面试官,给我分享了一份面试官最爱问的Java面试题这份面试题包含了 19 个模块:Java 基础.容器.多线程.反射.对象拷贝.Java W ...

  5. 【《操作系统慕课版》合集】期末复习 + 核心算法整理 + 课后答案

    所有章节归类好了概念.算法,同时课后的简答题也一并给出了答案.祝各位复习愉快~ 整理不易希望能点个赞~ 目录 第一章 操作系统概述 第二章 进程的描述与控制 第三章 处理机调度与死锁 第四章 进程同步 ...

  6. 考研OS备考|计算机操作系统|汤小丹慕课版|课后习题答案|复试拓展

    本文主要是考研复试备考自用,所以课后习题答案主要是简答题部分,此外还有其他的简答补充.如果发现有误,欢迎在评论区或者私信指出. 计算机操作系统|汤小丹慕课版|课后习题答案|考研备考 第1章 操作系统引 ...

  7. C程序设计谭浩强第五版课后答案 第三章习题答案

    C语言程序设计谭浩强第五版课后答案第三章 1.假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比.计算公式为p=(1+r)np = (1+r)^np=(1+r ...

  8. 沈坤荣《宏观经济学教程》第3版课后答案

    完整版在线阅读: http://wwxx.100xuexi.com/Ebook/170585.html 本书是沈坤荣<宏观经济学教程>教材的学习辅导书,严格按照沈坤荣<宏观经济学教程 ...

  9. 自顶向下 谢希仁计算机网络第七版课后答案

    谢希仁计算机网络第七版课后答案 转载:链接: link. 第一章 概述 1-01 计算机网络向用户可以提供那些服务?答: 连通性和共享 1-02 简述分组交换的要点.答:(1)报文分组,加首部(2)经 ...

  10. 单片机原理及应用第三版课后答案张毅刚

    单片机原理及应用第三版张毅刚答案 内容简介 本书为"十二五"普通高等教育本科*规划教材单片机原理及应用第三版课后答案,全书详细介绍了美ATMEL公司的增强型AT89S52单片机的硬 ...

最新文章

  1. python爬虫requests实战_Python_爬虫_requests小实战
  2. canvas转化图片并下载
  3. C++建立动态二维数组
  4. Winform中自定义xml配置文件后对节点进行读取与写入
  5. 命令行调用springboot服务_Spring Boot命令行界面的使用
  6. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程
  7. popfd指令_2. PUSH 和 POP 指 令 3
  8. linux下sqlserver端口号,linux下连接sqlserver配置及otl编程.docx
  9. 一文读懂腾讯云“AI即服务”战略新品“智能云”
  10. Javascript之基本包装类型
  11. 天翼网关安装php,AC双频光猫拆机:天翼网关2.0-HS8145v和移动智能光猫HS8546v
  12. Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
  13. linux远程利用漏洞CVE-2016-4484 93次空密码重试就可以获得root权限 影响大多数Linux版本...
  14. 用计算机公式表白,昨天,我用IF函数表白成功了!
  15. Word文档基本操作
  16. 文化网页设计成品 web网页设计实例作业 ——古典中国风工艺美术(9页) html+css+javascript网页设计实例
  17. [前端] HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
  18. 变形金刚2中的各个角色,及车型(带图)第二篇。
  19. 轻松制作短视频网页工具:锐视RyView 帮助文档
  20. ValueError: The view XXXView didn't return an HttpResponse object. It returned None

热门文章

  1. 网易云课堂Java入门视频课程
  2. JSP技术【应用】快速查询
  3. PS批量导入图片进行后续处理
  4. 微电子器件实验 03 - | 晶体管开关时间的测量
  5. namp扫描网络中IP、端口信息
  6. Golang UDP编程
  7. 全国职业院校《计算机网络应用》赛项 2019 年广西高职组------样题分析
  8. 一个能够快速把JSON数据格式化成漂亮网页的开源JavaScript库:angular-json-human
  9. C#:if (!IsPostBack)作用
  10. Eucalyptus使用的技术