生产者与消费者进程同步问题

合集下载

进程同步机制与互斥-生产者消费者问题

进程同步机制与互斥-生产者消费者问题

学习中心:专业:年级:年春/秋季学号:学生:题目:进程同步与互斥生产者-消费者问题1.谈谈你对本课程学习过程中的心得体会与建议?转眼间,学习了一个学期的计算机操作系统课程即将结束。

在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。

在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程1.1设计思路在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。

其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。

本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。

本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。

而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。

1.2程序流程图1.3基本内容在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。

其中主体部分为一个主函数main (),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运主函数初始化缓冲区,消费请求队列及部分同步对象提取线程信息完成线程相关同步对象的初始化等待所有线程结束创建线程模拟生产和消费程序结束消费者有消费请求?此请求可满足?确定产品位置此产品正被消费?进入临界区(对同一产品进行请求的消费者之间互斥)消费产品、并判断是否应该释放产品所占缓冲区 结束消费进程生产者存在空缓冲区?另一生产者正在生产?进入临界区 (所有生产者之间互斥)从空缓冲区中为本生产者的产品分配一个空间退出临界区在该缓冲区放入产品通过信号量通知等待本产品的消费者结束生产进程退出临界区 YYYNNNNYYN行结束后退出程序;生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。

经典进程同步问题

经典进程同步问题
19
一、利用记录型信号量
解决哲学家进餐问题
假设每一位哲学家拿筷子的方法都是:先 拿起左边的筷子,再拿起右边的筷子,则第i 位哲学家的活动可描述为:
20
第i位哲学家的活动可描述为: repeat wait(chopstick[i]); wait(chopstick[i+1] mod 5); …. eat; …. signal(chopstick[i]); signal(chopstick[i+1] mod 5); …. think; until false;
full:=full - 1; if full <0 then block; mutex:=mutex-1; if mutex<0 then block; mutex:=mutex+1; if mutex<=0 then wakeup; empty:=empty+1; if empty<=0 then wakeup;
9
Wait操作不能颠倒!! P:wait(empty) wait(mutex)
C:wait(full) wait(mutex)
如果颠倒 P:wait(mutex) mutexl.value=0 wait(empty) 如果此时缓冲池满empty=-1,P阻塞 C:wait(mutex) mutex.value=-1, C阻塞 wait(full) P阻塞在empty队列中,等待一个空缓冲 C阻塞在mutex队列中,等待公共缓冲池访问权
6
consumer://消费者进程 begin repeat wait(full); wait(mutex); nextc:=buffer[out]; out∶=(out+1) mod n; signal(mutex); signal(empty); 消费这件产品; until false; end

用多线程同步方法解决生产者-消费者问题

用多线程同步方法解决生产者-消费者问题

