进程同步(生产者与消费者)

进程同步(生产者与消费者)
进程同步(生产者与消费者)

软件学院

操作系统实验报告

专业:软件工程

班级:RB软工互152

学号:201560160226

学生姓名:王泽华

指导教师:韩新超

实验二: 进程同步(生产者与消费者)

一.实验目的

1)理解进程竞争资源的现象,进而理解进程的同步于互斥;

2)掌握基本的互斥与同步算法,进一步理解“生产者—消费者”模型;

3)通过对“生产者—消费者”问题编程实现,了解进程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法;

4)进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。二.实验属性

该实验为设计性实验。

三.实验仪器设备及器材

普通PC386以上微机

四.实验理论基础

1、该实验中使用到相关的windows API 函数:

1)create Thread 建立新的线程;

2)create Mutex创建一个互斥体;

3)create Semaphore 创建一个新的信号量;

4)release Mutex释放由线程拥有的一个互斥体;

5)release Semaphore 对指定的信号量增加指定的值;

6)wait for Single Object 用来检测handle时间的信号状态;

7)wait for Multiple Objects true 即等待所有信号量有效再往下执行,false 当其中一个信号量有效时向下执行;

8)Close Handle 关闭一个内核对象。

2、数据结构用实验一中的进程就绪队列,并在此基础上进行调度,如果队

列排序与算法要求不一致则编写一个排序函数。

3、进程调度算法:选择一种进程调度算法实现。

4、主界面设计:在实验一的界面上增加一个进程调度按钮、被调进程的PCB

显示。

5、功能测试:从显示出的就绪队列状态和被调进程的PCB,查看操作的正

确与否。

五.实验步骤

(2)结果分析:

①在每个过程中先做P(mutex),后做V(mutex),二者要成对出现。夹在

二者中间的代码段就是该进程的临界区。

②对同步信号量full和empty的P,V操作同样必须成对出现,但它们

分别位于不同的程序中。

③无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠

倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。

六.实验总结

计算机操作系统中引入了进程后,极大的改善了系统资源的利用率和提高了系统的吞吐量,但是由于多道环境中同时存在多个进程,它们共享系统资源,各自按照各自的方式执行,给系统造成了混乱,所以系统必须提供一种机制管理进程,使这些并发执行的进程之间能有条不紊地运行,能有效地

共享资源和相互合作,使得程序的执行具有可再现性,这就是进程同步的主要任务。

七.附录

#include

#include

#include

using namespace std;

// 生产者消费者问题,单个生产者,多个消费者,多个缓冲池

// 使用信号量和关键段来实现

using namespace std;

int gi,gj;

const int num = 10; // 产生数据的个数

const int size = 4; // 缓冲池的大小

volatile bool flag = true; // 用于消费者线程之间

int buf[size]; // 缓冲池

CRITICAL_SECTION gc; // 关键段

HANDLE empty,full; // Semaphore

unsigned int __stdcall pro(PVOID p) // 生产者线程

{

for(int i = 0; i <= num ; i++)

{

WaitForSingleObject(empty,INFINITE); // 线程同步

EnterCriticalSection(&gc); // 线程互斥

buf[gi] = i;

cout << "生产者在" << gi << " 号缓冲池放入" << buf[gi] << endl;

gi = (gi+1)%size;

LeaveCriticalSection(&gc);

ReleaseSemaphore(full,1,NULL);

}

cout << "生产者运行结束!" << endl;

return 0;

}

unsigned int __stdcall cus(PVOID p) // 消费者线程

{

while(true)

{

WaitForSingleObject(full,INFINITE); // 线程同步

if( flag == false ) // 线程之间的逻辑判断

{

break;

}

EnterCriticalSection(&gc); // 线程互斥

cout << "线程" << GetCurrentThreadId() << " 在缓冲池" << gj << " 获取数据" << buf[gj] << endl;

if( buf[gj] == num ) // 结束条件

{

LeaveCriticalSection(&gc);

ReleaseSemaphore(full,1,NULL);

flag = false;

break;

}

gj = (gj+1)%size;

LeaveCriticalSection(&gc);

Sleep(50);

ReleaseSemaphore(empty,1,NULL);

}

cout << "消费者线程" << GetCurrentThreadId() << " 运行结束!" << endl;

return 0;

}

int main()

// 相关变量的定义

const int sz = 3;

gi = gj = 0;

InitializeCriticalSection(&gc);

empty = CreateSemaphore(NULL,4,4,NULL);

full = CreateSemaphore(NULL,0,4,NULL);

HANDLE hand[sz];

hand[0] = (HANDLE)_beginthreadex(NULL,0,pro,NULL,0,NULL); // 创建了三个线程hand[1] = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL);

hand[2] = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL);

WaitForMultipleObjects(sz,hand,true,INFINITE);

// 资源的释放

CloseHandle(full);

