- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
请求分页存储管理模拟实验
操作系统模拟实验
实验名称:请求分页存储管理模拟实验
实验目的: 通过实验了解windows系统中的线程同步如何使用,进一步了解操作系统的同步机制。
实验内容 :调用Windows API,模拟解决生产者-消费者问题;思考在两个线程函数中哪些是临界资源?哪些代码是临界区?哪些代码是进入临界区?哪些代码是退出临界区?进入临界区和退出临界区的代码是否成对出现?学习Windows API中的如何创建线程,互斥,临界区等。
程序运行结果:
源程序:
#include stdAfx.h
//包含头文件以支持多线程
#include windows.h
#include stdio.h
//用于标志所有的子线程是否结束
//每次子线程结束后,此值便加1。
static long ThreadCompleted = 0;
//互斥量
HANDLE mutex;
//信号量,用于生产者通知消费者
HANDLE full;
//信号量,用于消费者通知生产者
HANDLE empty;
//信号量,当所有的子线程结束后,通知主线程,可以结束。
HANDLE evtTerminate;
//生产标志
#define p_item 1
//消费标志
#define c_item 0
//哨兵
#define END 10
//缓冲区最大长度
const int max_buf_size=11;
const int cur_size=10;
//缓冲区定义
int BUFFER[max_buf_size];
//放消息指针
int in=0;
//取消息指针
int out=0;
int front=0;
int tail=0;
int sleep_time=1000;
bool flag=true;
//线程函数的标准格式
unsigned long __stdcall p_Thread(void *theBuf);
unsigned long __stdcall c_Thread(void *theBuf);
//打印缓冲区内容
void PrintBuf(int buf[],int buf_size);
int main(int argc, char* argv[])
{
//初始化缓冲区
unsigned long TID1, TID2;
for(int i=0;icur_size;i++)
BUFFER[i]=0;
//互斥量和信号量的创建,函数用法可查看MSDN
mutex=CreateMutex(NULL,false,mutex);
full=CreateSemaphore(NULL,0,1,full);
empty=CreateSemaphore(NULL,max_buf_size,max_buf_size,empty);
evtTerminate = CreateEvent(NULL, FALSE, FALSE, Terminate);
//创建一个生产者线程和消费者线程。作为本程序的扩展,你可以增加线程的数目
CreateThread(NULL,0,p_Thread,BUFFER,NULL,TID1);
CreateThread(NULL,0,c_Thread,BUFFER,NULL,TID2); while(flag)
{
if(getchar())
{flag=false;}
}
//等待各子线程的结束
WaitForSingleObject(evtTerminate, INFINITE);
return 0;
}
//生产者线程函数
unsigned long __stdcall p_Thread(void *theBuf)
{
while(flag)
{
Sleep(sleep_time);
//可以不要此函数,只是为了模拟缓冲区满的情况
if((front+1)%max_buf_size==tail)
{
printf(缓冲区已满,产品的线程被阻塞\n);
sleep_time+=3000;
}
WaitForSingleObject(empty,INFINITE);//先申请信号量
WaitForSingleObject(mutex,INFINITE);//再申请互斥量
/*进入临界区*/
printf(生产(线程)正在生产请等待\n);
BUFFER[in]=p_item;
in=(in+1)%cur_size;
front=(front+1)%max_buf_size;
PrintBuf(BUFFER
您可能关注的文档
- 英基础医学词汇.doc
- 苯-甲苯板式精馏塔.docx
- 英语数字数目数量的前缀(收藏版).docx
- 药事管理离线必做作业.doc
- 药二复习资料.docx
- 药学综合知识与技能模拟试卷.docx
- 药食同源文档.doc
- 荷花淀解题.doc
- 薄壁结构的机械破损模式.doc
- 血透病人饮食护理.doc
- 2025年吉林省长春市中考历史试题(解析版).pdf
- 2024-2025学年人教版八年级物理下册期末复习练习卷 (含答案).pdf
- 人教版八年级英语上册期末核心考点归纳(含答案).pdf
- 氧化还原滴定与沉淀滴定的相关计算-2024年高考化学考点复习(全国)解析版.pdf
- 数与式一(有理数、实数和代数式,60题)-2021-2025年中考数学复习分类汇编(上海专用).pdf
- 议论文阅读-2024年中考语文一轮复习题型专练.pdf
- 2025年人教版新高一英语学困生专项复习《完形填空》.pdf
- 2023-2025年高考地理试题分类汇编:交通(全国通用)解析版.pdf
- 2025年高考历史试题分类汇编:中国近代史·选择题(全国通用)原卷版.pdf
- 氧化还原滴定与沉淀滴定的相关计算-2024年高考化学考点复习(全国)原卷版.pdf
文档评论(0)