目录1.需求分析 (2)1.1 课程设计题目 (2)1.2 课程设计任务 (2)1.3 课程设计原理 (2)1.4 课程设计要求 (2)1.5 实验环境 (2)2. 概要设计 (3)2.1 课程设计方案概述 (3)2.2 课程设计流程图 (3)3.详细设计 (4)3.1 主程序模块 (4)3.2 生产者程序模块 (5)3.3 消费者程序模块 (6)4.调试中遇到的问题及解决方案 (6)5.运行结果 (7)6.实验小结 (7)参考文献 (8)附录:源程序清单 (8)1.需求分析1.1 课程设计题目用多线程同步方法解决生产者-消费者问题1.2 课程设计任务(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。

(2)生产者和消费者各有两个以上。

(3)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。

1.3 课程设计原理生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题,它反映了操作系统中典型的同步例子,生产者进程(进程由多个线程组成)生产信息,消费者进程使用信息,由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。

为此,需要引入由一个或者若干个存储单元组成的临时存储区(即缓冲区),以便存放生产者所产生的信息,解决平滑进程间由于速度不确定所带来的问题。

1.4 课程设计要求(1)有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。

(2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。

(3)生产者和消费者各有两个以上。

(4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。

1.5 实验环境系统平台:LINUX开发语言:C开发工具:PC机一台2. 概要设计2.1 课程设计方案概述本设计中设置一个长度为20的一维数组buff[20]作为有界缓冲区,缓冲区为0时,代表该缓冲区内没有产品,buff[i]=i+1表示有产品,产品为i+1。

进程同步问题分析——生产者和消费者问题

进程同步问题分析——生产者和消费者问题

一、讨论课名称:计算机操作系统中进程同步与互斥问题分析二、讨论课目的:1.熟悉临界资源、信号量及PV操作的定义与物理意义;2.掌握进程互斥与进程同步的相关知识;3.掌握用信号量机制解决进程之间的同步与互斥问题;4.实现生产者-消费者问题,深刻理解进程同步问题。

三、讨论课内容:1.进程同步的基本概念在多道程序环境下,系统中可能存在许多的进程,在这些进程之间必定存在一些制约关系,这种制约关系表现为以下两种形式:①资源共享关系。

进程之间不知道其他进程的存在,而这些进程又处在同一个系统中,对系统资源必须共享使用,而有些资源不允许进程同时访问,例如打印机。

系统只能保证进程间互斥地使用这种临界资源,称这种资源共享关系叫做互斥;②相互合作关系。

在某些进程间还存在一种相互合作的关系。

例如在某个系统中存在两个进程,输入进程A和计算进程B,A负责向B提供数据,当缓冲区空时,B进程因不能获得所需数据而等待。

当A把数据送入缓冲区后,并向B发送一个信号将B唤醒,B才能取走数据。

同样,当B没有提取数据,也就是说缓冲区满时,进程A也无法向其中投入数据而等待。

这就是一种相互合作关系,称之为进程间的同步关系。

2.信号量机制实现进程同步本文分析的生产者-消费者问题就是一种相互合作问题的代表,对进程同步问题的解决,早在1965年,荷兰科学家Dijkstra就提出信号量机制是一种卓有成效的进程同步工具。

在信号量机制中,信号量仅能通过两个标准的原子操作wait(s)和singnal(s)来访问。

这两个操作被称为P,V操作。

在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接上述的所有等待进程。

记录型信号量是由于它采用了记录型的数据结构而得名的。

它所包含的上述两个数据项可描述为:type semaphore=recordvalue:integer;L:list of process;End相应地,wait(s)和singal(s)操作可描述为:Procedure wait(s)var s:semaphore;BeginS.value:=S.value-1;If S.value<0 then block(S,L)EndProcedure signal(s)var S:semaphore;BeginS.value:=S.value+1;If S.value<=0 then wakeup(S,L);End每次的wait操作,意味着进程请求一个单位的资源,因此描述为S.value:=S.value-1;当S.value<0时,表示资源已分配完毕,因而进程调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。

进程的同步与互斥之生产者消费者问题:对信号量设置的理解及PV操作顺序分析

进程的同步与互斥之生产者消费者问题:对信号量设置的理解及PV操作顺序分析

进程的同步与互斥之⽣产者消费者问题:对信号量设置的理解及PV操作顺序分析问题描述系统中有⼀组⽣产者进程和⼀组消费者进程,⽣产者进程每次⽣产⼀个产品放⼊缓冲区,消费者进程每次从缓冲区取出⼀个产品并使⽤;缓冲区在同⼀时刻只能允许⼀个进程访问。

问题分析⽣产者、消费者共享⼀个初始为空、⼤⼩为n的缓冲区,我们把缓冲区中未存放数据的⼀个块,当作⼀个“空位”;把其中按块存放的数据当作“产品”。

同步关系:⽣产者与消费者只有缓冲区有空位时,⽣产者才能把产品放⼊缓冲区⽣产者把“空位”当作资源,缓冲区初始为空,即空位数量为n(n:空的缓冲区⼤⼩)所以可以设置信号量empty,初始nempty>0时,有空位,⽣产者可以消耗“空位”这种资源即P(empty);empty<=0时,⽣产者⽆“空位”资源可⽤,便会挂起到阻塞队列等待。

只有缓冲区有产品时,消费者才能从缓冲区中取出产品消费者把“产品”当作资源,缓冲区初始为空,即产品数量为0所以可以设置信号量full,初始为0full<=0,消费者⽆“产品”这种资源可⽤,便会挂起到阻塞队列full>0,有产品,消费者可以消耗“产品”这种资源即P(full)进⼀步:empty>0时,有空位,⽣产者可以消耗“空位”这种资源即P(empty)的同时:⽣产了“产品这种资源”,即V(full);full>0时,有产品,消费者可以消耗“产品”这种资源即P(full)的同时:⽣产了“空位”这种资源,即V(empty);互斥关系:所有进程之间缓冲区是临界资源,各个进程必须互斥地访问设置信号零mutex,初始为1在进⼊区P(mutex)申请资源在退出区V(mutex)释放资源设计typedef struct{int value;Struct process *L; //等待序列}semaphore;semaphore full;semaphore empty;semaphore mutex;//某进程需要使⽤资源时,通过wait原语申请:P操作void wait(semaphore S){S.value--;if(S.value < 0){block(S.L);//阻塞原语,将当前进程挂载到当前semaphore的阻塞队列}}//进程使⽤完资源后,通过signal原语释放:V操作void signal(semaphore S){S.value++;if(S.value <= 0){wakeup(S.L);//唤醒原语,将当前semaphore的阻塞队列中的第⼀个进程唤醒}}full.value=0; //缓冲区 “产品”资源数(初始为0),⽤于实现⽣产者与消费者进程的同步empty.value=n; //缓冲区 “空位”资源数(初始为n),⽤于实现⽣产者与消费者进程的同步mutex.value=1; //互斥信号量,⽤于实现所有进程之间互斥地访问缓冲区//⽣产者producer(){while(1){Produce(); //⽣产“产品”P(empty); //“空位”数-1P(mutex); //临界区上锁Storage(); //摆放产品V(mutex); //临界区解锁V(full); //“产品”数+1}}//消费者consumer(){while(1){P(full); //“产品”数-1P(mutex); //临界区上锁TakeOut(); //拿⾛产品V(mutex); //临界区解锁V(empty); //“空位”数+1Use(); //使⽤“产品”}}对于各个操作顺序的理解:1. 对于⼀部分操作的顺序,我们很好理解,符合我们的认知://⽣产者Produce(); //⽣产产品P(empty); //“空位”数-1,可能有⼈在这⾥会问这个操作为什么不可以放在“Storage甚⾄是V(full)”后⾯,考虑⼀种情况:当空位数为0时,我们是不能摆放产品的,⽽这个操作正是在检查是否还有“空位”这种资源;所以它⼀定在Storage前⾯ Storage(); //摆放产品V(full); //“产品”数+1,可能有⼈在这⾥会问这个操作为什么不可以放在“Storage甚⾄是P(empty)”前⾯,考虑⼀种情况:当产品数为n时,我们是不能再摆放产品的,因为缓冲区已满,再向其中添加数据(执⾏Storage)是要出问题的;所 //消费者P(full); //“产品”数-1,同上⾯⼀样,可能有⼈在这⾥会问这个操作为什么不可以放在“TakeOut甚⾄是V(empty)”后⾯,考虑⼀种情况:当产品数为0时,我们是不能拿⾛产品的,⽽这个操作正是在检查是否还有“产品”这种资源;所以它⼀定 TakeOut(); //拿⾛产品V(empty); //“空位”数+1,同上⾯⼀样,可能有⼈在这⾥会问这个操作为什么不可以放在“TakeOut甚⾄是P(full)”前⾯,考虑⼀种情况:当空位数为n时,我们是不能拿⾛产品的,因为缓冲区已经空了,再拿⾛(执⾏TakeOut)拿⾛个寂寞 Use(); //使⽤“产品”2. 对于其他操作:实现同步的P操作⼀定要在实现互斥的P操作之前,为什么呢?反向分析:我们考虑若调换⽣产者上述两个P操作的顺序://⽣产者producer(){while(1){Produce(); //⽣产产品P(mutex); //临界区上锁P(empty); //“空位”数-1Storage(); //摆放产品V(mutex); //临界区解锁V(full); //“产品”数+1}}//消费者consumer(){while(1){P(full); //“产品”数-1P(mutex); //临界区上锁TakeOut(); //拿⾛产品V(mutex); //临界区解锁V(empty); //“空位”数+1Use(); //使⽤“产品”}}若此时缓冲区已经放满产品,则empty=0,full=n⽣产者进程执⾏P(mutex),mutex变为0,由于empty为0即没有“空位”了,需要⽣产者进程阻塞,等待消费者拿⾛产品切换⾄消费者进程,消费者进程执⾏到P(mutex),由于mutex为0即⽣产者未释放临界资源,需要⽣产者释放临界资源,消费者进程阻塞互相等待,进⼊死锁结论:不要让因同步引起的进程阻塞(P操作可能产⽣结果)发⽣在为临界区上锁之后,因为:1. 临界区上锁,表⽰临界资源已被占⽤;若对临界区未解锁之前,发⽣了因同步引起的进程阻塞(上例中即需要⽣产者进程阻塞,等待消费者拿⾛产品)。

多进程同步方法演示“生产者-消费者”问题

多进程同步方法演示“生产者-消费者”问题

青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:__班级:_______学号:题目:用多进程同步方法演示“生产者-消费者”问题起迄日期:设计地点:指导教师:年度第学期完成日期: 年月日一、课程设计目的本次进行操作系统课程设计的主要任务是设计一个模拟生产者消费者工作的系统。

这个问题中有一种生产者和一种消费者,生产者和消费者对同一个缓冲区进行操作,互斥的访问缓冲区。

本次课程设计的目的就是加深对多进程如何正确访问资源的认识,同时掌握信号量在互斥访问时应该如何正确有效地使用。

掌握生产者消费者问题的解决流程和方法,提高编程能力、解决问题的能力和查阅文档的能力。

二、课程设计内容与要求1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。

2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。

3、设计要求:1)生产者与消费者均有二个以上2)生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者3)生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效4)生产者生产的产品由随机函数决定5)多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码6)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符7)采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态三、系统分析与设计1、系统分析系统分析1.此次课程设计的任务是生产者消费者问题的模拟演示,需要处理的数据有:生产者进程数目,消费者进程数目,生产者生产速度,消费者消费速度,缓冲区中产品的个数,以及生产、消费产品的指针。

