前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >信号量机制实现进程控制

信号量机制实现进程控制

作者头像
wsuo
发布2020-11-24 14:42:25
7330
发布2020-11-24 14:42:25
举报
文章被收录于专栏:技术进阶之路技术进阶之路

一、信号量机制实现进程互斥

我们将一次仅允许一个进程访问的资源称为临界资源,而临界区是指访问临界资源的那段代码。

通常将互斥信号量设置为 mutex ,初始值为 1

为什么初始值设置为 1 呢?

因为数值表示访问临界资源的进程数量,作为进程互斥,同时就只能有一个进程访问临界资源,所以是 1 。

对于不同的临界资源,需要设置不同的互斥信号量。

这里来看一段代码:

代码语言:javascript
复制
semaphore mutex = 1; // 初始化信号量

P1(){
	...
	P(mutex);	//使用临界资源前需要加锁
	临界区代码段...
	V(mutex);	//使用临界资源后需要解锁
	...
}

P2(){
	...
	P(mutex);
	临界区代码段...
	V(mutex);
	...
}

按照代码的顺序模拟一下互斥操作:

  1. 首先执行 P1 进程,执行到 P(mutex) 会将 mutex 的值减一,此时 mutex=0
  2. 然后执行 P1 的代码,此时如果切换到 P2 进程,那么执行 P 操作之后 mutex=-1,那么 P2 进程就会执行 block 原语把自己阻塞起来;
  3. 一直到 P1 执行完 V 操作,mutex 值加一,然后唤醒 P2 进程。

P 操作是对资源的申请,V 操作是对资源的释放,PV 操作必须成对出现。

二、信号量机制实现进程同步

进程同步的目的就是要让并发进程按照要求有序地推进。

代码语言:javascript
复制
P1(){
	代码1;
	代码2;
	代码3;
}

P2(){
	代码4;
	代码5;
	代码6;
}

上面的代码由于异步性导致执行顺序是不可预知的。

但是有时候我们必须要保证代码的执行顺序,假设 代码4 是基于 代码3 的执行结果来的,所以3必须在4前面执行。

我们可以设置一个同步信号量 S=0

然后在前一个操作之后执行 V 操作,在后一个操作之前执行 P 操作。

代码语言:javascript
复制
semaphore S = 0;	//初始化信号量为0

P1(){
	代码1;
	代码2;
	代码3;
	V(S);
}

P2(){
	P(S);
	代码4;
	代码5;
	代码6;
}

如果先执行 P2,他会执行 block 原语阻塞自己,从而得以先执行 P1 保证执行顺序。

三、信号量机制实现前驱关系

前驱图如下所示:

即有 6 个代码,需要按照图中的顺序执行。

解决这个问题可以分 3 步:

  1. 首先为每一对前驱关系设置一个同步变量;
  2. 在前操作之后对相应的同步变量执行 V 操作;
  3. 在后操作之前对相应的同步变量执行 P 操作。

所以结果如下:

代码语言:javascript
复制
semaphore a = 0;	//初始化信号量为0
semaphore b = 0;
semaphore c = 0;
semaphore d = 0;
semaphore e = 0;
semaphore f = 0;
semaphore g = 0;

P1(){
	S1;
	V(a);
	V(b);
}

P2(){
	P(a);
	S2;
	V(c);
	V(d);
}

P3(){
	P(b);
	S3;
	V(g);
}

P4(){
	P(c);
	S4;
	V(e);
}

P5(){
	P(d);
	S5;
	V(f);
}

P6(){
	P(e);
	P(f);
	P(g);
	S6;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、信号量机制实现进程互斥
  • 二、信号量机制实现进程同步
  • 三、信号量机制实现前驱关系
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档