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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统模拟实验

实验名称:请求分页存储管理模拟实验

实验目的:通过实验了解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;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,cur_size);

printf("我(生产者线程)已准备退出临界区\n");

//退出临界区

ReleaseMutex(mutex);

ReleaseSemaphore(full,1,0);

}

//线程结束后,将ThreadCompleted值加1

InterlockedIncrement(&ThreadCompleted);

if(ThreadCompleted ==2) SetEvent(evtTerminate);

return 0;

}

//消费者线程函数

unsigned long __stdcall c_Thread(void *theBuf)

{

while(flag)

{

Sleep(3000);

if(front==tail)

{

printf("缓冲区是空的\n");

sleep_time-=3000;

}

//P操作

WaitForSingleObject(full,INFINITE);

WaitForSingleObject(mutex,INFINITE);

printf("一个消费者进入critiction。\n");

BUFFER[out]=c_item;

out=(out+1)%cur_size;

tail=(tail+1)%max_buf_size;

PrintBuf(BUFFER,cur_size);

printf("消费者已经离开critiction\n");

//V操作

ReleaseMutex(mutex);

ReleaseSemaphore(empty,1,0);

}

//同生产者进程

InterlockedIncrement(&ThreadCompleted);

if(ThreadCompleted ==2) SetEvent(evtTerminate);

return 0;

}

相关文档
最新文档