操作系统生产者与消费者实验

操作系统生产者与消费者实验
操作系统生产者与消费者实验

实验一生产者和消费者问题

1、实验目的要求

1)、通过编写程序,掌握基本的同步互斥算法,理解生产者和消费者模型。

2)、了解多线程并发执行机制,线程间的同步和互斥。

3)、学习使用同步对象,掌握相应的API。

2、实验主要内容

编写基础的生产者消费者程序,程序反映了生产者和消费者的工作过程,其中缓冲区只存放一类产品,生产者消费者只对一类产品进行操作。

1)创建生产者和消费者线程

2)生产和消费规则

a)系统中有多个生产者,生产者每次只生产一种产品;

b)系统中有多个消费者,消费者每次可以消费一个产品。

c)生产者与消费者共享一个具有n个缓冲区的缓冲池。

d)生产者与消费者互斥使用缓冲池,即某一时刻只允许一个生产者或消费者使用缓冲

池。

e)不允许消费者进程到一个空缓冲池去取产品;也不允许生产者进程向一个已装满产品

且尚未被取走的缓冲池中投放产品。

f)缓冲池不要求是循环环形缓冲区,也不要求一定是顺序访问,生产者可以将产品投放

入任意的空缓冲区。

3、实验仪器设备

PC兼容机。

4、程序流程图

(1)、生产者流程图

(2)、消费者流程图

5、源代码

#include

#include

const unsigned short n = 10; unsigned short ProductID = 0; unsigned short ConsumeID = 0;

unsigned short in = 0;

unsigned short out = 0;

int buffer[n];

bool g_continue = true;

HANDLE Mutex;

HANDLE Full;

HANDLE Empty;

void Produce()

{

buffer[in] = ++ProductID;

printf("生产者生产产品%d中...\n",ProductID);

Sleep(2000);

printf("在缓冲区%d添加一个产品\n",in);

in = (in+1)%n;

}

void Consume()

{

ConsumeID = buffer[out];

printf("消费者消费产品%d...\n",ConsumeID);

Sleep(2000);

printf("从缓冲区%d拿走一个产品\n",out);

out = (out+1)%n;

}

DWORD WINAPI Producer(LPVOID lpPara)

{

while(g_continue){

if(WaitForSingleObject(Empty,2000)==WAIT_TIMEOUT)

{

printf("producer empty time out!\n");

continue;

}

if(WaitForSingleObject(Mutex,2000)==W AIT_TIMEOUT)

{

printf("producer mutex time out!\n");

continue;

}

Produce();//生产产品

ReleaseSemaphore(Full,1,NULL);

ReleaseMutex(Mutex);

}

return 0;

}

DWORD WINAPI Consumer(LPVOID lpPara)

{

while(g_continue){

if(WaitForSingleObject(Full,2000)==W AIT_TIMEOUT)

{

printf("consumer full time out!\n");

continue;

}

if(WaitForSingleObject(Mutex,2000)==W AIT_TIMEOUT)

{

printf("consumer mutex time out!\n");

continue;

}

Consume();//消费产品

ReleaseSemaphore(Empty,1,NULL);

ReleaseMutex(Mutex);

}

return 0;

}

int main()

{

Mutex = CreateMutex(NULL,FALSE,NULL);

Full = CreateSemaphore(NULL,0,n-1,NULL);

Empty = CreateSemaphore(NULL,n-1,n-1,NULL);

const unsigned short PRODUCERS_COUNT = 3;

const unsigned short CONSUMERS_COUNT = 2;

const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;

HANDLE Threads[PRODUCERS_COUNT];

DWORD producerID[CONSUMERS_COUNT];

DWORD consumerID[THREADS_COUNT];

for (int i=0;i

Threads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);

if (Threads[i]==NULL) return -1;

}//创建生产者进程

for ( i=0;i

Threads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]) ;

if (Threads[i]==NULL) return -1;

}//创建消费者进程

while(g_continue){

if(getchar()){ //按回车后终止程序运行

g_continue = false;

}

}