CloseHandle(empty);

DeleteCriticalSection(&gc);

for(int i = 0; i < sz ; i++)

{

CloseHandle(hand[i]);

}

return 0;

}

2019年进程管理习题及答案

进程管理习题答案 一.选择题 1.在进程管理中,当时进程从阻塞状态变为就绪状态. A. 进程被进程调度程序选中 B.等待某一事件 C.等待的事件发生 D.时间片用完 答:C 2.分配到必要的资源并获得处理机时的进程状态是。 A.就绪状态 B.执行状态 C.阻塞状态 D.撤消状态 答:B 3.P、V操作是。 A.两条低级进程通信原语 B.两组不同的机器指令 C.两条系统调用命令 D.两条高级进程通信原语 答:A 4.对进程的管理和控制使用。 A.指令 B.原语 C.信号量 D.信箱通信 答:B 5.进程的并发执行是指若干个进程。 A.同时执行 B.在执行的时间上是重叠的 C.在执行的时间上是不可重叠的 D.共享系统资源 答:B 6.若P、V操作的信号量S初值为2,当前值为-1,则表示有等待进程。A.0个 B.1个 C .2个 D.3个 答:B 7.进程的三个基本状态在一定条件下可以相互转化,进程由就绪状态变为运行状态的条件是①;由运行状态变为阻塞状态的条件是②。 A.时间片用完 B.等待某事件发生 C.等待的某事件己发生 D.被进程调度程序选中 答,①D ②B 8.下列的进程状态变化中,变化是不可能发生的。 A.运行一就绪 B.运行一等待 C.等待一运行 D.等待一就绪 答:C 9.一个运行的进程用完了分配给它的时间片后,它的状态变为。 A.就绪 B.等待 C.运行 D.由用户自己确定

答:A 10.用P、V操作管理临界区时,信号量的初值应定义为。 A.一1 B.0 C.1 D.任意值 答:C 11.用V操作唤醒一个等待进程时,被唤醒进程的状态变为. A.等待 B.就绪 C.运行 D.完成 答:B 12.进程间的同步是指进程间在逻辑上的相互关系。 A.联接 B.制约 C. 继续 D.调用 答:B 13.是一种只能进行P操作和V操作的特殊变量。 A.调度 B.进程 C.同步 D.信号量 答:D 14.下面对进程的描述中,错误的是。 A.进程是动态的概念 B.进程执行需要处理机 C.进程是有生命期的 D.进程是指令的集合 答:D 15.下面的叙述中正确的是。 A.操作系统的一个重要概念是进程,因此不同进程所执行的代码也一定不同。B.为了避免发生进程死锁,各进程只能逐个申请资源。 C.操作系统用PCB管理进程,用户进程可以从此PCB中读出与本身运行状况有关的信息 D.进程同步是指某些进程之间在逻辑上的相互制约关系 答:D 16.进程控制就是对系统中的进程实施有效的管理,通过使用、进程撤销、进程阻塞、进程唤醒等进程控制原语实现。 A.进程运行 B.进程管理 C.进程创建 D.进程同步 答:C 17.操作系统通过对进程进行管理。 A.JCB B.PCB C.DCT D.CHCT 答:B 18.用P、V操作可以解决互斥问题。 A.一切 B.某些 C.正确 D.错误 答:A 19.通常,用户进程被建立后,。 A.便一直存在于系统中,直到被操作人员撤消

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

学习中心: 专业: 年级:年春/秋季 学号: 学生: 题目:进程同步与互斥生产者-消费者问题 1.谈谈你对本课程学习过程中的心得体会与建议? 转眼间,学习了一个学期的计算机操作系统课程即将结束。在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程 1.1设计思路 在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。

本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。 1.2程序流程图 1.3基本内容 在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。 其中主体部分为一个主函数main(),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运 Y

行结束后退出程序; 生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。 另外三个辅助性函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区进行的一系列处理。 3)在实现本程序的消费生产模型时,具体的通过如下同步对象实现互斥: ①设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。 ②每一个生产者用一个信号量与其消费者同步,通过设置h_Semaphore[MAX_THREAD_NUM]信号量 ③数组实现,该组信号量用于相应的产品已产生。同时用一个表示空缓冲区

实验二(1)进程同步

