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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件学院
操作系统实验报告
专业:软件工程
班级:RB软工互152
学号:201560160226
学生姓名:王泽华
指导教师:韩新超
实验二: 进程同步(生产者与消费者)
一.实验目的
1)理解进程竞争资源的现象,进而理解进程的同步于互斥;
2)掌握基本的互斥与同步算法,进一步理解“生产者—消费者”模型;
3)通过对“生产者—消费者”问题编程实现,了解进程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法;
六.实验总结
计算机操作系统中引入了进程后,极大的改善了系统资源的利用率和提高了系统的吞吐量,但是由于多道环境中同时存在多个进程,它们共享系统资源,各自按照各自的方式执行,给系统造成了混乱,所以系统必须提供一种机制管理进程,使这些并发执行的进程之间能有条不紊地运行,能有效地共享资源和相互合作,使得程序的执行具有可再现性,这就是进程同步的主要任务。
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);
buf[gi] = i;
cout << "生产者在" << gi << "号缓冲池放入" << buf[gi] << endl;
gi = (gi+1)%size;
LeaveCriticalSection(&gc);
ReleaseSemaphore(full,1,NULL);
}
cout << "生产者运行结束!" << endl;
cout << "线程" << GetCurrentThreadId() << "在缓冲池" << gj << "获取数据" << buf[gj] << endl;
if( buf[gj] == num ) //结束条件
{
LeaveCriticalSection(&gc);
ReleaseSemaphore(full,1,NULL);
七.附录
#include <iostream>
#include <process.h>
#include <windows.h>
using namespace std;
//生产者消费者问题,单个生产者,多个消费者,多个缓冲池
//使用信号量和关键段来实现
using namespace std;
int gi,gj;
}
return 0;
}
五.实验步骤
(2)结果分析:
①在每个过程中先做P(mutex),后做V(mutex),二者要成对出现。夹在二者中间的代码段就是该进程的临界区。
②对同步信号量full和empty的P,V操作同样必须成对出现,但它们分别位于不同的程序中。
③无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。
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);
8)Close Handle关闭一个内核对象。
2、数据结构用实验一中的进程就绪队列,并在此基础上进行调度,如果队列排序与算法要求不一致则编写一个排序函数。
3、进程调度算法:选择一种进程调度算法实现。
4、主界面设计:在实验一的界面上增加一个进程调度按钮、被调进程的PCB显示。
5、功能测试:从显示出的就绪队列状态和被调进程的PCB,查看操作的正确与否。
4)release Mutex释放由线程拥有的一个互斥体;
5)release Semaphore对指定的信号量增加指定的值;
6)wait for Single Object用来检测handle时间的信号状态;
7)wait for Multiple Objects true即等待所有信号量有效再往下执行,false当其中一个信号量有效时向下执行;
WaitForMultipleObjects(sz,hand,true,INFINITE);
//资源的ຫໍສະໝຸດ Baidu放
CloseHandle(full);
CloseHandle(empty);
DeleteCriticalSection(&gc);
for(int i = 0; i < sz ; i++)
{
CloseHandle(hand[i]);
unsigned int __stdcall pro(PVOID p) //生产者线程
{
for(int i = 0; i <= num ; i++)
{
WaitForSingleObject(empty,INFINITE); //线程同步
EnterCriticalSection(&gc); //线程互斥
4)进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。
二.实验属性
该实验为设计性实验。
三.实验仪器设备及器材
普通PC386以上微机
四. 实验理论基础
1、该实验中使用到相关的windows API函数:
1)create Thread建立新的线程;
2)create Mutex创建一个互斥体;
3)create Semaphore创建一个新的信号量;
return 0;
}
unsigned int __stdcall cus(PVOID p) //消费者线程
{
while(true)
{
WaitForSingleObject(full,INFINITE); //线程同步
if( flag == false ) //线程之间的逻辑判断
{
break;
}
EnterCriticalSection(&gc); //线程互斥
flag = false;
break;
}
gj = (gj+1)%size;
LeaveCriticalSection(&gc);
Sleep(50);
ReleaseSemaphore(empty,1,NULL);
}
cout << "消费者线程" << GetCurrentThreadId() << "运行结束!" << endl;
const int num = 10; //产生数据的个数
const int size = 4; //缓冲池的大小
volatile bool flag = true; //用于消费者线程之间
int buf[size]; //缓冲池
CRITICAL_SECTION gc; //关键段
HANDLE empty,full; // Semaphore
相关文档
最新文档