return 0;

}

6、实验结果

7、实验心得

这个实验是用C语言实现的,我去查阅学习了WIN32多线程编程,对信号量机制有了更深的理解,了解了多线程并发执行机制,线程间的同步和互斥,掌握了基本的同步互斥算法,理解生产者和消费者模型。

实验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

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

1实验1:生产者消费者问 题 -标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

福建农林大学金山学院实验报告 系(教研室):专业:计算机科学与技术年级: 实验课程:生产者与消费者实验姓名:学号: 实验室号: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;

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

操作系统课程设计 一.实验目标 完成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的组合,没有空格或其他字符。文件内容的格式没有特殊要求。

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

《操作系统》实验报告 生产者和消费者的问题 一、实验目的 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.程序结构图:

操作系统原理实验四

实验4 进程控制 1、实验目的 (1)通过对WindowsXP进行编程,来熟悉和了解系统。 (2)通过分析程序,来了解进程的创建、终止。 2、实验工具 (1)一台WindowsXP操作系统的计算机。 (2)计算机装有Microsoft Visual Studio C++6.0专业版或企业版。 3、预备知识 (3)·CreateProcess()调用:创建一个进程。 (4)·ExitProcess()调用:终止一个进程。 4、实验编程 (1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。阅读该程序,完成实验任务。源程序如下: # include < stdio.h > # include < windows.h > int main(VOID) ﹛STARTUPINFO si; PROCESS INFORMA TION pi; ZeroMemory(&si,sizeof(si)); Si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(!CreateProcess(NULL, “c: \ WINDOWS\system32\ mspaint.exe”, NULL, NULL, FALSE, 0, NULL, NULL, &si,&pi)) ﹛fprintf(stderr,”Creat Process Failed”); return—1; ﹜ WaitForSingleObject(pi.hProcess,INFINITE); Printf(“child Complete”); CloseHandle(pi.hProcess); CloseHandle(pi hThread); ﹜

实验报告五 生产者和消费者问题

实验报告五 ——生产者和消费者问题 姓名:丛菲学号:20100830205 班级:信息安全二班一、实习内容 ?1、模拟操作系统中进程同步和互斥 ?2、实现生产者和消费者问题的算法实现 二、实习目的 ?1、熟悉临界资源、信号量及PV操作的定义与物理意义 ?2、了解进程通信的方法 ?3、掌握进程互斥与进程同步的相关知识 ?4、掌握用信号量机制解决进程之间的同步与互斥问题 ?5、实现生产者-消费者问题,深刻理解进程同步问题 三、实习题目 ?在Linux操作系统下用C实现经典同步问题:生产者—消费者,具体要求如下: (1)一个大小为10的缓冲区,初始状态为空。 (2)2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消 费者取走数据之后再添加,重复10次。 (3)2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生 产者添加数据之后再读取,重复10次。 ?提示 本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。 (1)间接制约。这是由于多个进程共享同一资源(如CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。 (2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。 生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲

生产者与消费者实验报告

生产者和消费者实验报告 【实验目的】 1.加深对进程概念的理解,明确进程和程序的区别。 2.进一步认识并发执行的实质。 3.验证用信号量机制实现进程互斥的方法。 4.验证用信号量机制实现进程同步的方法。 【实验要求】 用c语言编程搭建“生产者和消费者”经典进程通信问题的环境。要求程序运行时,按任意键停止,显示当前系统的各个参数的值。提交实验报告,以及相关程序列表。打包成附件上传。 【实验环境】 Visual C++6.0 【实验内容】 1.了解经典同步问题“生产者和消费者” 生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。 2.分析和理解 (1)既存在合作同步问题,也存在临界区互斥问题 合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。 互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。 (2)基于环形缓冲区的生产者与消费者关系形式描述: 公用信号量mutex:初值为1,用于实现临界区互斥 生产者私用信号量empty:初值为n,指示空缓冲块数目 消费者私用信号量full:初值为0,指示满缓冲块数目 整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号 (3)PV原语 var mutex,empty,full:semaphore; i,j:integer;buffer:array[0...n-1] of item; i:=j:=1; Procedure producer; begin while true do begin

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

实验报告二 实验名称:一、生产者-消费者问题的多线程解决方案 二、设计一个执行矩阵乘法的多线程程序 日期:2015-10-22 班级:13级计科学号:姓名: 一、实验目的 1.掌握线程的同步与互斥 2.掌握生产者消费者的实现问题 3.掌握多线程的编程方法 4.掌握矩阵乘法的基本计算原理以及实现 二、实验内容 1.生产者-消费者问题的多线程解决方案 2.设计一个执行矩阵乘法的多线程程序 三、项目要求与分析 1.请查阅资料,掌握线程创建的相关知识以及矩阵乘法的相关知识,了解java语言程序编写的相关知识 2.理解线程的实验步骤 在本次试验中,以“生产者-消费者”模型为依据,提供了一个多线程的“生产者-消费者”实例,编写java代码调试运行结果,得出相应的结论。 理解矩阵乘法的实验步骤 四、具体实现 1.生产者-消费者实例 (1)创建一个缓冲信息发送接收通道接口,并创建邮箱盒子类实现,主要代码如下: ength; j++) { ength; j++)

{ " "); } ""); } ""); } (1)创建多线程类,并实现Runnable接口同步对矩阵进行分行计算,主要代码如下: etName()+"\t开始计算第 "+(task+1)+"行"); for(int i=0; i<; i++) { for(int j=0; j<; j++) { [task][i] += [task][j] * [j][i]; } } } ; } (2)通过不断改变矩阵大小,线程数目,,调试程序,运行结果: 五、所遇问题与解决方法 1.在生产者-消费者多线程试验中,刚开始没有考虑到使用线程睡眠,运行结 果速度之快,没法观看数据变化,后面定义了睡眠控制,使得问题得以解决2.在多线程矩阵开发实验中,刚开始定义矩阵太小,测试结果不太明显,后面 通过把矩阵改大,并且线程数目不断变化使得结果明显。 六、实验总结 深刻了解了生产者消费者多线程,进一步理解了“生产者-消费者”模型。同时也掌握了一些java编程语言相关知识。多线程矩阵实验中,发现矩阵小时,线程越少,运行时间越长;而矩阵过大时,线程数量与运行时间成反比。