实验二(2)进程同步 一、实验目的 1、生产者-消费者问题是很经典很具有代表性的进程同步问题,计算机中的很多同步问题都可抽象为生产者-消费者问题,通过本实验的练习,希望能加深学生对进程同步问题的认识与理解。 2、熟悉VC的使用,培养和提高学生的分析问题、解决问题的能力。 二、实验内容及其要求 1.实验内容 以生产者/消费者模型为依据,创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 2.实验要求 学习并理解生产者/消费者模型及其同步/互斥规则;设计程序,实现生产者/消费者进程(线程)的同步与互斥; 三、实验算法分析 1、实验程序的结构图(流程图); 2、数据结构及信号量定义的说明; (1) CreateThread ●功能——创建一个在调用进程的地址空间中执行的线程 ●格式 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParamiter, DWORD dwCreationFlags, Lpdword lpThread ); ●参数说明 lpThreadAttributes——指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize——定义原始堆栈大小。 lpStartAddress——指向使用LPTHRAED_START_ROUTINE类型定义的函数。 lpParamiter——定义一个给进程传递参数的指针。 dwCreationFlags——定义控制线程创建的附加标志。 lpThread——保存线程标志符(32位) (2) CreateMutex ●功能——创建一个命名或匿名的互斥量对象 ●格式 HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); bInitialOwner——指示当前线程是否马上拥有该互斥量(即马 ●参数说明 lpMutexAttributes——必须取值NULL。上加锁)。 lpName——互斥量名称。 (3) CreateSemaphore ●功能——创建一个命名或匿名的信号量对象 ●格式 HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); ●参数说明 lpSemaphoreAttributes——必须取值NULL。

进程同步与通信作业习题与答案

第三章 一.选择题(50题) 1.以下_B__操作系统中的技术是用来解决进程同步的。 A.管道 B.管程 C.通道 2.以下_B__不是操作系统的进程通信手段。 A.管道 B.原语 C.套接字 D.文件映射 3.如果有3个进程共享同一程序段,而且每次最多允许两个进程进入该程序段,则信号量的初值应设置为_B__。 4.设有4个进程共享一个资源,如果每次只允许一个进程使用该资源,则用P、V操作管理时信号量S的可能取值是_C__。 ,2,1,0,-1 ,1,0,-1,-2 C. 1,0,-1,-2,-3 ,3,2,1,0 5.下面有关进程的描述,是正确的__A__。 A.进程执行的相对速度不能由进程自己来控制 B.进程利用信号量的P、V 操作可以交换大量的信息 C.并发进程在访问共享资源时,不可能出现与时间有关的错误 、V操作不是原语操作 6.信号灯可以用来实现进程之间的_B__。 A.调度 B.同步与互斥 C.同步 D.互斥 7.对于两个并发进程都想进入临界区,设互斥信号量为S,若某时S=0,表示_B__。 A.没有进程进入临界区 B.有1个进程进入了临界区 C. 有2个进程进入了临界区 D. 有1个进程进入了临界区并且另一个进程正等待进入 8. 信箱通信是一种_B__方式 A.直接通信 B.间接通信 C.低级通信 D.信号量 9.以下关于临界区的说法,是正确的_C__。

A.对于临界区,最重要的是判断哪个进程先进入 B.若进程A已进入临界区,而进程B的优先级高于进程A,则进程B可以 打断进程A而自己进入临界区 C. 信号量的初值非负,在其上只能做PV操作 D.两个互斥进程在临界区内,对共享变量的操作是相同的 10. 并发是指_C__。 A.可平行执行的进程 B.可先后执行的进程 C.可同时执行的进程 D.不可中断的进程 11. 临界区是_C__。 A.一个缓冲区 B.一段数据区 C.一段程序 D.栈 12.进程在处理机上执行,它们的关系是_C__。 A.进程之间无关,系统是封闭的 B.进程之间相互依赖相互制约 C.进程之间可能有关,也可能无关 D.以上都不对 13. 在消息缓冲通信中,消息队列是一种__A__资源。 A.临界 B.共享 C.永久 D.可剥夺 14. 以下关于P、V操作的描述正确的是__D_。 A.机器指令 B. 系统调用 C.高级通信原语 D.低级通信原语 15.当对信号量进行V源语操作之后,_C__。 A.当S<0,进程继续执行 B.当S>0,要唤醒一个就绪进程 C. 当S<= 0,要唤醒一个阻塞进程 D. 当S<=0,要唤醒一个就绪 16.对临界区的正确论述是__D_。 A.临界区是指进程中用于实现进程互斥的那段代码 B. 临界区是指进程中用于实现进程同步的那段代码 C. 临界区是指进程中用于实现进程通信的那段代码 D. 临界区是指进程中访问临界资源的那段代码 17. __A__不是进程之间的通信方式。 A.过程调用 B.消息传递 C.共享存储器 D.信箱通信 18. 同步是指进程之间逻辑上的__A__关系。

生产者消费者问题设计与实现

操作系统课程设计任务书

目录

1.选题背景 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步;(2)在生产者和消费者之间建立一个管道。第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。因此本文只介绍同步机制实现的生产者/消费者问题。 同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。 2.设计思路 .生产者—消费者问题是一种同步问题的抽象描述。 计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。 而当某个进程释放资源时,则它就相当一个生产者 3.过程论述 首先,生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储单元,将导致执行结果不确定。这显然是不允许的。所以,必须使生产者和消费者互斥进入缓冲区。即某时刻只允许一个实体(生产者或消费者)访问缓冲区,生产者互斥消费者和其他任何生产者。 其次,生产者不能向满的缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。若缓冲区内有“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权。消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空”,则阻塞等待,否则,判断缓冲区是否正在被使用,

