进程同步及经典问题

news2024/11/19 7:40:43

目录

1、基本概念

1.1两种形式的制约关系

 1.2临界资源

1.3临界区

1.4同步机制应遵循的规则

 2、硬件同步机制

 3、信号量机制(重要)

3.1整型信号量

3.2记录型信号量

3.3AND型信号量

3.4信号量集

4、信号量的应用

4.1利用信号量实现进程互斥

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

5、经典进程的同步问题

1.生产者-消费者问题

2.哲学家就餐问题


1、基本概念

进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。

1.1两种形式的制约关系

(1)间接相互制约关系

表现为进程互斥

可以发生在任何进程之间

互斥是并发执行的多个进程由于竞争同一资源而产生的相互排斥的关系!

(2)直接相互制约关系

表现为进程同步

进程同步是合作完成任务的关系!

为完成同一个任务的诸进程间,因需要协调它们的工作而相互等待、相互交换信息所产生的直接制约关系。这种制约主要源于进程间的合作。

 1.2临界资源

一次仅允许一个进程使用的资源

生产者与消费者问题案例:

//生产者进程和消费者进程共享的变量:
int  n;
typedef struct {……} item;
item  buffer[n];
int in, out;
int counter;

//生产者
Producer(){ 
  while(1){
     …
     produce an item 
         in nextp;  
     …
     while(counter==n) 
         do no-op;
     buffer[in]=nextp;
     in=in+1 mod n;
     counter++;
  }}

//消费者
Consumer(){
  while(1){
     while(counter==0) 
         do no-op;
     nextc=buffer[out];
     out=out+1 mod n;
     counter--;
     consume the item
          in nextc;
  }
}

1.3临界区

  • 每个进程中访问临界资源的那段程序
  • 保证诸进程必须互斥进入相关临界区,便可实现诸进程对临界资源的互斥访问

 一个访问临界资源的循环进程描述如下:

while(true)
{
   进入区
   临界区
   退出区
   剩余区
}

进入区:对欲访问的临界资源进行检查,若此刻未被访问,设正在访问的标志
临界区:访问临界资源
退出区:将正在访问的标志恢复为未被访问的标志
剩余区:其余部分

1.4同步机制应遵循的规则

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待

 2、硬件同步机制

  • 软件实现方法就是在进入区设置和检查一些标志来判断是否有进程在临界区,如果已有进程在临界区,则等待;
  • 进程离开临界区后则在退出区修改标志。
  • 关键问题是设置什么标志和如何检查标志。
  • 设有两进程Pi和Pj共享一个临界资源R;
  • 用软件方法使进程Pi和Pj互斥访问资源R。

 3、信号量机制(重要)

概念:信号量是一个仅能由原语对其进行操作的整型变量或记录型变量。之所以称其为信号量,来源于交通管理中的信号灯的概念。

Wait、Signal操作是原语

  • Wait操作 :申请一个单位的资源,又称P操作
  • Signal操作:释放一个单位的资源,又称V操作

3.1整型信号量

最初把整形信号量定义为一个用于表示资源数目的整型量S

Wait操作  wait(S):	 
              while(S<=0) /*do no-op*/
              S=S-1;
Signal操作  signal(S):	  
               S=S+1;

 Wait、Signal操作是原子操作,不可中断。

3.2记录型信号量

未遵循“让权等待”,会使进程出现“忙等”的状态

记录型信号量

一般是由两个成员组成的数据结构,其中一个成员是整型变量,表示该信号量的值,另一个是指向PCB的指针

struct semaphore
{
   int value;
   PCB *L;     //进程队列指针
}

void  Wait(struct semaphore s)
{
   s.value--;//申请一个单位的资源
   if(s.value<0)block(s.L)
   //若信号量计数值小于0,
   //表示无资源,则阻塞等待,
   //重新调度;否则调用进程继续。
}

void  Signal(struct semaphore s)
{
   s.value++;//释放一个单位的资源
   if(s.value<=0)wakeup(s.L)
   //若信号量计数值小于等于0
   // 表示有进程在等待该资源,
   //唤醒一个等待者。
}
  • 每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L,登记阻塞在该信号量的各个进程的标识;
  • 信号量只能通过初始化和两个标准的原语来访问;
  • 初始化指定一个非负整数值,表示空闲资源总数(又称为“资源信号量”),
  • 若为非负值表示当前的空闲资源数,
  • 若为负值其绝对值表示当前等待临界区的进程数。
     

3.3AND型信号量

基本思想:将进程在整个运行过程中所需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。

SWait(S1, S2, …, Sn)
    if (S1 >=1 && … && Sn>=1)
        for( i=1;i<=n;i++)
           Si= Si -1 ;
    else
      Place the process in the waiting queue associated with the first Si found with Si <1,and set the program counter of this process to the beginning of Swait operation

SSignal(S1, S2, …, Sn)
    for (i=1;i<=n;i++)
       Si= Si +1 ;
       Remove all the process waiting in the queue associated with  Si into the ready queue

3.4信号量集

对信号量集S的测试值不再是1,而是该资源的分配下限值t,要求S>=t,否则不予分配。

一旦分配,进程对该组员的需求值为di,即资源占有量,进行Si=Si-di的操作,而不是简单的Si-1。

SWait(S1, t1, d1, …, Sn, tn, dn)
    if (S1>= t1 && … && Sn>= tn )
        for (i=1;i<=n;i++)
           Si= Si - di ;
    else
       Place the executing process in the waiting queue of the first Si with Si < ti and set its program counter to the beginning of the Swait Operation

SSignal(S1, d1, …, Sn, dn)
    for( i=1;i<=n;i++)
       Si= Si +di ;
       Remove all the process waiting in the queue associated with  Si into the ready queue 

4、信号量的应用

4.1利用信号量实现进程互斥

为使多个进程能互斥的访问某临界资源,只需为该资源设置一互斥信号量(mutex),初值设为1.

//进程一
Wait(mutex);
   临界区
Signal(mutex);
   剩余区
//进程二
Wait(mutex);
   临界区
Signal(mutex);
   剩余区

注意:

  • 为临界资源设置一个互斥信号量mutex,其初值为1
  • 在每个进程中将临界区代码置于Wait(mutex)和Signal(mutex)原语之间
  • 必须成对使用Wait和Signal原语:遗漏Wait原语则不能保证互斥访问,遗漏Signal原语则不能在使用临界资源之后将其释放(给其他等待的进程)
  • Wait、Signal原语不能次序错误、重复或遗漏

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

设有两个并发执行的进程P1和P2,P1中有语句S1,P2中有语句S2,希望在S1执行后再执行S2。
需要为进程P2设置一个信号量S,表示前趋是否完成,并赋予其初值为0,将signal(S)操作放在语句S1后面,而在S2语句前面插入wait(S)操作。

5、经典进程的同步问题

1.生产者-消费者问题

问题描述:假设在生产者和消费者之间的公用缓冲池中具有n个缓冲区,利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty与full分别表示缓冲池中空缓冲池和满缓冲池的数量。

semaphore mutex=1,empty=n,full=0
#生产者
void producer()
{
   wait(empty);//申请空缓冲区
   wait(mutex);//申请缓冲池
   ...
   signal(mutex);
   signal(full)
}

#消费者
void consumer()
{
   wait(full);
   wait(mutex);
   ...
   signal(mutex);
   signal(empty);
}

2.哲学家就餐问题

问题描述:

五位哲学家围桌而坐,哲学家在思考问题时不需要任何资源,思考完问题后进入进餐态。
每人必须获得左右两支筷子才能进餐,进餐完毕后,放下筷子继续思考。

1.利用记录型信号量解决

semaphore  chopstick[5]={1,1,1,1,1}

while(true){
   wait(chopstick[ i ]);
   wait(chopstick[ ( i +1) %5] );
      ...
       eat;
      ...
   signal(chopstick[ i ]);
   signal(chopstick[ ( i +1) % 5] );
   ...
   think;
}

2.利用AND型信号量解决