操作系统原理实验五

实验五线程的同步 1、实验目的 (1)进一步掌握Windows系统环境下线程的创建与撤销。 (2)熟悉Windows系统提供的线程同步API。 (3)使用Windows系统提供的线程同步API解决实际问题。 2、实验准备知识:相关API函数介绍 ①等待对象 等待对象(wait functions)函数包括等待一个对象(WaitForSingleObject ())和等待多个对象(WaitForMultipleObject())两个API函数。 1)等待一个对象 WaitForSingleObject()用于等待一个对象。它等待的对象可以为以下对象 之一。 ·Change ontification:变化通知。 ·Console input: 控制台输入。 ·Event:事件。 ·Job:作业。 ·Mutex:互斥信号量。 ·Process:进程。 ·Semaphore:计数信号量。 ·Thread:线程。 ·Waitable timer:定时器。 原型: DWORD WaitForSingleObject( HANDLE hHandle, // 对象句柄 DWORD dwMilliseconds // 等待时间 ); 参数说明: (1)hHandle:等待对象的对象句柄。该对象句柄必须为SYNCHRONIZE访问。 (2)dwMilliseconds:等待时间,单位为ms。若该值为0,函数在测试对象的状态后立即返回,若为INFINITE,函数一直等待下去,直到接收到 一个信号将其唤醒,如表2-1所示。 返回值: 如果成功返回,其返回值说明是何种事件导致函数返回。

Static HANDLE hHandlel = NULL; DWORD dRes; dRes = WaitForSingleObject(hHandlel,10); //等待对象的句柄为hHandlel,等待时间为10ms 2)等待对个对象 WaitForMultiple()bject()在指定时间内等待多个对象,它等待的对象与 WaitForSingleObject()相同。 原型: DWORD WaitForMultipleObjects( DWORD nCount, //句柄数组中的句柄数 CONST HANDLE * lpHandles, //指向对象句柄数组的指针 BOOL fWaitAll, //等待类型 DWORD dwMilliseconds //等待时间 ); 参数说明: (1)nCount:由指针 * lpHandles指定的句柄数组中的句柄数,最大数是MAXIMUM WAIT OBJECTS。 (2)* lpHandles:指向对象句柄数组的指针。 (3)fWaitAll:等待类型。若为TRUE,当由lpHandles数组指定的所有对象被唤醒时函数返回;若为FALSE,当由lpHandles数组指定的某一个 对象被唤醒时函数返回,且由返回值说明是由于哪个对象引起的函数 返回。 (4)dwMilliseconds:等待时间,单位为ms。若该值为0,函数测试对象的状态后立即返回;若为INFINITE,函数一直等待下去,直到接收到 一个信号将其唤醒。 返回值:、 如果成功返回,其返回值说明是何种事件导致函数返回。 各参数的描述如表2-2所示。

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

操作系统上机实验报告 实验名称: 生产者与消费者问题模拟 实验目的: 通过模拟生产者消费者问题理解进程或线程之间的同步与互斥。 实验内容: 1、设计一个环形缓冲区,大小为10,生产者依次向其中写入1到20,每个缓冲区中存放一个数字,消费者从中依次读取数字。 2、相应的信号量; 3、生产者和消费者可按如下两种方式之一设计; (1)设计成两个进程; (2)设计成一个进程内的两个线程。 4、根据实验结果理解信号量的工作原理,进程或线程的同步\互斥关系。 实验步骤及分析: 一.管道 (一)管道定义 所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。(二)所涉及的系统调用 1、pipe( ) 建立一无名管道。 系统调用格式 pipe(filedes) 参数定义 int pipe(filedes); int filedes[2]; 其中,filedes[1]是写入端,filedes[0]是读出端。 该函数使用头文件如下: #include #inlcude #include 2、read( ) : 系统调用格式 read(fd,buf,nbyte) 功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf 所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。 参数定义:

int read(fd,buf,nbyte); int fd; char *buf; unsigned nbyte; 3、write( ) 系统调用格式 read(fd,buf,nbyte) 功能:把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。 参数定义同read( )。 (三)参考程序 #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) { lockf(fd[1],1,0); /*把串放入数组outpipe中*/ sprintf(outpipe,child 1 is using pipe!); /* 向管道写长为50字节的串*/ write(fd[1],outpipe,50); sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,child 2 is using pipe!); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0);

操作系统原理实验十一

实验十一银行家算法模拟实现 1实验类型 设计型(4学时)。 2实验目的 1)理解死锁避免相关内容; 2)掌握银行家算法主要流程; 3)掌握安全性检查流程。 3实验描述 本实验主要对操作系统中的死锁预防部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 4实验内容 1)设计多个资源(≥3); 2)设计多个进程(≥3); 3)设计银行家算法相关的数据结构; 4)动态进行资源申请、分配、安全性检测并给出分配结果。 5实验要求 1)编写程序完成实验内容; 2)画出安全性检测函数流程图; 3)小组派1人上台用PPT演讲实现过程; 4)撰写实验报告。