第3章 进程同步与通信 练习题答案

第3章进程同步与通信练习题 (一)单项选择题 1.临界区是指( )。 A.并发进程中用于实现进程互斥的程序段 B.并发进程中用于实现进程同步的程序段 C.并发进程中用户实现进程通信的程序段 D.并发进程中与共享变量有关的程序段 2.相关临界区是指( )。 A.一个独占资源 B.并发进程中与共享变量有关的程序段 c.一个共享资源 D.并发进程中涉及相同变量的那些程序段 3.管理若干进程共享某一资源的相关临界区应满足三个要求,其中( )不考虑。 A一个进程可以抢占己分配给另一进程的资源 B.任何进程不应该无限地逗留在它的临界区中c.一次最多让一个进程在临界区执行 D.不能强迫一个进程无限地等待进入它的临界区4、( )是只能由P和v操作所改变的整型变量。 A共享变量 B.锁 c整型信号量 D.记录型信号量 5.对于整型信号量,在执行一次P操作时,信号量的值应( )。 A.不变 B.加1 C减1 D.减指定数值 6.在执行v操作时,当信号量的值( )时,应释放一个等待该信号量的进程。 A>0 B.<0 c.>=0 D.<=0 7.Pv操作必须在屏蔽中断下执行,这种不可变中断的过程称为( )。 A初始化程序 B.原语 c.子程序 D控制模块 8.进程间的互斥与同步分别表示了各进程间的( )。 A.竞争与协作 B.相互独立与相互制约 c.不同状态 D.动态性与并发性 9并发进程在访问共享资源时的基本关系为( )。 A.相互独立与有交往的 B.互斥与同步 c并行执行与资源共享 D信息传递与信息缓冲 10.在进程通信中,( )常用信件交换信息。 A.低级通信 B.高级通信 c.消息通信 D.管道通信 11.在间接通信时,用send(N,M)原语发送信件,其中N表示( )。 A.发送信件的进程名 B.接收信件的进程名 C信箱名 D.信件内容 12.下列对线程的描述中,( )是错误的。 A不同的线程可执行相同的程序 B.线程是资源分配单位 c.线程是调度和执行单位 D.同一 进程中的线程可共享该进程的主存空间 13.实现进程互斥时,用( )对应,对同一个信号量调用Pv操作实现互斥。 A.一个信号量与一个临界区 B.一个信号量与—个相关临界区 c.一个信号量与一组相关临界 区 D一个信号量与一个消息 14.实现进程同步时,每一个消息与一个信号量对应,进程( )可把不同的消息发送出去。 A.在同一信号量上调用P操作 B在不同信号量上调用P操作 c.在同一信号量上调用v操作D.在不同信号量上调用v操作 (二)填空题 1.目前使用的计算机的基本特点是处理器______执行指令。 2.进程的______是指进程在顺序处理器上的执行是按顺序进行的。 3.当一个进程独占处理器顺序执行时,具有______和______两个特性。 4.进程的封闭性是指进程的执行结果只取决于______,不受外界影响。 5 进程的可再现性是指当进程再次重复执行时,必定获得______的结果。 6.一个进程的工作在没有全部完成之前,另一个进程就可以开始工作,则称这些进程为______.

实验1:生产者消费者问题

福建农林大学金山学院实验报告 系(教研室):专业:计算机科学与技术年级: 实验课程:生产者与消费者实验姓名:学号: 实验室号:1#608 计算机号:实验时间:指导教师签字:成绩: 实验1:生产者消费者问题 一、实验目的 生产者消费者问题是操作系统中经典的同步和互斥问题。通过实验,要求学生掌握两者之间的同步信号量和互斥信号量的使用,更深刻了解临界资源、同步和互斥的概念。 二、实验要求 1.一组生产者通过一个具有N个缓冲区的缓冲池循环不断地向一组消费者提供产 品。 2.建一个队列, 队列的长度由n记录, 定义两个指针, 分别指向队列的头和尾消 费者从头指针读取数据,每读取一个数据把n--,生产者把数据写入尾指针, 每写入一个数据就n++,当n=N的时候生产者暂停写入数据。 3.注意:缓冲池队列,用互斥锁保护。 三、实验内容和原理 1.分别画出生产者和消费者的流程图

2.针对生产者和消费者问题,可以分为哪几种情况,使用了哪些原语?分别代表 什么意思?过程如何?阐述哪些进程之间存在同步,哪些进程之间存在互斥。 3.缓冲区是否为临界资源?是否可以循环使用?通过什么来实现?举例说明(可 画图) 四、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、。 五、算法描述及实验步骤 #include <> #include const unsigned short SIZE_OF_BUFFER = 10; unsigned short ProductID = 0; unsigned short ConsumeID = 0;

