操作系统课程设计报告读者写者问题Word格式.doc

上传人:b****2 文档编号:14566633 上传时间:2022-10-23 格式:DOC 页数:10 大小:70KB
下载 相关 举报
操作系统课程设计报告读者写者问题Word格式.doc_第1页
第1页 / 共10页
操作系统课程设计报告读者写者问题Word格式.doc_第2页
第2页 / 共10页
操作系统课程设计报告读者写者问题Word格式.doc_第3页
第3页 / 共10页
操作系统课程设计报告读者写者问题Word格式.doc_第4页
第4页 / 共10页
操作系统课程设计报告读者写者问题Word格式.doc_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

操作系统课程设计报告读者写者问题Word格式.doc

《操作系统课程设计报告读者写者问题Word格式.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计报告读者写者问题Word格式.doc(10页珍藏版)》请在冰豆网上搜索。

操作系统课程设计报告读者写者问题Word格式.doc

进程数目不少于3个)。

(三)、程序分析

读者写者问题的定义如下:

有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;

有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:

(1)任意多个读进程可以同时读这个文件;

(2)一次只有一个写进程可以往文件中写;

(3)如果一个写进程正在进行操作,禁止任何读进程度文件。

实验要求用信号量来实现读者写者问题的调度算法。

实验提供了signal类,该类通过P()、V()两个方法实现了P、V原语的功能。

实验的任务是修改Creat_Writer()添加写者进程,Creat_Reader()创建读者进程。

Reader_goon()读者进程运行函数。

读优先:

要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。

读者优先的附加限制:

如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。

写优先:

一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。

写者优先的附加限制:

如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

在Windows7环境下,创建一个控制台进程,此进程包含n个线程。

用这n个线程来表示n个读者或写者。

每个线程按相应测试数据文件(格式见下)的要求进行读写操作。

用信号量机制分别实现读者优先和写者优先的读者/写者问题。

运行结果显示要求:

要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。

 

测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。

每行测试数据包括4个字段,各个字段间用空格分隔。

Ø

 

第一个字段为一个正整数,表示线程序号

第二个字段表示相应线程角色,R表示读者,W表示写者

第三个字段为一个正数,表示读/写操作的开始时间:

线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读/写请求

第四个字段为一正数,表示读/写操作的持续时间:

线程读写请求成功后,开始对共享资源的读/写操作,该操作持续相应时间后结束,并释放共享资源

例如:

1R35

2W45

3R52

4R65

5W5.13

读者写者问题是操作系统中经典的互斥问题:

一块数据被多个读者和写者的访问,需要考虑读写互斥、写写互斥(可以同时由多个读者读取)。

具体的又可以分为读者优先和写者优先两类。

读者优先算法:

当新的读者到来的时候,若当前正有读者在进行读操作,则该读者无需等待前面的写操作完成,直接进行读操作。

设置两个互斥信号量:

rwmutex用于写者与其他读者/写者互斥的访问共享数据

rmutex用于读者互斥的访问读者计数器readcount

varrwmutex,rmutex:

semaphore:

=1,1;

intreadcount=0;

cobegin

readeribegin//i=1,2,….

P(rmutex);

Readcount++;

If(readcount==1)P(rwmutex);

V(rmutex);

读数据;

Readcount--;

If(readcount==0)V(rwmutex);

End

Writerjbegin//j=1,2,….

P(rwmutex);

写更新;

V(rwmutex);

Coend

写者优先:

条件:

1)多个读者可以同时进行读

2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)

3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

设置三个互斥信号量:

nrmutex用于写者等待已进入读者退出,所有读者退出前互斥写操作

varrwmutex,rmutex,nrmutex:

=1,1,1;

If(readcount==1)P(nrmutex);

//有读者进入,互斥写操作

//及时释放读写互斥信号量,允许其它读、写进程申请资源

If(readcount==0)V(nrmutex);

//所有读者退出,允许写更新

//互斥后续其它读者、写者

P(nrmutex);

//如有读者正在读,等待所有读者读完

V(nrmutex);

//允许后续新的第一个读者进入后互斥写操作

//允许后续新读者及其它写者

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*---------函数声明---------*/

voidCreat_Writer();

//添加一个写者

voidDel_Writer();

//删除一个写者

voidCreat_Reader();

//添加一个读者

voidReader_goon();

//读者进程运行函数

voidR_Wakeup();

//唤醒等待读者

voidDel_Reader();

//删除一个读者

voidShow();

//显示运行状态

/*===============classsignal===============*/

classsignal//信号量对象.

{

private:

intvalue;

intqueue;

//用int型数据模拟等待队列.

public:

signal();

signal(intn);

intP();

//检查临界资源

intV();

//释放临界资源

intGet_Value();

intGet_Queue();

};

////////////////////////////////////////////////////////////////////

#include<

windows.h>

fstream>

cstdlib>

iostream>

usingnamespacestd;

constintMaxThread=20;

structThreadInfo

intnum;

chartype;

doublestart;

doubletime;

}thread_info[MaxThread];

HANDLEhX;

HANDLEhWsem;

HANDLEthread[MaxThread];

intreadcount;

doubletotaltime;

voidWRITEUNIT(intiProcess)

printf("

Thread%dbeginstowrite.\n"

iProcess);

Sleep((DWORD)(thread_info[iProcess-1].time*1000));

Endofthread%dforwriting.\n"

}

voidREADUNIT(intiProcess)

Thread%dbeginstoread.\n"

Endofthread%dforreading.\n"

DWORDWINAPIreader(LPVOIDlpVoid)

intiProcess=*(int*)lpVoid;

Sleep((DWORD)(thread_info[iProcess-1].start*1000));

DWORDwait_for=WaitForSingleObject(hX,INFINITE);

Thread%drequresreading.\n"

readcount++;

if(readcount==1)WaitForSingleObject(h

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1