semaphore chopstick[5] ={1, 1, 1, 1, 1};
Process i()
  {   while(true){
         think;
         Swait(chopstick[ ( i +1) % 5] , chopstick[ i ] );
         eat;
         Ssignal(chopstick[ ( i +1) % 5] , chopstick[ i ] );     
     }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring】初识MyBatis (一)

MyBatis概述 MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架&#xff0c;它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索&#xff0c;并使用简单的XML或注解进行配置和原始映射&#xff0c;用以将接口和Java的POJO&#xff08;Plain Old Ja…

Qt libqrencode二维码——QtWidgets

前言 之前写过二维码的程序&#xff0c;但是在U盘上&#xff0c;没带&#xff0c;又重新找的网上资料写的。 网上二维码的生成&#xff0c;大多用到是第三方库libqrencode,这也一样&#xff1a; 效果图 本来是个动图的&#xff0c;都被和谐了&#xff0c;所以换成截图&…

2023年必学的一款测试工具,10 分钟上手

近两年有一款 UI 测试工具非常火爆&#xff0c;名字叫 cypress, 官方号称超越 selenium, 是面向下一代的测试工具。 那 cypress 到底要不要学呢&#xff1f;学起来容易吗&#xff1f;我们一起来看一下。 资料传送门&#xff1a;《软件测试全套基础/进阶/转行资料》 安装 cy…

【计算机视觉】最强 Zero-Shot 视觉应用:Grounding DINO + Segment Anything + Stable Diffusion

文章目录 一、前言二、功能介绍2.1 功能一2.2 功能二2.3 其他有趣的功能 三、总结 一、前言 用 Midjourney 花一个小时做的项目 logo 图&#xff1a; 解释一下 logo 的含义&#xff1a;一只坐在地上的马赛克风格的熊。 坐在地面上是因为 ground 有地面的含义&#xff0c;然后分…

数据流传输适配器系列产品设计资料保存:220-基于光纤的数据流传输适配器系列产品

220-基于光纤的数据流传输适配器系列产品 一、产品概述 光纤传输适配器为公司主力产品&#xff0c;主要包括10Gbps传输&#xff0c;40Gbps传输和100Gbps光纤传输&#xff0c;适配CameraLink&#xff08;双base或者1路Full&#xff09;、HDMI、HD-SDI&#xff1b;多路AD&#x…

TikTok数据报告要怎么看?

TikTok数据报告是一种分析和汇总TikTok平台上数据的报告&#xff0c;包含TikTok平台上的用户数据、视频数据、广告数据等。TK卖家每年可以通过分析TK数据报告来更好地了解受众和市场趋势&#xff0c;从而制定更加精准的营销策略和提升销售业绩。TikTok数据报告也可以帮助商家更…

分布式锁Redission对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redission介绍2 Redission快速入门3 Redission可重入锁原理4 Redission锁重试和WatchDog机制5 Redission锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&…

JavaScript 特性 this与“bind“和“call“,“apply“的理解

本文的目的是帮助JavaScript初学者更好地理解"bind"方法&#xff0c;并帮助那些对"this"的理解不太清楚的人更好地理解"bind"方法和"this"之间的关系。特别是对于那些对"this"的理解不太清楚的人是有所帮助的。在深入学习&q…

通信端点(应用端点)与套接字的关系

为了实现以太网通信的分层与解耦,应用程序通常并不直接驱动TCP/IP协议栈发送以太网数据包。它们通过所在系统提供的一个叫做套接字的东西,调用套接字的接口函数创建套接字处理程序。用套接字处理程序发送自己的应用数据。 返回的套接字处理程序,就代表了这个应用程序。这就…

一篇文章搞定《RecyclerView缓存复用机制》

------《RecyclerView缓存复用机制》 前言零、为什么要缓存一、RecyclerView如何构建我们的列表视图二、缓存过程三、缓存结构1、mChangedScrap/mAttachedScrap2、mCachedViews3、mViewCacheExtension4、mRecyclerPool 四、总结 前言 本篇文章&#xff0c;暂时不加入预加载进行…

沃尔玛入驻教程:中国卖家如何免费、快速入驻沃尔玛walmart.com?

作为一家全球知名的零售巨头&#xff0c;沃尔玛&#xff08;Walmart&#xff09;的在线商城walmart.com拥有庞大的消费者基础和巨大的商机。对于中国的卖家来说&#xff0c;入驻沃尔玛的平台是一个很好的机会&#xff0c;但是有没有什么方法可以免费、快速入驻呢&#xff1f;有…

CTF-PHP反序列化漏洞4-实例理解POP链(经典赛题)

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

软件测试 - 缺陷管理

1. 缺陷的定义 产品不满足用户的需求或者测试执行时实际结果和预期结果不一致都属于缺陷。 2. 缺陷的判定标准及产生原因 软件不满足下述任何一种都算作是软件的缺陷&#xff0c;缺陷的概念是包括bug概念的。 未达到需求说明书指明的功能出现了需求说明书指明不应该出现的错…

cordova-10 打apk

Android升级到api 31后&#xff0c;ionic打出来的release包默认是一个aab文件&#xff0c;要想走以前的手动签名和zipalign的流程我需要打一个没有签名的apk的包&#xff0c;参考以下文章&#xff1a; Android Platform Guide - Apache Cordova Ionic Cordova Build for Andro…

Ubuntu: 搭建 NFS 服务器

文章目录 1. 前言2. 测试环境3. NFS 服务器搭建3.1 安装 NFS 服务3.2 导出 NFS 共享目录3.3 重启 NFS 服务 4. 客户端连接 NFS 服务端5. VMware Ubuntu6. Linux 内核 NFS 支持 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&…

Seurat -- 数据集的整合

文章目录 briefPerforming integration on datasets normalized with LogNormalizePerforming integration on datasets normalized with SCTransform brief 这里主要根据seurat的教程走的&#xff0c;描述了多个单细胞数据集的整合&#xff0c;其中数据集的integration并不是…

java的对象模型

背过面试题的朋友都知道&#xff0c;Java对象是保存在堆内存中&#xff0c;在内存中&#xff0c;一个Java对象包含三部分&#xff1a;对象头&#xff0c;实例数据&#xff0c;对其填充。其中对象头是一个很关键的部分&#xff0c;因为对象头中包含锁状态标志&#xff0c;线程持…

使用MindSDK的at-server组件开发从机模组

使用MindSDK的at-server组件开发从机模组 文章目录 使用MindSDK的at-server组件开发从机模组引言AT命令应用场景AT命令技术简介MindSDK中的at-server组件及样例工程at_port.cat_cmd_led.cmain.c 基于AT命令的人机交互应用使用串口调试助手软件发送AT命令使用Python脚本发送AT命…

Java高阶数据结构 并查集 最小生成树

并查集与最小生成树 文章目录 Java高阶数据结构 & 并查集 & 最小生成树1. 并查集1.1 并查集的原理1.1.1 例子&#xff1a;1.1.2 这样存储有什么好处呢&#xff1f; 1.2 并查集的代码实现1.2.1 类的定义与属性1.2.2 构造方法1.2.3 获取下标的方法1.2.4 获得根节点1.2.5 …

1.SpringCloud技术实用02

SpringCloud技术实用02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。…