unsigned short in = 0; unsigned short out = 0; int g_buffer[SIZE_OF_BUFFER]; bool g_continue = true; HANDLE g_hMutex; HANDLE g_hFullSemaphore; HANDLE g_hEmptySemaphore; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int main() { g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); const unsigned short PRODUCERS_COUNT = 3; const unsigned short CONSUMERS_COUNT = 1; const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; DWORD producerID[CONSUMERS_COUNT]; DWORD consumerID[THREADS_COUNT]; for (int i=0;i

操作系统实验报告生产者消费者问题

操作系统课程设计 一.实验目标 完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。 其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。 其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。 其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。 其他编号生产者线程生产的产品可由任意的消费者线程消费。 每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经

没有可供消费的产品,则也退出运行。 二.实验原理 2.1原理 生产者与消费者线程采用posix互斥锁机制进行互斥进入各自的代码段,只有采用互斥锁临界区代码段才可以不被打扰的执行;同步机制采用的是posix条件变量pthread_cond_wait和pthraed_cond_signal进行同步的。 线程间的通信采用的是共享内存机制。(注:所有的共享内存块是在进程里建立的,线程只需链接上各自的共享内存块即可,每一块共享内存的大小是100). 在这里共享内存设置成一个100的数组。 具体实施:(1)为1.3.5.7.9建立一个共享内存1号,1.3.5.7.9生产者线程生产的产品都放入这块共享内存缓冲区,所有奇数的消费者线程要消费的话,只需在消费者线程中链接上这块共享内存,就可以直接消费1.3.5.7.9生产者线程生产的产品。 (2)为2.4.6.8.10建立一块共享内存2号。2.4.6.8.10生产的产品都放入2号共享内存缓冲区,所有的偶数的消费者线程只要链接上2号缓冲区,就可以消费2.4.6.8.10生产的产品。当偶数消费者线程消费产品后,产品即可从缓冲区撤销,方法是在消费线程里将消费的产品在共享内存数组里置0。 (3)为11--20的每一对生产者消费者线程建立一块共享内存,编号11--20. 11--20号的消费者线程能链接各自的共享内存缓冲区或奇数或偶数共享内存缓冲区,即11--20号的生产者生产的产品只能被对应的消费者消费而11-20的奇数消费者可以消费缓冲区1的产品,偶数消费者可消费缓冲区2的产品。 (4)为21--30号的生产者消费者线程只建立一块共享内存21号,21--30号生产者生产的产品都放入21号缓冲区,所有的消费者线程只要链接上21号共享内存,就可以消费21--30号生产者生产的产品。 用于控制线程是否结束的方法是:设置一个全局变量t,在生产者线程里进行t++,在生产者线程里当t达到10时(注:为了很好的测试程序,本应该在生产者生产30个产品时菜结束线程,这里设置成了10),就break跳出while()循环,这样线程自然就终止。同样在消费者线程里,当t达到10时,这里不用t++,就跳出while()循环,消费者线程自然就终止。这样设计满足了,当生产者生产30个产品时就终止生产者线程,生产者线程终止消费者线程也得终止的要求。 生产者从文件so.txt读取数据进行生产,这个文件里的数据是一连串的字符从a--z的组合,没有空格或其他字符。文件内容的格式没有特殊要求。

李建伟版实用操作系统第二版最新习题 3 进程同步与通信

李建伟版实用操作系统第二版最新习题 3 进程同步与通信 一、选择题 题号1 2 3 4 5 6 7 8 9 10 答案A D D C B C A B A A 题号11 12 答案D C 二、综合题 1、答:临界资源也称独占资源、互斥资源,它是指某段时间内只充许一个进程使用的资源。比如打印机等硬件资源,以及只能互斥使用的变量、表格、队列等软件资源。各个进程中访问临界资源的、必须互斥执行的程序代码段称为临界区,各进程中访问同一临界资源的程序代码段必须互斥执行。 为防止两个进程同时进入临界区,可采用软件解决方法或同步机构来协调它们。但是,不论是软件算法还是同步机构都应遵循下述准则: ①空闲让进。②忙则等待。③有限等待。④让权等待。 2、答:忙等待意味着一个进程正在等待满足一个没有闲置处理器的严格循环的条件。因为只有一个CPU 为多个进程服务,因此这种等待浪费了CPU 的时钟。 其他类型的等待:与忙等待需要占用处理器不同,另外一种等待则允许放弃处理器。如进程阻塞自己并且等待在合适的时间被唤醒。忙等可以采用更为有效的办法来避免。例如:执行请求(类似于中断)机制以及PV 信号量机制,均可避免“忙等待”现象的发生。 3、答: 在生产者—消费者问题中,Producer 进程中P(empty)和P(mutex)互换先后次序。先 执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer 阻塞在信号量empty 上,而此时mutex 已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer 进程执行P(full)成功,但其执行P(mutex)时由于Producer 正在访问缓冲区,所以不成功,阻塞在信号量mutex 上。生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。 在生产者和消费者进程中,V 操作的次序无关紧要,不会出现死锁现象。 4、答:

操作系统生产者和消费者问题

生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。该问题最早由Dijkstra 提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。 要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。需要使用如下信号量: ?一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表; ?一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号; ?一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号; 看代码吧:

sem_t full_sem;/*同步信号量,当没产品时阻止消费者消费*/ pthread_mutex_t mutex;/*互斥信号量,一次只有一个线程访问缓冲*/ /* *output the buffer */ void print() { int i; for(i = 0; i < M; i++) printf("%d ", buff[i]); printf("\n"); } /* *producer */ void*producer() { for(;;) { sleep(1); P(empty_sem); pthread_mutex_lock(&mutex); in = in % M; printf("(+)produce a product. buffer:");

第三章 进程同步问题习题答案

进程同步练习 1.有一阅览室,共有100个座位。读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名。读者离开时要消掉登记内容。试用P、V操作描述读者进程的同步结构。 var mutex : semaphere;信号量,用于互斥 full : semaphere; 信号量,用于同步 table : array 0..n-1 of item; 登记表 procedure reader; 读者进程 begin P(full); P(mutex); ; Register_name(table); V(mutex); Reading; P(mutex); Delet_name(table); V(mutex); V(full) end;

begin … seminitsal,1; ,100); 初始化 cobegin reader; reader; ... coend end. 2.设公共汽车上有一位司机和一位售票员,它们的活动如下: 售票员: 动车辆售票 正常行车开车门 到站停车关车门 请分析司机与售票员之间的同步关系,如何用PV

操作实现。 答:为了安全起见,显然要求:关车门后才能启动车辆;到站停车后才能开车门。所以司机和售票员在到站、开门、关门、启动车辆这几个活动之间存在着同步关系。用两个信号量S1、S2分别表示可以开车和可以开门,S1的初值为1,S2的初值为0。用PV操作实现司机进程和售票员进程同步的算法描述如下: 售票员: (S1)售票 动车辆P(S2) 正常行车开车门 : 到站停车关车门 V(S2)V(S1) 另外,程序中PV操作出现的顺序与信号量的初值设置有关,以本题为例,算法如下描述时,S1、S2的

生产者消费者问题设计与实现

操作系统课程设计任务书 学院计算机与信息工程专业计算机科学与技术课程名称操作系统题目生产者消费者问题设计 与实现 完成期限自2015年6月23日至2015年6月29日共1周 内容及任务一、项目的目的 1.理生产者消费者问题基本概念和工作原理,以及实现技术; 2.理解并掌握生产者消费者问题相关算法,以及它的实现方法; 3.掌握在eclipse环境下,系统开发的基本步骤和方法; 4.掌握在eclipse环境下,设计和开发一个简单的生产者消费者问题系统来模拟操作系统中生产者消费者问题。 二、项目任务的主要内容和要求 1.精读并理解和掌握生产者消费者问题; 2.编写程序来模拟生产者消费者问题的实现; 3.编写应用程序测试生产者消费者问题,并显示结果。 三、项目设计(研究)思路 本课程设计的基本思路是,首先理解和掌握生产者消费者问题的基本思想和原理,然后根据理解的基本思想和原理编程实现生产者消费者问题,最后通过数据分析生产者消费者问题。 四、具体成果形式和要求 成果:生产者消费者问题程序语言实现;设计说明书。 要求:编写好的生产者消费者问题程序能够正确启动运行;设计说明书规范、合理。 进度安排 起止日期工作内容2015.6.23至2015.6.24熟悉相关内容 2015.6.25至2015.6.26 系统设计和实现 2015.6.27至2015.6.29 系统实现和撰写相关文档

主要参考资料1.《计算机操作系统》汤子瀛哲凤屏汤小丹主编西安电子科技大学出版社. 2.《计算机操作系统概论》陈宏杨忠耀主编重庆邮电大学出版社. 3.《计算机操作系统基本知识》廖成崔阳主编电子工业出版社. 4.《操作系统实现与设计》陆刚望能主编电子工业出版社. 5.《java程序语言设计》丁振凡主编,薛清华副主编清华大学出版社. 指导教师 意见 (签字):年月日 系(教研室) 主任意见 (签字):年月日

操作系统练习 同步问题 有答案

操作系统练习题: 1 在南开大学和天津大学之间有一条弯曲的小路,其中从S到T一段路每次只允许一辆自行车通过,但中间有一个小的“安全岛”M(同时允许两辆自行车停留),可供两辆自行车已从两端进小路情况下错车使用,如图所示。试设计一个算法使来往的自行车均可顺利通过。 解答: 首先中间的安全岛M仅允许两辆自行车通过,应作为临界资源设置信号量。但仔细分析发现,在任何时刻进入小路的自行车最多不会超过两辆(南开和天大方向各一辆),因此不需为安全岛M设置信号量。在路口S处,南开出发的若干辆自行车应进行路口资源的争夺,以决定谁先进入小路SK段,为此设置信号量S,用以控制路口资源的争夺;同理,设置信号量T,控制天大方向自行车对路口T的争夺。又小路SK段仅允许一辆车通过,设置信号量SK初值为1,同理设置小路LT段信号量LT初值为1。 程序如下: S := l; T:=1; SK :=1; LT:=1; Parbegin 进程P:(南开方向自行车) begin P(S) ; {与其它同方向的自行车争夺路口S} P(SK); {同对面自行车争夺路段SK} 通过SK; 进入M; ** V (SK);{一旦进入M,便可释放路段SK} P (LT) ; {同对面的自行车争夺路段LT} 通过LT; V (LT);{将路段LT释放} V(S); {将路口S释放给同方向的正在路口S处等待的自行车}

end, 进程Q:(天大方向自行车) begin P(T); P(LT); 通过LT; 进入M; V(LT); P(SK); 通过SK; V(SK); V(T); End; Parend。 说明**: P进程进入安全岛M后,释放了路段SK,但没有释放路口S,原因在于它是向对面的4进程释放路段资源SK,而在P进程离开小路LT后,才会将路口S释放给其他P进程,如不这样,就会死锁。请考虑如下情况:两个方向各有一辆车前进,若在P进程到达安全岛M后,执行V (S)及V (SK)操作,则有可能使得同方向的其它P进程得到路段SK的使用权,而进入小路;同理,Q进程到达安全岛后执行V (LT)及V (T)操作,有可能使得同方向的其它Q进程得到路段LT而进入小路。此时共有四辆车在整个路径中,最终出现死锁状态。 2某寺庙,有小、老和尚若干,有一水缸,由小和尚提水入缸(向缸中倒水)供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个捅取水。水桶总数为3个。每次人、取缸水仅为1桶,且不可同时进行。试给出有关从缸中取水和向缸中倒水的算法描述。 解答: 应首先考虑清楚本题需要几个进程。从井中取水后向缸中倒水为连续动作,可算同一进程,从缸中取水为另一进程。 再考虑信号量.有关互斥的资源有水井(一次仅一个水桶进出)和水缸(一次入、取水为一桶),分别为之设信号量mutexl , mutex2控制互斥; 另有同步问题存在:三个水桶无论从井中取水还是人出水缸都是一次一个,应为之设信号量count,抢不到水桶的进程只好等待;还有水缸满时,不可人水,设信号量empty控制入水量.水缸空时不可出水,设信号量full,控制出水量。 mutexl:=1;mutex2:=1; empty:=10; full:=0 ; count:=3;

操作系统生产者与消费者问题实验报告

《操作系统》实验报告 生产者和消费者的问题 一、实验目的 1.掌握基本的同步与互斥的算法,理解基本的生产者与消费者的模型。 2.学习使用Windows 2000/XP中基本的同步对象,掌握相关的API的使用方法。 3.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 二、实验的内容及其要求 1.实验内容 以生产者/消费者模型为根据,在Windows 2000环境下创建一个控制台进程,在改进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 2.实验要求 ①学习并理解生产者/消费者模型及其同步/互斥规则 ②学习了解Windows同步对象及其特性 ③熟悉实验环境,掌握相关API的使用方法 ④设计程序,实现生产者/消费者进程(线程)的同步与互斥 ⑤提交实验报告 三、实验的时间安排 1.实验前,先到图书馆或上网百度了解有关生产者/消费者模型的相关知识,建立生产者/消费者模型的基本概念。 2.利用13周、15周、17周的上机时间编写和调试程序代码。 3.利用其他课余时间来分析实验的最终结果并完成相关的实验报告。 四、实验的环境 1.硬件条件:普通计算机一台 2.软件条件:①操作系统:Windows 2000/XP ②开发语言:VC++ 本实验是在Windows 2000+VC6.0环境下实现的,利用Windows SDK提供的系统接口(API)完成程序的功能。实验在Windows下安装VC后进行,因为VC是一个集成开发环境,其中包含了Windows SDK所有工具和定义,所以安装了VC后就不用特意安装SDK了。实验中所用的API(应用程序接口),是操作系统提供的用来进行应用程序设计的系统功能接口。要使用这些API,需要包含对这些函数进行说明的SDK 头文件,最常见的就是windows.h。一些特殊的API调用还需要包含其他的头文件。 五、正文 1.程序结构图:

[操作系统]经典进程同步问题题库

1、测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则从该缓冲区中取出数据并进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。 Var Sempty,Sfull: semaphore:= 1,0 Begin Parbegin Collection:begin repeat 采集一个数据; wait(Sempty); 数据放入缓冲区; signal(Sfull); untill false; end; Compute:begin repeat wait(Sfull); 从缓冲区取出数据; signal(Sempty); 计算; ` until false; end; Parend End 2、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。 var mutex, readcount :semaphore := 1,100; Begin Parbegin Process Reader:begin repeat wait(readcount); wait(mutex); <填入座号和姓名完成登记>; signal(mutex); <阅读> wait(mutex) <删除登记表中的相关表项,完成注销> signal(mutex); signal(readcount); until false; end; parend; End; 1)、桌上有一空盘,只允许放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子;女儿专吃盘中的苹果,儿子专吃盘中的桔子;试用wait 和signal原语实现爸爸、妈妈、女儿、儿子之间的同步问题。 var Sempty, Sapple, Sorange,: semaphore:= 1,0,0; begin parbegin Father: begin repeat wait(Sempty); ; signal(Sapple); until false; end; Mother: begin repeat wait(Sempty); ; signal(Sorange); until false; end; Son: begin repeat wait(Sorange); ; signal(Sempty); until false; end; Daughter: begin repeat wait(Sapple); ; signal(Sempty); until false; end; parend; end; 1、在4×100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑,他跑完100米后交给运动员4,运动员4接到棒后跑完全程。请试用信号量机制对其上过程进行分析。 var s1,s2,s3:semaphpre:=0,0,0; begin parbegin Athlete1: begin Run 100m; signal(s1); end; Athlete2: begin wait(s1); Run 100m; signal(s2); end; Athlete3: begin wait(s2); Run 100m; signal(s3); end; Athlete4: begin wait(s3); Run 100m; end; parend; end 2、在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门;当售票员关好车门后驾驶员才能开车行驶。试用wait和signal操作实现司机和售票员的同步。

生产者与消费者问题(附源码)

操作系统实验报告 专业网络工程班级08102 学号姓名 课程名称操作系统学年2010-2011 学期下 课程类别专业必修■限选□任选□实践□实验时间2010年11月3日 实验名称 实验一:生产者与消费者问题 实验目的和要求 全面理解生产者与消费者问题模型,掌握解决该问题的算法思想,正确使用同步机制。 实验软硬件要求 Pentium ||| 450以上CPU 64MB以上内存 WINDOWS XP Visual C++6.0 实验内容、方法和步骤(可附页) 问题描述:一组生产者向一组消费者提供商品,共享一个有界缓冲池,生产者向其中放入商品,消费者从中取得商品。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将商品送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一商品。 功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放商品、取商品等过程。 具体参数:3个生产者进程,2个消费者进程; 缓冲区单元个数N=4; 在本程序中是缓冲区中的数从0变为1表示模拟生产一个产品,消费时则将对应缓冲区内的1变为0,为模拟消费一个产品。 实验结果(可附页) 见截图 小结 这次多线程的操作系统实验,使我对线程的概念以及多线程程序中线程间的运行有了更深的认识,同时也让我的编程能力得到了一定的提高。 这次做的用多线程实现生产者与消费者模型的实验,由于我的编程能力基础比较差,对线程也是一无所知,所以一开始觉得无从下手,但幸好老师给了充足的时间,我通过看网上找的视频资料以及请教同学才渐渐地有了一点概念,然后我试着从网上下了一些多线程的程序分析里面的语句,基本弄懂了多线程的原理。 评定成绩:批阅教师:年月日

操作系统课程设计用多进程同步方法解决生产者-消费者问题

操作系统课程设计 用多进程同步方法解决生产者-消费者问题 系别:计科系 专业: 计算机科学与技术 班级:04 级 4 班 学号:0410******* 姓名:苏德洪 时间:2006-7-7—2006-7-14

目录 一、题目: (3) 二、设计目的: (3) 三、总体设计思想概述: (3) 四、说明: (3) 五、设计要求: (3) 六、设计方案: (3) 七、流程图: (5) 八、运行结果 (7) 九、源程序 (11) 十、总结 (18) 十一、参考文献 (20)

一、题目: 用多进程同步方法解决生产者-消费者问题。 二、设计目的: 通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。 三、总体设计思想概述: 1、生产者—消费者问题是一种同步问题的抽象描述。 2、计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一 资源时,可以看作是消耗,且该进程称为消费者。 3、而当某个进程释放资源时,则它就相当一个生产者。 四、说明: 有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。 五、设计要求: 1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前 指针位置和生产者/消费者线程的标识符。 2、生产者和消费者各有两个以上。 3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。 六、设计方案: 通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。 应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。 为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量g_hMutex,起初值为1。

相关文档
最新文档