网站首页 > 技术文章 正文
进程同步是对多个相关进程在执行次序上进行协调,使并发执行的多个进程之间按照一定的规则共享系统资源。
1、生产者消费者问题:
生产者、消费者问题生产者生产产品放入缓冲区中,消费者从缓冲区中取出产品去消费。不允许消费者从空缓冲区中取产品,也不允许生产者向已经满了的缓冲区添加产品。
2、过程描述:
生产者:
void producer(){
while(1)
{
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--;
}
}
如果不对生产者和消费者进程加以控制会出现不同的结果 (有正确的有错误的),即进程的不可再现性,这是由于进程失去了封闭性引起的。
3、进程同步(信号量机制):
(1)使用wati()和signal()操作来实现对临界资源的访问。
semaphone mutex=1;
Pa(){
while(1){
wait(mutex);//进入区
临界区;//访问临界资源的代码
signal(mutex);//退出区
剩余区; //其他部分
}
}
(2)信号量机制解决进程同步问题:
生产者:
int n=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个
void producer)(){
while(1){
wait(empty);//先对缓冲区执行p操作,如果empty执行之前为0,则阻塞,不必在执行后面的
wait(mutex);//减缓冲池
buffer[in]=nextp;//将生产出来的产品放入缓冲池
in=(in+1)%n;//指针后移
signal(mutex);//释放资源,v操作
signal(full);
}
}
消费者:
int n=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个
void consumer(){
while(1){
wait(full);//先对缓冲区执行p操作,如果full执行之前为0,则阻塞,不必在执行后面的
wait(mutex);//减缓冲池
buffer[in]=nextp;//将消费的产品放入缓冲池
out=(out+1)%n;//指针后移
signal(mutex);//释放资源,v操作
signal(full);
}
}
其中,mutex信号量保证了消费者和生产者对缓冲池的互斥访问,即在消费者(或生产者)释放资源之前, 消费者(或者生产者)不能再利用缓冲池。
(3)信号量值的意义:
例如:设某一个信号量的初始值为1,进行一次p操作后变为0,此时,已经没有资源了,但是没有进程处于阻塞;
进行第二次操作后,变为-1,表示已经没有资源了,并且另外一个进程处于阻塞状态;
初始值1表示可用资源数量。
今天的分享就到这了,我这里准备了一套java进阶方法笔记,学习资料面试题,电子书等免费笔记供大家学习.需要的小伙伴私信我回复"Java"即可领取免费资料.
java核心知识点
猜你喜欢
- 2024-10-29 RT-Thread快速入门-互斥量 互斥方案用什么指标
- 2024-10-29 Datenlord |内存顺序问题(二) dataloader 内存
- 2024-10-29 操作系统概论:第二章 进程管理 简述操作系统进程管理,并举例说明
- 2024-10-29 高可用架构-容错机制 容错技术可以提高系统的可靠性
- 2024-10-29 计算机操作系统笔记第二章进程管理中篇
- 2024-10-29 六大进程通信机制总结 进程通信有哪几种基本类型?
- 2024-10-29 Java系统过载保护机制之信号量的控制
- 2024-10-29 铂金04:通风报信-为何说信号量是线程间的同步良器
- 2024-10-29 记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了
- 2024-10-29 计算机操作系统基础笔记 《计算机操作系统》
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)