没有合适的资源?快使用搜索试试~ 我知道了~
读者写者问题-操作系统实验报告.doc
资源推荐
资源详情
资源评论
读者写者问题-操作系统实验报告
实验内容
1、定义一个数据缓存 buffer 及用于实现同步互斥的信号量。
2、定义一个读者函数:
当有写者在占用 buffer 时,读者应该等待,直到写者不再使
用该 buffer。
当有其他读者在占用 buffer 时,读者可对 buffer 进行读取操
作。
当 buffer 中有数据时,则从其中读取一个数据,并显示然后
退出。
当 buffer 中没有数据时,应等待,直到 buffer 中有数据可读。
3、定义一个写者函数
当有读者在占用 buffer 时,写者应该等待,直到所有的读者
都退出为止。
当有其他写者占用 buffer 时,该写者应该等待,直到占用
buffer 的写者退出为止。
当 buffer 有空闲时,写者应该在 buffer 中写入一个数据并退
出。
当 buffer 满时,写者应该等待,直到 buffer 有空闲为止。
4、定义主函数,在其中可以任意创建读者与写者。
可根据用户输入创建读者或写者进程(线程)。
5、用户界面
2. 写者:
开始
读出的内容:
1. 读者:
开始
结束
2
1
读者队列等待
结束
写出的内容:
Hello world !
结束
读者写者问题-操作系统实验报告
实验当堂所要完成事情列表:
1. 调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的
结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等
待队列中的进程(先读者队列后写着队列)
2. 根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够读
出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才
能读
3. 根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择
模式
源代码:
#include<stdio.h>
#include<stdlib.h>
int rcount=0;//正在读的读者数量
int wcount=0;//写者队列中等待写操作的写者数量
int read_id=0;//读进程号
int write_id=0;//写进程号
int w=1;//读写互斥信号量
char temp[300] = {'\0'};
int choice; //用户选择读者优先 OR 写者优先
int sign; //标识 temp 空的信号量 0 表示 temp 空
void WFwakeup();
void RFwakeup();
struct rqueue{//读者等待队列
int readers[200];
int index;
}rq;
struct wqueue{//写者等待队列
int writers[200];
int index;
}wq;
/*void first(){ //初始化
int i;
rq.index = 0;
读者写者问题-操作系统实验报告
wq.index = 0;
for(i = 0;i<20;i++){
rq.readers[i] = 0;
wq.writers[i] = 0;
}
}*/
//*******************************************读进程读操作
void read(){
int i = 0;
read_id++;
if(rcount == 0){//当前没有读进程在读 可能有写进程在写 可能 CPU
空闲
if(w==1) {//如果 CPU 空闲,读者拿到 CPU
w--;// 相当于一个 P 操作
rcount++;
if(temp[0] == '\0'){
sign = 0;
if(choice == 1){
rq.readers[rq.index++]=read_id;//将读者进程加
入等待队列
RFwakeup();
return;
}
else{
rq.readers[rq.index++]=read_id;//将读者进程加
入等待队列
WFwakeup();
return;
}
}//if
printf("读者%d 正在读\n",read_id);
for(i = 0;i < 300;i++){//读取 temp 内容 即写者写的内容
if(temp[i] == '\0'){
printf("\n");
return;
}//if
printf("%c",temp[i]);
}//for
}//if
else{//写者线程正在执行
printf("!有写者在写不能读!\n");
剩余13页未读,继续阅读
资源评论
是空空呀
- 粉丝: 173
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功