6测试要求 1)进行Request请求,输入参数为进程号、资源号和资源数; 2)进行3次以上的Request请求; 3)至少进行1次资源数目少于可用资源数,但不安全的请求。 7相关知识 7.1银行家算法的数据结构 1)可利用资源向量Available。其中每个元素代表每类资源的数目。 2)最大需求矩阵Max。其中每个元素代表每个进程对于每类资源的最大需求量。 Max[i,j]=K表示i进程对于j类资源的最大需求量为K。 3)分配矩阵Allocation。其中每个元素代表每个进程已得到的每类资源的数目。 4)需求矩阵Need。其中每个元素代表每个进程还需要的每类资源的数目。 7.2银行家算法 Request i [j]=K表示进程Pi需要K个j类资源。 1)如果Request i [j]≤Need[i , j],便转向步骤2,否则认为出错。 2)如果Request i [j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需等待; 3)系统尝试分配资源给Pi; 4)系统进行安全性检查,检查此次资源分配后,系统是否安全。如果安全,则正式分配资源,否则撤销此次分配。 7.3安全性算法 1)设置两个向量:工作向量Work和Finish。算法开始时Work=Available;Finish 表示系统是否有足够的资源分配给进程,使之运行完成,开始时,令 Finish[i]=False;如果有足够的资源分配给进程,则令Finish[i]=True。 2)从进程集合中找到一个能满足下列条件的进程:Finish[i]=False;Need[i,j] ≤Work[j],若找到,执行步骤3),否则,执行步骤4); 3)Pi获得所需资源后,可顺利执行指导完成,并释放它占有的资源。并执行:Work[j]=Work[j]+Allocation[i , j]; Finish[i] = True; 到第2)步。

