读者写者问题-操作系统实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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){
sign = 1;//temp中已经有内容要置1
for(i=0;i<=m;i++){//index为当前读者队列中的等待进程数
wq.writers[wq.index++]=write_id;//将写者进程加入等待队列
wcount++;
return;
}
}
if(w == 1){
w--;
printf("写者%d正在写\n请输入要写的内容",write_id);
scanf("%s",temp);
//while
}//if
}
//************************读者优先时唤醒进程
rq.readers[rq.index++]=read_id;//将读者进程加入等待队列
}//else
}//if
else{//rcount !=1则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读
printf("读者%d正在读\n",read_id);
for(i = 0;i < 300;i++){
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空
for(i = 0;i < 300;i++){//读取temp内容即写者写的内容
if(temp[i] == '\0'){
printf("\n");
return;
}//if
printf("%c",temp[i]);
}//for
}//if
else{//写者线程正在执行
printf("!有写者在写不能读!\n");
rq.readers[rq.index++]=read_id;//将读者进程加入等待队列
RFwakeup();
return;
}
else{
rq.readers[rq.index++]=read_id;//将读者进程加入等待队列
WFwakeup();
return;
}
}//if
printf("读者%d正在读\n",read_id);
void WFwakeup();
void RFwakeup();
struct rqueue{//读者等待队列
int readers[200];
int index;
}rq;
struct wqueue{//写者等待队列
int writers[200];
int index;
}wq;
/*void first(){ //初始化
void RFwakeup(){
int i = 0;
int j = 0;
int m,n;
m = rq.index;
//n = wq.index;
if(rcount == 0){//当前无读进程,是写者在写--》停止运行写进程
bool reader_wait=false;
w=1;
printf("写者已经写完\n");
int i;
rq.index = 0;
wq.index = 0;
for(i = 0;i<20;i++){
rq.readers[i] = 0;
wq.writers[i] = 0;
}
}*/
//*******************************************读进程读操作
void reaBaidu Nhomakorabea(){
3、定义一个写者函数
当有读者在占用buffer时,写者应该等待,直到所有的读者都退出为止。
当有其他写者占用buffer时,该写者应该等待,直到占用buffer的写者退出为止。
当buffer有空闲时,写者应该在buffer中写入一个数据并退出。
当buffer满时,写者应该等待,直到buffer有空闲为止。
4、定义主函数,在其中可以任意创建读者与写者。
可根据用户输入创建读者或写者进程(线程)。
5、用户界面
实验当堂所要完成事情列表:
1.调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列)
2.根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够读出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读
3.根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式
源代码:
#include<stdio.h>
#include<stdlib.h>
int rcount=0;//正在读的读者数量
实验内容
1、定义一个数据缓存buffer及用于实现同步互斥的信号量。
2、定义一个读者函数:
当有写者在占用buffer时,读者应该等待,直到写者不再使用该buffer。
当有其他读者在占用buffer时,读者可对buffer进行读取操作。
当buffer中有数据时,则从其中读取一个数据,并显示然后退出。
当buffer中没有数据时,应等待,直到buffer中有数据可读。
printf("!有读者在读不能写!\n");
wq.writers[wq.index++]=write_id;//将写者进程加入等待队列
wcount++;
return;
}
if(rcount == 0 ){//rcount == 0则当前无读者,但w = 0,所以有写者在写
printf("!有写者在写不能写!\n");
if(temp[i] == '\0'){
printf("\n");
return;
}
printf("%c",temp[i]);
}//for
}//else
}
//***************************写进程写操作
void write(){
write_id++;
if(w == 0){
if(rcount != 0 ){//有读者进程在执行
read_id++;
if(rcount == 0){//当前没有读进程在读可能有写进程在写可能CPU空闲
if(w==1) {//如果CPU空闲,读者拿到CPU
w--;//相当于一个P操作
rcount++;
if(temp[0] == '\0'){
sign = 0;
if(choice == 1){
sign = 1;//temp中已经有内容要置1
for(i=0;i<=m;i++){//index为当前读者队列中的等待进程数
wq.writers[wq.index++]=write_id;//将写者进程加入等待队列
wcount++;
return;
}
}
if(w == 1){
w--;
printf("写者%d正在写\n请输入要写的内容",write_id);
scanf("%s",temp);
//while
}//if
}
//************************读者优先时唤醒进程
rq.readers[rq.index++]=read_id;//将读者进程加入等待队列
}//else
}//if
else{//rcount !=1则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读
printf("读者%d正在读\n",read_id);
for(i = 0;i < 300;i++){
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空
for(i = 0;i < 300;i++){//读取temp内容即写者写的内容
if(temp[i] == '\0'){
printf("\n");
return;
}//if
printf("%c",temp[i]);
}//for
}//if
else{//写者线程正在执行
printf("!有写者在写不能读!\n");
rq.readers[rq.index++]=read_id;//将读者进程加入等待队列
RFwakeup();
return;
}
else{
rq.readers[rq.index++]=read_id;//将读者进程加入等待队列
WFwakeup();
return;
}
}//if
printf("读者%d正在读\n",read_id);
void WFwakeup();
void RFwakeup();
struct rqueue{//读者等待队列
int readers[200];
int index;
}rq;
struct wqueue{//写者等待队列
int writers[200];
int index;
}wq;
/*void first(){ //初始化
void RFwakeup(){
int i = 0;
int j = 0;
int m,n;
m = rq.index;
//n = wq.index;
if(rcount == 0){//当前无读进程,是写者在写--》停止运行写进程
bool reader_wait=false;
w=1;
printf("写者已经写完\n");
int i;
rq.index = 0;
wq.index = 0;
for(i = 0;i<20;i++){
rq.readers[i] = 0;
wq.writers[i] = 0;
}
}*/
//*******************************************读进程读操作
void reaBaidu Nhomakorabea(){
3、定义一个写者函数
当有读者在占用buffer时,写者应该等待,直到所有的读者都退出为止。
当有其他写者占用buffer时,该写者应该等待,直到占用buffer的写者退出为止。
当buffer有空闲时,写者应该在buffer中写入一个数据并退出。
当buffer满时,写者应该等待,直到buffer有空闲为止。
4、定义主函数,在其中可以任意创建读者与写者。
可根据用户输入创建读者或写者进程(线程)。
5、用户界面
实验当堂所要完成事情列表:
1.调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列)
2.根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够读出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读
3.根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式
源代码:
#include<stdio.h>
#include<stdlib.h>
int rcount=0;//正在读的读者数量
实验内容
1、定义一个数据缓存buffer及用于实现同步互斥的信号量。
2、定义一个读者函数:
当有写者在占用buffer时,读者应该等待,直到写者不再使用该buffer。
当有其他读者在占用buffer时,读者可对buffer进行读取操作。
当buffer中有数据时,则从其中读取一个数据,并显示然后退出。
当buffer中没有数据时,应等待,直到buffer中有数据可读。
printf("!有读者在读不能写!\n");
wq.writers[wq.index++]=write_id;//将写者进程加入等待队列
wcount++;
return;
}
if(rcount == 0 ){//rcount == 0则当前无读者,但w = 0,所以有写者在写
printf("!有写者在写不能写!\n");
if(temp[i] == '\0'){
printf("\n");
return;
}
printf("%c",temp[i]);
}//for
}//else
}
//***************************写进程写操作
void write(){
write_id++;
if(w == 0){
if(rcount != 0 ){//有读者进程在执行