2.程序中需要缓冲区中的信息可以动态演示,生产者、消费者的个数以及生产、消费时的速度可以随时调节,同时为了使程序更加友好,应该具有开始、暂停、停止等相关可操作按钮。

生产者与消费者之间的同步与互斥问题

生产者与消费者之间的同步与互斥问题

•进程间的关系 •生产者生产消息 后 消费者消费的合作 关系 •消费者消费 后 的空白缓冲块由生产者 生产消息的合作关系 •进程间在队列操作上的互斥关系
Var mutex, empty, full:semaphore∶=1,n,0; buffer:array[0, …, n-1] of item; in, out: integer∶=0, 0; proceducer:begin repeat producer an item nextp; wait(empty); wait(mutex); buffer(in)∶=nextp; in∶=(in+1) mod n; signal(mutex); signal(full); until false; end • consumer:begin • repeat • wait(full); • wait(mutex); • nextc∶ =buffer(out); • out∶ =(out+1) mod n; • signal(mutex); • signal(empty); • consumer the item in nextc; • until false; • end
互斥问题:
1.生产者与生产者之间、消费者与消费者之间 互斥访问缓冲池。 2.生产者和消费者之间互斥访问缓冲池。
生产者/消费者问题
• 一个生产者,一个消费者,一个缓冲区 • 确定同步对象 • 确定同步约束条件 • 确定同步时机 • 定义信号量:考虑为每个同步对象设一个 信号量 • 用wait()操作判断同步条件是否满足 • 用signal()操作向其它同步对象发同步信号
Thank you !!
姚俊 朱景焕 宋聪 郭涛 欧阳睿 朱思勇 杨凝 熊伟 唐沐 万骞 闫弈潼

生产者—消费者问题

生产者—消费者问题

第一章、概述1.1 课题背景在多道程序环境下,进程同步问题十分重要,也是一个相当有趣的问题,因而吸引了不少学者对它进行研究,并由此而产生了一系列经典的进程同步问题。

其中比较有代表性的有“生产者—消费者问题” 、“读者—写者问题” 、“哲学家进餐问题”等等。

通过对这些问题的研究和学习,可以帮助我们更好地理解进程同步概念及实现方法。

1.2生产者—消费者问题生产者—消费者问题(Producer_consumer)是一个经典的进程同步问题。

它描述的是:有一群生产者进程在生产产品,并将此产品提供给消费者进程去消费。

为使生产者进程和消费者进程能并发执行,在它们之间设置有个缓冲区的缓冲池,生产者进程可将它所生产的产品放入一个缓冲区中,消费者进程可从一个缓冲区取得一个产品消费。

尽管所有的生产者进程和消费者进程都是以异步的方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装有消息尚未被取走产品的缓冲区投放产品。

如下图所示:1.3进程同步机制在中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在它们争用临界资源的时候。

例如,当多个进程去争用一台打印机时,有可能使多个进程的输出结果交织在一起,难于区分;而当多个进程去争用共享变量,表格,链表时,有可能使数据处理出错。

进程同步的主要任务就是使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

1.4进程同步优点进程同步其优点在于能够让操作系统更加有效地对资源进行管理和调度,最大潜力地发挥处理机的性能。

让系统的执行更加畅通无阻,尽可能地让系统少出现一些由于系统资源分配不合理所带来的死锁、死机之类的事情的发生。

保持了处理机的高速运行之后从用户角度来说程序运行所花费的时间就会更短。

从而保证了处理机在相同的时间内有更大的吞吐量。

而把并发进程的同步和互斥问题一般化,就可以得到一个抽象的一般模型,即本次课程设计的任务:生产者—消费者问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3页共6页
④使用 Append()与 Take()函数进行循环。 5、实验测试及分析
结果分析: 1、在每个程序中先做 P(mutex),后做 V(mutex),二者要成对出现。夹在二者 中间的代码段就是该进程的临界区。 2、对同步信号量 full 和 empty 的 P,V 操作同样必须成对出现,但它们分别位 于不同的程序中。 3、无论在生产者进程中还是在消费者进程中,两个 P 操作的次序不能颠倒:应 先执行同 步信号量的 P 操作,然后执行互斥信号量的 P 操作。否则可能造成进程
3、实验环境: VC6++
4、实验内容: 生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲
区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的 操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲 区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数 据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲 区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。
2)程序要求 ①缓冲区采用循环队列表示,利用头、尾指针来存放、读取数据,以及判断队 列是否为空。缓冲区中数组大小为 15; ②利用函数 producer()作为生产者每次生产的数据,存放到缓冲区中; ③使用 main()函数调用实现共享主存段的创建,返回共享内存区的 ID。对于已 经申请到的共享段,进程需把它附加到自己的虚拟空间中才能对其进行读写。
目前,计算机系统中用得比较普遍的高级通信机制可分为 3 大类:共享存储器 系统、消息传递系统及管道通信系统。
• 共享存储器系统 共享存储器系统为了传送大量数据,在存储器中划出一块共享存储区,诸进程 可通过对共享存储区进行读数据或写数据以实现通信。进程在通信之前,向系统申 请共享存储区中的一个分区,并为它指定一个分区关键字。 信息的交换称为低级通 信,而把进程间大批量数据的交换称为高级通信。 目前,计算机系统中用得比较普遍的高级通信机制可分为 3 大类:共享存储器 系统、消息传递系统及管道通信系统。 • 消息传递系统 在消息传递系统中,进程间的数据交换以消息为单位,在计算机网络中被称为 报文。消息传递系统的实现方式又可以分为以下两种: (1)直接通信方式 发送进程可将消息直接发送给接收进程,即将消息挂在接收进程的消息缓冲队 列上,而接收进程可从自己的消息缓冲队列中取得消息。 (2)间接通信方式 发送进程将消息发送到指定的信箱中,而接收进程从信箱中取得消息。这种通 信方式又称信箱通信方式,被广泛地应用于计算机网络中。相应地,该消息传递系 统被称为电子邮件系统。 • 管道通信系统 向管道提供输入的发送进程,以字符流方式将大量的数据送入管道,而接收进 程从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管 道通信。 为了协调发送和接收双方的通信,管道通信机制必须提供以下 3 方面的协调功 能。
1)实验原理 在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的通 信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也 把进程间控制在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进
第1页共6页
程间的通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。 有时,也把进程间控制信息的交换称为低级通信,而把进程间大批量数据的交换称 为高级通信。
第5页共6页
实验报告
课程名称:
操作系统
实验名称: 生产者与消费者的进程同步问题
学 号:Leabharlann 学生姓名:班 级:
指导老师:
1、实验目的:
实验日期:2014 年 11 月 4 日
① 熟悉临界资源、信号量及 PV 操作的定义与物理意义 ② 了解进程通信的方法 ③ 掌握进程互斥与进程同步的相关知识 ④ 掌握用信号量机制解决进程之间的同步与互斥问题 ⑤ 实现生产者-消费者问题,深刻理解进程同步问题 2、实验要求: 本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异 步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相 互制约有两种不同的方式。 (1)间接制约。这是由于多个进程共享同一资源(如 CPU、共享输入/输出设 备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。 (2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并 发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。
第4页共6页
死锁。 6、实验心得体会
在分析程序的过程中发现了几点问题,第一个便是 C 语言与 C++混乱,C 语言 里面的语句用到了本程序中如“/n”在 C 语言中为换行符号,但在 C++中却不是; 第二个便是符号问题,在程序编写过程中应用英文标点符号。本次实验是关于生产 者与消费者之间互斥和同步的问题。问题的是指是 P、V 操作,实验设一个共享缓冲 区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待 直到前一个线程释放缓冲区为止。实验中包含的知识点很多,包括临界区资源共享 问题、信号量定义、PV 操作流程、进程间的通信方式(消息传递和共享内存)、进 程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。加深了对于本部 分内容的理解,通过本实验设计,我们对操作系统的 P、V 进一步的认识,深入的了 解 P、V 操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。
第2页共6页
(1)互斥 当一个进程正在对文件进行读或写操作时,另一个进程必须等待。 (2)同步 当写进程把一定数量的数据写入文件后,便阻塞等待,直到读进程取走数据后, 再把写进程唤醒。 (3)确认对方是否存在 只有确定对方已存在时,才能进行管道通信,否则会造成因对方不存在而无限制 地等待。在这个问题当中,我们采用信号量机制进行进程之间的通信,设置两个信 号量,空的信号量和满的信号量。使用信号量机制可以实现进程之间的同步和互斥, 允许并发进程一次对一组信号量进行相同或不同的操作。每个 P、V 操作不限于减 1 或加 1,而是可以加减任何整数。在进程终止时,系统可根据需要自动消除所有被进 程操作过的信号量的影响。
相关文档
最新文档