操作系统实验报告-三大经典问题之生产者与消费者问题

计算机操作系统实验报告题目三大经典问题之生产者与消费者问题

一、课程设计的性质与任务 1、加深对并发协作进程同步与互斥概念的理解。通过编写程序实现进程同步和互斥,使学生掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 2、掌握进程和线程的概念,进程(线程)的控制原语或系统调用的使用。 3、了解Windows2000/XP中多线程的并发执行机制,线程间的同步和互斥。学习使用Windows2000/XP中基本的同步对象,掌握相应的 API函数。 4、培养学生能够独立进行知识综合,独立开发较大程序的能力。 5、培养提高学生软件开发能力和软件的调试技术。 6、培养学生开发大型程序的方法和相互合作的精神。 7、培养学生的创新意识。 8、培养学生的算法设计和算法分析能力。 9、培养学生对问题进行文字论述和文字表达的能力。 二、课程设计的内容及其要求 在Windows XP、Windows 2000等操作系统下,使用的VC、VB、Java或C等编程语言,采用进程(线程)同步和互斥的技术编写程序实现生产者消费者问题或哲学家进餐问题或读者-写者问题或自己设计一个简单进程(线程)同步和互斥的实际问题。 要求:(1)经调试后程序能够正常运行。 (2)采用多进程或多线程方式运行,体现了进程(线程)同步互斥的关系。 (3)程序界面美观。

三、实验原理 本实验要求利用PV操作实现解决生产者——消费者问题中的同步问题。此问题描述的是一群生产者进程在生产产品并将这些产品提供给消费者进程去消费,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区,消费者进程可从缓冲区中取走产品去消费,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满且尚未取出的缓冲区中投放产品,并且生产者消费者互斥使用缓冲区。 四、实验原理图 五、算法实现 (1)有一个生产者线程ProduceThread,有1个消费者进程CustomerThread;缓冲区为shareList。 (2)使用线程同步:用synchonized关键字(加锁)使得一个时间

操作系统实验报告--经典的生产者—消费者问题

实验二经典的生产者—消费者问题 一、目的 实现对经典的生产者—消费者问题的模拟,以便更好的理解经典进程同步问题。 二、实验内容及要求 编制生产者—消费者算法,模拟一个生产者、一个消费者,共享一个缓冲池的情形。 1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲池被占用时,任何进程都不能访问。 2、每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。 三、生产者和消费者原理分析 在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。 四、生产者与消费者功能描述: 生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。 消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。 五、实验环境 操作系统环境:Windows系统。 编程语言:C#。

生产者消费者问题模拟实现(z)

