16-用信号量实现进程互斥,同步,前驱关系
2023-06-13 09:14:07 时间
信号量机制实现进程互斥
主要步骤
- 分析并发进程的关键活动,划定临界区(例如:对打印机等临界资源的访问就应放在临界区内)
- 设置互斥信号量,常命名为mutex,初值为1(因为一般情况下对临界区的访问同一时间只能存在一个进程)
- 在临界区之前执行P(mutex)
- 在临界区之后执行V(mutex)
示例
semaphore mutex=1;
P1(){
...
P(mutex)
临界区代码段...
V(mutex)
...
}
P2(){
...
P(mutex)
临界区代码段...
V(mutex)
...
}
注意
- 对不同的临界资源需要设置不同的互斥信号量(mutex1,mutex2)
- P,V操作必须成对出现,缺少P就不能保证临界资源的互斥访问,缺少V就会导致资源永远不被释放,等待进程永远不能唤醒
信号量机制实现进程同步
进程同步的目的在于让各个本来异步并发的进程按要求有序推进
P1(){
代码1;
代码2;
代码3;
}
P2(){
代码4;
代码5;
代码6;
}
例如,在上面的P1和P2进程中,由于异步性导致程序执行顺序并不确定,但我们必须保证代码1和代码2在代码4之前执行,此时就需要使用进程同步机制实现
用信号量实现进程同步的步骤
- 分析什么地方需要实现“同步关系”,即保证“一前一后”执行的两个操作
- 设置同步信号量:S,初值为0
- 在“必须先执行的操作”之后执行V(S)
- 在“必须后执行的操作”之前执行P(S)
示例
semaphore S=0; //初始化同步信号量,初值为0
P1(){
代码1;
代码2;
//代码1和代码2是必须先执行的操作
//所以在它们之后执行V(S)
V(S);
代码3;
}
P2(){
//代码4是必须后执行的操作
//所以在它前面执行P(S)
P(S);
代码4;
代码5;
代码6;
}
若先执行了P1进程,执行完代码1和代码2后,进行V操作,则信号量S++后S=1,之后执行P2进程时,执行P操作判断S=1>0所以表示有可用资源可以继续执行,S–后S=0,不会执行block原语被阻塞,可以继续往下执行代码4
若先执行P2进程,由于P操作判断S=0表示没有可用资源,所以执行block原语,主动请求阻塞P2进程,直到P1进程执行完代码1和代码2后到V操作发现S=-1表示等待队列中有进程在等待资源,所以其主动唤醒P2进程,P2进程得以继续执行代码4
信号量机制实现前驱关系
一共有六个进程P1,P2…P6,其中进程P1中有代码S1,P2中有代码S2,…P6中有代码S6,这些代码要求按如下前驱图所示的顺序执行
主要步骤
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作),所以
- 要为每一对前驱关系各设置一个同步变量
- 在“必须先执行操作”之后对相应同步变量执行V操作
- 在“必须后执行操作”之前对相应同步变量执行P操作
不难看出,前驱关系本质上还是更复杂的进程同步问题
相关文章
- Swoole协程与传统fpm同步模式比较
- 基于Redis Set的消息同步(执行)方案
- 一文带你深入理解Java多线程与高并发:Atomic类和线程同步新机制
- 并发和并行、线程和进程,异步和同步之间到底是什么关系?
- 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账户同步 | 源码资源 )
- python多进程编程-线程同步锁
- 一篇文章让你明白Redis主从同步
- Linux信号量:实现有效的进程间同步(linux信号量使用)
- 量Linux进程:利用信号量进行同步(linux进程信号)
- 简单而高效: 使用Redis实现数据同步(redis实现数据同步)
- MySQL 集群同步:实现高可用性(mysql集群同步)
- Linux下线程间的通信:实现同步传输(线程通信linux)
- Linux信号量实现进程间同步(linux信号量同步)
- 同步MongoDB数据库,全面提升效率(mongodb数据库同步)
- 错误MySQL同步:忽略错误保持进程继续(mysql同步跳过)
- 解决MySQL不同步问题(mysql不同步)
- MySQL实现双主同步,实现数据永不掉线(mysql双主同步)
- Oracle 数据同步:实现高效数据共享的关键步骤(oracle同步数据)
- 同步解决 Linux 服务器时间同步问题(linux服务器时间)
- BCP快速入库Oracle,提高数据同步速度(bcp入库oracle)
- 让数据库与Redis实现无缝同步(数据库数据同步redis)
- 构建会话同步的Redis集群(会话同步集群redis)
- 实现四台Redis服务器实时同步(四台redis同步)
- 实现快速可靠将数据同步至Redis(同步数据到redis)
- 调度优化Redis集群的同步策略(redis集群同步策略)
- Oracle SLT 数据同步的灵活杀手(oracle sltln)
- 使用Sqlserver事务发布实现数据同步(sql2008)