西电操作系统上机实验6
实验6:共享主存实现进程通信
一、实验目的
进程同步是操作系统多进程/多线程并发执行的关键之一,进程同步是并发进程为了完成共同任务采用某个条件来协调他们的活动,这是进程之间发生的一种直接制约关系。本次试验是利用信号量进行进程同步。
二、实验内容
进程同步是操作系统多进程/多线程并发执行的关键之一,进程同步是并发进程为了完成共同任务采用某个条件来协调他们的活动,这是进程之间发生的一种直接制约关系。本次试验是利用信号量进行进程同步来解决生产者-消费者问题。
三、实现方法
生产者-消费者问题是典型的进程同步问题,其本质是如何控制并发进程对有界共享主存区的访问。
生产者进程生产产品,消费者进程消费产品。当生产者进程生产产品时,如果没有空缓冲区可用,那么生产者进程必须等待消费者进程释放出一个缓冲区。当消费者进程消费产品时,如果缓冲区中没有产品,那么消费者进程将被阻塞,直到新的产品被生产出来。
四、源代码
#include<windows.h>
#include<iostream>
#include<stdlib.h>
using namespace std;HANDLE h_Mutex; //互斥量
HANDLE bufferFullSemaphore; //已装填信号量
HANDLE bufferEmptySemaphore; //空余信号量
const int BUFFER_SIZE=3; //缓冲区大小
long buffer[BUFFER_SIZE]={0}; //缓冲区数组,用于存放产品编号
int in=0; //放入产品指针
int out=0; //移出产品指针
int num=0; //已经生产的产品数量,初值为0
int seq=1; //生产的产品号,初值为1
int num1=0; //Thread1消费的产品数,初值为0
int num2=0; //Thread2消费的产品数,初值为0
const int PRODUCER_NUM=1; //生产者数目
const int CONSUMER_NUM=2; //消费者数目
bool flag=true; //循环控制量
DWORD producerID[PRODUCER_NUM]; //生产者线程
DWORD consumerID[CONSUMER_NUM]; //消费者线程//生产者函数
void producer()
{while(flag){WaitForSingleObject(bufferEmptySemaphore,INFINITE);//p(bufferEmptySemaphore)WaitForSingleObject(h_Mutex,INFINITE); //p(h_Mutex)cout << "Producer is producing\n"; //正在生产产品cout << "Successfully produced\n"; //生产成功cout << "Product No: " << seq << endl; //输出产品编号buffer[in]=seq; //将产品放入缓冲区in=(in+1)%BUFFER_SIZE; //指针移位num=num+1; //已经生产的产品数量+1seq=seq+1; //产品编号+1cout << "Producer has produced " << num << " products all together";cout << endl << endl;Sleep(1000); ReleaseMutex(h_Mutex); //v(h_Mutex) ReleaseSemaphore(bufferFullSemaphore,1,NULL); //v(bufferFullSemaphore)}
}//消费者1函数
void consumer1()
{ while(flag){WaitForSingleObject(bufferFullSemaphore,INFINITE); //p(bufferFullSemaphore)WaitForSingleObject(h_Mutex,INFINITE); //p(h_Mutex)cout << "Thread1 gets Mutex" << endl;cout << "Thread1 is consuming a product" << endl;buffer[out] = 0;//将产品移出缓冲区out = (out + 1) % BUFFER_SIZE; //指针移位num1=num1+1;Sleep(500);cout << "A product has been consumed by Thread1" << endl;cout << "Thread1 has consumed " << num1 << " products" << endl;cout << "Two threads have consumed " << num1+num2 << " products all together" << endl;cout << "Thread1 releases Mutex\n" << endl;ReleaseMutex(h_Mutex);//v(h_Mutex)ReleaseSemaphore(bufferEmptySemaphore,1,NULL);//v(bufferEmptySemaphore)}
}//消费者2函数
void consumer2()
{while(flag){WaitForSingleObject(bufferFullSemaphore,INFINITE); //p(bufferFullSemaphore)WaitForSingleObject(h_Mutex,INFINITE); //p(h_Mutex)cout << "Thread2 get Mutex" << endl;cout << "Thread2 is consuming a product" << endl;buffer[out] = 0;out = (out + 1) % BUFFER_SIZE;num2=num2+1;Sleep(1000);cout << "A product has been consumed by Thread2" << endl;cout << "Thread2 has consumed " << num2 << " products" << endl;cout << "Two threads have consumed " << num1+num2 << " products all together" << endl;cout << "Thread2 releases Mutex\n" << endl;ReleaseMutex(h_Mutex);//v(h_Mutex)ReleaseSemaphore(bufferEmptySemaphore,1,NULL);//v(bufferEmptySemaphore)}
}//主函数
int main(int argc, char* argv[])
{cout << "本程序模拟生产者消费者问题\n\n生产者数目:1\n消费者数目:2\n缓冲区大小:100\n" << endl;cout << "1个生产者线程和2个消费者线程已准备就绪\n" << endl;cout << "消费者线程1消费时间:0.5s,消费者线程2消费时间:1s\n" << endl;h_Mutex = CreateMutex(NULL,false,NULL); //创建互斥信号量bufferFullSemaphore = CreateSemaphore(NULL,0,BUFFER_SIZE,NULL); //创建同步信号量bufferEmptySemaphore =CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL);//创建同步信号量CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)producer,NULL,0,&producerID[0]);CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)consumer1,NULL,0,&consumerID[1]);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)consumer2,NULL,0,&consumerID[0]);while(flag){if(getchar()){flag = false;}}return 0;
}
五、程序运行结果
西电操作系统上机实验6相关推荐
- 西电操作系统上机实验2
欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习 实验2:线程共享进程数据 一.实验目的 1.学习创建线程实现多工作同步运行; 2.了解线程与进程之间的数 ...
- 西电操作系统上机实验3
欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习 实验3:信号通信 一.实验目的 利用信号通信机制在父子进程及兄弟进程间进行通信. 二.实验内容 父进程创 ...
- 西电操作系统上机实验4
欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习 实验4:匿名管道通信 一.实验目的 学习使用匿名管道在两个进程间建立通信. 二.实验内容 父进程创建一个 ...
- 西电操作系统上机实验1
欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习. 实验1:创建进程 一.实验目的 学会通过基本的Windows进程控制函数,由父进程创建子进程. 二.实验内 ...
- 西电 操作系统课设 在Ubuntu18.04安装pintos
西电 操作系统课设 在Ubuntu18.04安装pintos 前言 1. 主要步骤 2. VMware的安装 3. Ubuntu18.04的安装和配置 4. Bochs的安装 4. Pintos安装 ...
- 西电-数据可视化-实验五-高维非空间数据可视化(pyecharts)
西电-数据可视化-实验五-高维非空间数据可视化 一.实验内容 在某次大型会议中,为确保会议过程安全,会场使用了电子胸牌对场内人员的移动轨迹进行了监控.现经过处理,得到了某一天内人员在场内各个区域逗留的 ...
- 大学操作系统上机实验
上机实验指导书 课程名称 操作系统 主撰人 刘天波 审核人 栾方军 沈阳建筑大学信息学院 2014 年3月 课程名称:操作系统 上机学时:16 适用专业:计算机科学与技术 先修课程:C语言 一 ...
- 西电计算机组装实验报告,西电模电实验报告(共7篇).docx
西电模电实验报告(共7篇) 姓名:学号: 生命科学技术学院实验报告小组成员: 实验名称: 实验报告内容基本要求: 一.实验目的:二.实验材料和仪器设备:三.实验基本原理及步骤:四.实验数据记录和结果分 ...
- 西电数据结构上机题目-删除单链表中介于min与max之间的结点
希望学长的代码能给大二西电er们带来帮助(大家一定要好好学习数据结构,合理利用资源) 大家找到了什么bug或有什么改进意见可以私信我或在下方留言,我都会看的 不多说废话直接上代码 #include&l ...
最新文章
- Clustering Coefficient
- 好物推荐:notion想同步什么东西,直接在这里写就可以,不用再发消息,真棒
- python免费入门_python入门 2018最新最全学习资料免费获取啦
- SQL各种join用法
- iOS11适配tableView顶部空白
- C++习题 虚函数-计算图形面积
- Spring Framework中的作用域代理
- javascript设计模式-适配器模式
- WPF开发为按钮提供添加,删除和重新排列ListBox内容的功能
- 个人学习进度(第十四周)
- 多个路由指向同一个页面_ASP.NET实战008:MVC路由实现详解
- stm32驱动ssd1306配置_STM32实验-SSD1306 OLED显示实验
- 2021年湖南省长沙市房地产行业发展现状分析(附开发投资额、施工面积、商品房销售、待售面积等)[图]
- 产品经理必修课(4):深挖需求
- 怀孕期间各个月注意事项
- java里的椭圆拟合_[求助]椭圆的跟踪拟合
- python数据分析:流量数据化运营(中)——流量数据波动原因下探分析
- 解决ubuntu14.04下,火狐浏览器无法访问csdn官网问题
- 蓝桥杯比赛准备第一天
- Java学习笔记14(接口+工厂模式)
热门文章
- 用vs拉取前端代码的详细流程及注意事项
- c语言c 关键字大全,C语言关键字大全(共32个)
- Java连接数据库(JDBC非常重要)
- PHP领域的术语对照(英中繁简)(转)。
- 体系结构类型——《软件工程:实践者的研究方法》第八版
- MySQL数据库实例教程实训4_数据库管理系统MySQL实验4教程.doc
- 软考阅卷老师10条忠告,得牢记
- Jquery重新学习之二[属性attr(),removeAttr(),prop(),removeProp()]
- (7) IFC构件的位置信息 (Industry Foundation Class)
- 硬件开发笔记(八): 硬件开发基本流程,制作一个USB转RS232的模块(七):创建基础DIP元器件(晶振)封装并关联原理图元器件