生产者-消费者实验 1.1实验目的和要求 1.1.1实验目的 操作系统的基本控制和管理控制都围绕着进程展开,其中的复杂性是由于支持并发和并发机制而引起的。自从操作系统中引入并发程序设计后,程序的执行不再是顺序的,一个程序未执行完而另一个程序便已开始执行,程序外部的顺序特性消失,程序与计算不再一一对应。并发进程可能是无关的,也可能是交互的。然而,交互的进程共享某些变量,一个进程的执行可能会影响其他进程的执行结果,交互的并发进程之间具有制约关系、同步关系。其中典型模型便是生产者-消费者模型。 本实验通过编写和调试生产者-消费者模拟程序,进一步认识进程并发执行的实质,加深对进程竞争关系,协作关系的理解,掌握使用信号量机制与P、V操作来实现进程的同步与互斥。 1.1.2实验要求 1.用高级语言编写一个程序,模拟多个生产者进程和多个消费者进程并发执行,并采用信号量机制与P、V操作实现进程间同步与互斥。 2.撰写实验报告,报告应包含以下容: (1)实验目的; (2)实验容; (3)设计思路; (4)程序流程图; (5)程序中主要数据结构和函数说明; (6)带注释的源程序代码; (7)程序运行结果及分析; (8)实验收获与体会。 1.2预备知识 1.2.1生产者—消费者问题 生产者—消费者问题表述如下:如图3.1所示,有n个生产者和m个消费者,连接在具

有k个单位缓冲区的有界环状缓冲上,故又称有界缓冲问题。生产者不断生成产品,只要缓冲区未满,生产者进程pi所生产的产品就可投入缓冲区;类似的,只要缓冲区非空,消费者进程cj就可以从缓冲区取走并消耗产品。 图 3.1 生产者—消费者问题示意图 著名的生产者—消费者问题(producer-consumer problem)是计算机操作系统中并发进程在关系的一种抽象,是典型的进程同步问题。在操作系统中,生产者进程可以是计算进程、发送进程,而消费者进程可以是打印进程、接收进程等,解决好生产者—消费者问题就解决了一类并发进程的同步问题。 操作系统实现进程同步的机制称为同步机制,它通常由同步原语组成。不同的同步机制采用不同的同步方法,迄今已设计出多种同步机制,本实验采用最常用的同步机制:信号量及PV操作。 1.2.2信号量与PV操作 1965年,荷兰计算机科学家E.W.Dijkstra提出新的同步工具——信号量和PV操作,他将交通管制中多种颜色的信号灯管理方法引入操作系统,让多个进程通过特殊变量展开交互。一个进程在某一关键点上被迫停止直至接收到对应的特殊变量值,通过这一措施任何复杂的进程交互要求均可得到满足,这种特殊变量就是信号量(semaphore)。为了通过信号量传送信号,进程可利用P和V两个特殊操作来发送和接收信号,如果协作进程的相应信号仍未到达,则进程被挂起直至信号到达为止。 在操作系统中用信号量表示物理资源的实体,它是一个与队列有关的整型变量。具体实现时,信号量是一种变量类型,用一个记录型数据结构表示,有两个分量:一个是信号量的值,另一个是信号量队列的指针。信号量在操作系统中主要用于封锁临界区、进程同步及维护资源计数。除了赋初值之外,信号量仅能由同步原语PV对其操作,不存在其他方法可以检查或操作信号量,PV操作的不可分割性确保执行的原子性及信号量值的完整性。利用信号量和PV操作即可解决并发进程竞争问题,又可解决并发进程协作问题。 信号量按其用途可分为两种:公用信号量,联系一组并发进程,相关进程均可在此信号量上执行PV操作,用于实现进程互斥;私有信号量,联系一组并发进程,仅允许此信号量所拥有的进程执行P操作,而其他相关进程可在其上执行V操作,初值往往为0或正整数,多用于并发进程同步。

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

