请求分页存储管理模拟实验.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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

文档评论(0)

dashewan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档