进程同步——生产者、消费者问题

进程同步是对多个相关进程在执行次序上进行协调,使并发执行的多个进程之间按照一定的规则共享系统资源。

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表示可用资源数量。

原文地址:https://www.cnblogs.com/zhai1997/p/11999992.html

时间: 2024-08-10 20:59:38

进程同步——生产者、消费者问题的相关文章

经典进程同步问题一:生产者-消费者问题(The producer-consumer problem)

(注:参考教材:计算机操作系统第四版 西安电子科技大学出版社) 问题描述:一群生产者进程在生产产品,并将这些产品提供给消费者去消费.为了使生产者进程与消费者进程能够并发进行,在两者之间设置一个具有n个缓冲区的缓冲池,生产者进程将产品放入一个缓冲区中:消费者可以从一个缓冲区取走产品去消费.尽管所有的生产者进程和消费者进程是以异方式运行,但它们必须保持同步:当一个缓冲区为空时不允许消费者去取走产品,当一个缓冲区满时也不允许生产者去存入产品. 解决方案:我们这里利用一个一个数组buffer来表示这个n

【操作系统总结】经典的进程同步问题-生产者消费者问题

生产者消费者问题 问题描述是:有一群生产者进程在生产产品,此产品提供给消费者去消费.为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费. 利用记录型信号量 semaphore mutex=1,empty=n,full=0; item buffer[n]; //缓冲区 int in=out=0; //输入.输出指针 void producer() { while(1) { - 生产一个产品nex

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

生产者消费者模式(吃包子例子)

生产者-消费者问题是一个经典的进程同步问 题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空 缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费 者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 生产者消费者模式是并发.多线程编程中经典的设计

【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)

用专业术语来说, 进程是程序的一次动态执行.说简单点, 就是进程是系统中的某个任务.操作系统中有多个任务需要执行, 那么怎样执行才能使它们同步呢? 即如何让任务并发执行互不影响呢? 这就引出了进程同步中的经典问题: 生产者消费者问题, 哲学家进餐问题, 读写问题 生产者-消费者问题 有一群生产者进程在生产产品, 并将这些产品提供给消费者进程取消费. 为使生产者进程与消费者进程能并发进行, 在两者间设置了一个具有n个缓冲区的缓冲池, 生产者进程将其所生产的产品翻入缓冲区中, 消费者进程可从一个缓冲

生产者消费者问题、Java实现

来,今天尝试把这个问题搞定.还是这种节奏,看一个问题要先从历史看.全局看,这样我们才能真正掌握其全貌,最终各个击破,了然于胸! 我们先来温习下如下概念: 1. 基础概念 基本的 程序 - Program 程序是静态的源代码或目标程序,是一个没有生命的实体. 进程 - Process 当CPU赋予程序生命时也即操作系统执行它时,程序成为了一个活动的实体(但不是可执行的实体),称为进程 - 进行中的程序. 进程是程序的一个实例: 是计算机分配资源的基本单位: 是线程的容器: 线程 - Thread

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

Linux多线程模拟生产者/消费者问题

描述: 生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空间内执行的N个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供N个消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 输入: 生产者个数.消费者个数.还是缓冲

生产者消费者之信号量的使用

实验报告 一.实验目的 1.熟悉临界资源.信号量及PV操作的定义与物理意义 2.了解进程通信的方法 3.掌握进程互斥与同步的相关知识 4.掌握用信号量机制解决进程之间的同步与互斥问题 5.实现生产者-消费者问题,深刻理解进程同步问题 二.实验环境 Linux系统 三.实验内容 在Linux操作系统下用C或C++实现经典同步问题:生产者-消费者问题,具体要求如下: 1. 一个大小为10的缓冲区,初始状态为空. 2. 2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据