计算机科学与软件学院 操作系统上机实验报告 学生姓名: 学号: 班级: 实验日期: 2014.5.20 实验名称:生产者与消费者问题模拟 实验目的:通过模拟生产者消费者问题理解进程或线程之间的同步与互斥。 实验内容: 1、 设计一个环形缓冲区,大小为10,生产者依次向其中写入1到20,每个缓冲区中 存放一个数字,消费者从中依次读取数字。 2、 相应的信号量; 3、 生产者和消费者可按如下两种方式之一设计; (1) 设计成两个进程; (2) 设计成一个进程内的两个线程。 4、 根据实验结果理解信号量的工作原理,进程或线程的同步\互斥关系。 实验步骤及分析:(此部分为关键内容:要求整理实验主要步骤,总结编写实验过程中遇到哪些问题,如何解决的,若未解决也应总结,回答思考题的答案) 一.管道 (一)管道定义 所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe 文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。 (二)管道的类型 1、有名管道 一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod( )建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open( )打开。 2、无名管道 一个临时文件。利用pipe( )建立起来的无名文件(无路径名)。只用该写,句柄fd[1] 读,句柄fd[0]

系统调用所返回的文件描述符来标识该文件,故只有调用pipe( )的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。 二种管道的读写方式是相同的,本文只讲无名管道。 3、pipe文件的建立 分配磁盘和内存索引结点、为读进程分配文件表项、为写进程分配文件表项、分配用户文件描述符. 4、读/写进程互斥 内核为地址设置一个读指针和一个写指针,按先进先出顺序读、写。 为使读、写进程互斥地访问pipe文件,需使各进程互斥地访问pipe文件索引结点中的直接地址项。因此,每次进程在访问pipe文件前,都需检查该索引文件是否已被上锁。若是,进程便睡眠等待,否则,将其上锁,进行读/写。操作结束后解锁,并唤醒因该索引结点上锁而睡眠的进程。 (三)所涉及的系统调用 1、pipe( ) 建立一无名管道。 系统调用格式 pipe(filedes) 参数定义 int pipe(filedes); int filedes[2]; 其中,filedes[1]是写入端,filedes[0]是读出端。 该函数使用头文件如下: #include #inlcude #include 2、read( ) 系统调用格式: read(fd,buf,nbyte) 功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。 参数定义: int read(fd,buf,nbyte); int fd; char *buf; unsigned nbyte; 3、write( )

操作系统原理实验报告

操作系统原理 实验报告 学院:信息与电子工程学院专业:计算机科学与技术 班级:计算机 学号: 姓名: 浙江科技学院 2010-2011学年第2学期

实验1 进程管理 一、实验目的 1. 弄清进程和程序的区别,加深对进程概念的理解。 2. 了解并发进程的执行过程,进一步认识并发执行的实质。 3. 掌握解决进程互斥使用资源的方法。 二、实验内容 1. 管道通信 使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。 2. 软中断通信 使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。 三、实验要求 1. 根据实验内容编写C程序。 2. 上机调试程序。 3. 记录并分析程序运行结果。

实验二生产者和消费者

1.1 实验目标 掌握操作系统对进程管理的同步和互斥问题,以经典同步问题“生产者和消费者”为例,运用所学C语言知识,编写该问题的模拟运行环境。 1.2 实验环境 教案机房,C语言程序平台。 1.3 实验内容及步骤 1.了解经典同步问题“生产者和消费者” 生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。b5E2RGbCAP 2.分析和理解 <1)既存在合作同步问题,也存在临界区互斥问题 合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。p1EanqFDPw 互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。 <2)基于环形缓冲区的生产者与消费者关系形式描述:

公用信号量mutex:初值为1,用于实现临界区互斥 生产者私用信号量empty:初值为n,指示空缓冲块数目 消费者私用信号量full:初值为0,指示满缓冲块数目 整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号 <3)PV原语 var mutex,empty,full:semaphore。 i,j:integer。buffer:array[0...n-1] of item。 i:=j:=1。 Procedure producer。 begin while true do begin produce a product。 P(empty>。 P(mutex>。 buffer(i>:=product。 i:=(i+1> mod n。 V(mutex>。 V(full>。 end。 end。

相关文档
最新文档