信号量读者写者问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf(" * 2.增加一位读者\n");
printf(" * 3.增加一位写者('#'结束)\n");
printf(" * 4.退出程序\n");
printf("*************************************\n");
printf("请输入相应数字:");
scanf("%d",&choose);
semctl(semid,0,SETALL,array);
sb[0].sem_num=0;
sb[0].sem_op=1;
sb[1].sem_num=0;
sb[1].sem_op=-1;
sbLeabharlann Baidu2].sem_num=1;
sb[2].sem_op=1;
sb[3].sem_num=1;
sb[3].sem_op=-1;
#include<sys/>
#include<>
#include<sys/>
int main()
{
FILE *fp;
int semid;
int choose;
char ch;
struct sembuf sb[4];
unsigned short array[]={0,0};
semid=semget(0x1234,2,0666|IPC_CREAT);
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
putchar(10);
fclose(fp);
sleep(1);
semop(semid,&sb[3],1);
printf("写者写入结束\n");
}
else
{
show();
printf("读者或写者数不为0,不能写!\n");
{
semop(semid,&sb[2],1);
printf("添加一个写者\n");
show();
if((fp=fopen("/root/","w"))==NULL)
{
printf("cannot open file \n");
exit(0);
}
printf("输入内容:");
ch=getchar();
default:printf("输入错误,请从新输入\n");
}
}while(flag);
}
有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读—读允许;读—写互斥;写—写互斥。这些条件具体来说就是:
六、总结
这一次课程设计,让我体会很深刻。读者-写者问题经典的线程同步问题的一个模型。经过读者写者问题的编写,我对同步机构应用有了深入的了解。懂得了运用信号量实现进程间的互斥。实现了不让共享资源同时修改。用信号量上的原语操作使临界段问题的解决比较简单明了了。读者写者问题的编写,花的时间很多,也学到很多东西。了解支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。几天的试验,虽然难度有点大,但只要自己花时间去学习,还是会攻克困难的。
printf("*************************************\n");
switch(choose){
case 1:show();break;
case 2:reader();break;
case 3:writer();break;
case 4:flag=0;printf("程序已退出\n");break;
printf("添加一个读者\n");
show();
sleep(50);
semop(semid,&sb[1],1);
printf("减少一个读者\n");
}
else
{
show();
printf("写者数不为0,不能读!\n");
}
}
void writer()
{
if(semctl(semid,0,GETVAL)==0 & semctl(semid,1,GETVAL)==0)
二、课程设计内容
在windows或者linux环境下编写一个控制台应用程序,本次课程设计在操作系统:Linux下,使用的编程语言为C语言。该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。用信号量和PV操作实现读者/写者问题。
三、总体设计
读者/写者问题的描述如下:
实验报告
课程名称:
Unix下C
实验项目:
读者写者问题
姓名:
专业:
网络工程
班级:
网络
学号:
指导老师:
计算机科学与技术学院
实验教学中心
2013年12月22
一、课程设计目的及意义
l.用信号量来实现读者写者问题。
2.理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。
3.通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
(1)任意多的读进程可以同时读这个文件;
(2)一次只允许一个写进程往文件中写;
(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;
(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。
四、详细设计
读者-写者的读写限制
1)写-写互斥,即不能有两个写者同时进行写操作
2.写者模块:包括系统调用接口,写者活动描述主程序,写入内容并且使用互斥锁。
读者-写者活动程序根据临界资源的共享,互斥原则编制。
初始化系统环境
建立信号量
启动信号量的PV原语
读取或写入数据
提示当前读取或写入情况
五、系统实现
1.多个进程同时读取
2.多个进程读取,写进程不能执行
3.一个写进程,其他进程不能写也不能读
总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督。
附录A:代码
#include<sys/>
#include<sys/>
void show()
{
printf("当前的读者数为%d\n",semctl(semid,0,GETVAL));
printf("当前的写者数为%d\n",semctl(semid,1,GETVAL));
}
void reader()
{
if(semctl(semid,1,GETVAL)==0)
{
semop(semid,&sb[0],1);
(1)任意多的读进程可以同时读这个文件;
(2)一次只允许一个写进程往文件中写;
(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;
(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。
程序由二部分组成:
1.读者模块:包括系统调用接口,读者活动描述主程序。系统接口主要功能是读取内容并且使用共享锁
}
}
int flag=1;
do{
printf("\n****************利用信号量机制解决读者写者问题***************\n");
printf("****************主菜单***************\n");
printf(" * 1.查看读者、写者人数\n");
2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写
3)读读允许,即可以有2个以上的读者同时读
将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:
printf(" * 3.增加一位写者('#'结束)\n");
printf(" * 4.退出程序\n");
printf("*************************************\n");
printf("请输入相应数字:");
scanf("%d",&choose);
semctl(semid,0,SETALL,array);
sb[0].sem_num=0;
sb[0].sem_op=1;
sb[1].sem_num=0;
sb[1].sem_op=-1;
sbLeabharlann Baidu2].sem_num=1;
sb[2].sem_op=1;
sb[3].sem_num=1;
sb[3].sem_op=-1;
#include<sys/>
#include<>
#include<sys/>
int main()
{
FILE *fp;
int semid;
int choose;
char ch;
struct sembuf sb[4];
unsigned short array[]={0,0};
semid=semget(0x1234,2,0666|IPC_CREAT);
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
putchar(10);
fclose(fp);
sleep(1);
semop(semid,&sb[3],1);
printf("写者写入结束\n");
}
else
{
show();
printf("读者或写者数不为0,不能写!\n");
{
semop(semid,&sb[2],1);
printf("添加一个写者\n");
show();
if((fp=fopen("/root/","w"))==NULL)
{
printf("cannot open file \n");
exit(0);
}
printf("输入内容:");
ch=getchar();
default:printf("输入错误,请从新输入\n");
}
}while(flag);
}
有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读—读允许;读—写互斥;写—写互斥。这些条件具体来说就是:
六、总结
这一次课程设计,让我体会很深刻。读者-写者问题经典的线程同步问题的一个模型。经过读者写者问题的编写,我对同步机构应用有了深入的了解。懂得了运用信号量实现进程间的互斥。实现了不让共享资源同时修改。用信号量上的原语操作使临界段问题的解决比较简单明了了。读者写者问题的编写,花的时间很多,也学到很多东西。了解支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。几天的试验,虽然难度有点大,但只要自己花时间去学习,还是会攻克困难的。
printf("*************************************\n");
switch(choose){
case 1:show();break;
case 2:reader();break;
case 3:writer();break;
case 4:flag=0;printf("程序已退出\n");break;
printf("添加一个读者\n");
show();
sleep(50);
semop(semid,&sb[1],1);
printf("减少一个读者\n");
}
else
{
show();
printf("写者数不为0,不能读!\n");
}
}
void writer()
{
if(semctl(semid,0,GETVAL)==0 & semctl(semid,1,GETVAL)==0)
二、课程设计内容
在windows或者linux环境下编写一个控制台应用程序,本次课程设计在操作系统:Linux下,使用的编程语言为C语言。该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。用信号量和PV操作实现读者/写者问题。
三、总体设计
读者/写者问题的描述如下:
实验报告
课程名称:
Unix下C
实验项目:
读者写者问题
姓名:
专业:
网络工程
班级:
网络
学号:
指导老师:
计算机科学与技术学院
实验教学中心
2013年12月22
一、课程设计目的及意义
l.用信号量来实现读者写者问题。
2.理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。
3.通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
(1)任意多的读进程可以同时读这个文件;
(2)一次只允许一个写进程往文件中写;
(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;
(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。
四、详细设计
读者-写者的读写限制
1)写-写互斥,即不能有两个写者同时进行写操作
2.写者模块:包括系统调用接口,写者活动描述主程序,写入内容并且使用互斥锁。
读者-写者活动程序根据临界资源的共享,互斥原则编制。
初始化系统环境
建立信号量
启动信号量的PV原语
读取或写入数据
提示当前读取或写入情况
五、系统实现
1.多个进程同时读取
2.多个进程读取,写进程不能执行
3.一个写进程,其他进程不能写也不能读
总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督。
附录A:代码
#include<sys/>
#include<sys/>
void show()
{
printf("当前的读者数为%d\n",semctl(semid,0,GETVAL));
printf("当前的写者数为%d\n",semctl(semid,1,GETVAL));
}
void reader()
{
if(semctl(semid,1,GETVAL)==0)
{
semop(semid,&sb[0],1);
(1)任意多的读进程可以同时读这个文件;
(2)一次只允许一个写进程往文件中写;
(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;
(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。
程序由二部分组成:
1.读者模块:包括系统调用接口,读者活动描述主程序。系统接口主要功能是读取内容并且使用共享锁
}
}
int flag=1;
do{
printf("\n****************利用信号量机制解决读者写者问题***************\n");
printf("****************主菜单***************\n");
printf(" * 1.查看读者、写者人数\n");
2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写
3)读读允许,即可以有2个以上的读者同时读
将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件: