有限缓冲区问题的实现说明书_第1页
有限缓冲区问题的实现说明书_第2页
有限缓冲区问题的实现说明书_第3页
有限缓冲区问题的实现说明书_第4页
有限缓冲区问题的实现说明书_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*实践教学实践教学*兰州理工大学兰州理工大学计算机与通信学院2012 年秋季学期操作系统操作系统 课程设计课程设计题 目:有限缓冲区问题的实现 专业班级:计算机科学与技术(1)姓 名: 学 号: 指导教师: 成 绩: 2目目 录录前前 言言.3摘摘 要要.4正正 文文.51.设计思想.52.算法用到的主要数据结构(采用类C语言定义).63.相关的各模块的伪码算法.64.调试分析.105.测试结果.106.源程序(带注释).13总总 结结.18参考文献参考文献.19致致 谢谢.20附件附件 部分源程序代码部分源程序代码.213前前 言言本操作系统课设题目为:优先缓冲区问题的实现,其目的是为了了解

2、 UNIX的命令及使用格式,熟悉 UNIX/LINUX 的常用基本命令,练习并掌握 UNIX 提供的 vi 编辑器来编译 C 程序,学会利用 gcc、gdb 编译、调试 C 程序。编写程序实现有限缓冲区问题。要求设计两个线程,在一个地址空间运行,一个生产者线程生产产品,并把每个产品放到一个空缓冲中供消费者消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。4摘摘 要要关键词: 有限缓冲区问题;进程同步;生产者消费者本程序实现有限缓冲区问题。设计了

3、两个进程,在一个地址空间运行,一个生产者进程 producer 模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer 消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。程序使用共享内存的方法实现缓冲区,利用 PV 操作与信号量的方法实现生产者与消费者的同步。程序利用了三个信号量,mutexid 用于互斥地访问缓冲区,fullid 用于判断缓冲区是否满,用于指示消费者线程能否从缓冲区中取出产品,而 emptyid 则是用于判断缓冲区

4、是否空,用于指示生产者线程能否进行生产。5正正 文文1.1. 设计思想设计思想PV 操作时原子操作,也就是不可以中断的,在一定的时间内,只能够有一个进程的代码在 CPU 上面执行。在系统当中,有时候为了顺利的使用和保护共享资源,提出了信号量的概念,POSIX 标准提出了有名信号量和无名信号量的概念,由于 Linux 只实现了无名信号量,我们只介绍无名信号量。 信号量的使用主要是来保护共享资源,使得资源在一个时刻只有一个进程所拥有。为此可以使用一个信号灯,当信号灯的值为某个值的时候,就表明此时资源不可以使用,否则就表示可以使用。为了提供效率,Linux 系统提供可下面几个函数 int sem_i

5、nit(sem_t*sem,int pshared,unsigned int value); int sem_destroy(sem_t*sem); int sem_wait(sem_t*sem); int sem_trywait(sem_t*sem); int sem_post(sem_t*sem); int sem_getvalue(sem_t*sem); sem_init 创建一个信号灯,并初始化其值为 value.pshared 决定了信号量能否在几个进程间共享。由于目前 Linux 还没有实现进程间共享信号灯,所以这个值只能够取 0.sem_destroy 是用来删除信号灯的。Sem

6、_wait 调用将阻塞进程。直到信号灯的值大于 0.这个函数返回的时候自动将信号灯的值的件一 sem_post和 sem_wait 相反,是将信号灯的内容加一同时发出信号唤醒等待的进程。Sem_trywait 和 sem_wait 相同,不过不阻塞的,当信号灯的值为 0 的时候返回EAGAIN,表示以后重试。Sem_getvalue 得到信号灯的值。 这几个函数的使用相当的简单,比如我们有一个程序要向一个系统请求一个资源时,首先创建一个信号灯。并使其初始值为 1,表示有一个资源可用,然后一个进程调用 sem_wait 由于这个信号灯的值为 1,所以这个函数返回,打印机开始打印了,同时信号灯的值

7、为 0 了。如果第二个进程要使用,调用 sem_wait时候,有一信号灯的值为 0,资源不可用,于是被阻塞了。当第一个进程对资源的使用完毕后,调用 sem_post 信号灯的值为 1 了,这个时候系统通知第二个进程,于是第二个进程的 sem_wait 返回,第二个进程开始工作了。62.2. 算法用到的主要数据结构(采用类算法用到的主要数据结构(采用类 c c 语言定义)语言定义)int sem_init(sem_t*sem,int pshared,unsigned int value); int sem_destroy(sem_t*sem); int sem_wait(sem_t*sem);

8、int sem_trywait(sem_t*sem); int sem_post(sem_t*sem); int sem_getvalue(sem_t*sem);3.3. 相关的各模块的伪码算法相关的各模块的伪码算法3.13.1 包含的头文件:包含的头文件:#include#include#include#include#include#include#include#include#include#include3.23.2 主函数主函数 int main()7struct sembuf P,V;union semun arg;/声明共享内存int *array;int *sum;int *

9、set;int *get;/映射共享内存array=(int *)mmap(NULL ,sizeof(int)*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);sum=(int *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);get=(int *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);set=(int *)mmap(NU

10、LL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);*sum=0;*get=0;*set=0;/生成信号灯fullid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); /为信号灯赋值arg.val=0;if(semctl(fullid,0,SETVAL,arg)=-1)perror(semctl set

11、val error);arg.val=MAXSEM;if(semctl(emptyid,0,SETVAL,arg)=-1)perror(semctl setval error);8arg.val=1;if(semctl(mutxid,0,SETVAL,arg)=-1)perror(setctl setval error);/初始化 PV 操作V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO; 3.33.3 生产者进程生产者进程 if(fork()=0)int i=0;whil

12、e(i100)semop(emptyid,&P,1);semop(mutxid,&P,1);array*(set)%MAXSEM=i+1;printf(Producer %dn,array*(set)%MAXSEM);(*set)+;semop(mutxid,&V,1);semop(fullid,&V,1);i+;sleep(10);printf(Producer is over);_exit(0);3.43.4 消费者进程消费者进程 9 else/ 消费者 B 进程if(fork()=0)while(1)semop(fullid,&P,1);semop

13、(mutxid,&P,1);if(*get=100)break;*sum+=array(*get)%MAXSEM;printf(Comsumer B get number %dn,array(*get)%MAXSEM);(*get)+;if(*get=100)printf(The sum id %dn,*sum);semop(mutxid,&V,1);semop(emptyid,&V,1);sleep(2);printf(Comsumer B is over);_exit(0);sleep (20);return 0;104.4. 调试分析调试分析在对该课设进行调试分析

14、过程中,开始由于程序的不完善导致运行不出程序,经过老师的指导和同学们的帮助,所遇到的问题都一一解决了。5.5. 测试结果测试结果1112136.6. 源程序(带注释)源程序(带注释)#include#include#include#include#include#include#include#include#include#include#define MAXSEM 5/ 声明三个信号灯 IDint fullid;int emptyid;int mutxid;int main()struct sembuf P,V;union semun arg;/声明共享内存int *array;int *

15、sum;int *set;int *get;14/映射共享内存array=(int *)mmap(NULL ,sizeof(int)*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);sum=(int *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);get=(int *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);set=(in

16、t *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);*sum=0;*get=0;*set=0;/生成信号灯fullid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); /为信号灯赋值arg.val=0;if(semctl(fullid,0,SETVAL,arg)=-1)perror

17、(semctl setval error);arg.val=MAXSEM;if(semctl(emptyid,0,SETVAL,arg)=-1)perror(semctl setval error);arg.val=1;if(semctl(mutxid,0,SETVAL,arg)=-1)perror(setctl setval error);/初始化 PV 操作V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;15P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;/生产者进程if(fork()=0)int i=0;while

18、(i100)semop(emptyid,&P,1);semop(mutxid,&P,1);array*(set)%MAXSEM=i+1;printf(Producer %dn,array*(set)%MAXSEM);(*set)+;semop(mutxid,&V,1);semop(fullid,&V,1);i+;sleep(10);printf(Producer is over);_exit(0);else/ 消费者 A 进程if(fork()=0)while(1)semop(fullid,&P,1);semop(mutxid,&P,1);if(

19、*get=100)break;*sum+=array(*get)%MAXSEM;printf(Comsumer A get number 16%dn,array(*get)%MAXSEM);(*get)+;if(*get=100)printf(The sum id %dn,*sum);semop(mutxid,&V,1);semop(emptyid,&V,1);sleep(2);printf(Comsumer A is over);_exit(0);else/ 消费者 B 进程if(fork()=0)while(1)semop(fullid,&P,1);semop(mu

20、txid,&P,1);if(*get=100)break;*sum+=array(*get)%MAXSEM;printf(Comsumer B get number %dn,array(*get)%MAXSEM);(*get)+;if(*get=100)printf(The sum id %dn,*sum);semop(mutxid,&V,1);semop(emptyid,&V,1);sleep(2);17printf(Comsumer B is over);_exit(0);sleep (20);return 0;18总总 结结本次操作系统课程设计完成的是有限缓冲区问

21、题的实现,通过该题目的设计过程,初步掌握了进程同步与互斥的原理,并提高解决实际问题的能力。更了解了 UNIX 的命令及使用格式,熟悉 UNIX/LINUX 的常用基本命令。 是计算机类各专业的核心课程,也是其他诸多类专业的重要选修课。开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础。同时对于学生逻辑思维培养和程序设计思想体系的建立有着重要的影响。在这两周的课程设计中,我进一步理解和掌握了课本中所学的各种知识。学会了如何把学得到的知识用于解决实际问题,培养了我的动手能力,使我对数据结构课程所学的知识有了更深入的理解和掌握,巩固了理论教学所学到的知识,

22、扩展了我的编程思想。19参考文献参考文献1.汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社.2.王清,李光明.计算机操作系统.冶金工业出版社.3.孙钟秀等. 操作系统教程. 高等教育出版社4.曾明. Linux 操作系统应用教程. 陕西科学技术出版社. 5.张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.6.孟静, 操作系统教程原理和实例分析. 高等教育出版社7.周长林,计算机操作系统教程. 高等教育出版社8.张尧学,计算机操作系统教程. 清华大学出版社9.任满杰,操作系统原理实用教程. 电子工业出版社20致致 谢谢能够完成这次操作系统课程设计,我要感谢我的指导老师王艳,她在我的

23、课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,我的能力得到了提高,养成了科学、严谨学习习惯。在本次课程设计当中,有很多同学帮助我完成对程序的测试,对我的课程设计的完成起了不小的作用,在他们的帮助下,我才能够比较好的完成着次课程设计,在此一并表示感谢。21附件附件 部分源程序代码部分源程序代码#include#include#include#include#include#include#include#include#include#include#define MAXSEM 5/ 声明三个信号灯 IDint fullid;int emptyid;int mutxid;

24、int main()struct sembuf P,V;union semun arg;/声明共享内存int *array;int *sum;int *set;int *get;/映射共享内存22array=(int *)mmap(NULL ,sizeof(int)*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);sum=(int *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);get=(int *)mmap(NULL ,size

25、of(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);set=(int *)mmap(NULL ,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);*sum=0;*get=0;*set=0;/生成信号灯fullid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);mutxid=semget(IPC_PRIVATE,1,IPC_CREA

26、T|00666); /为信号灯赋值arg.val=0;if(semctl(fullid,0,SETVAL,arg)=-1)perror(semctl setval error);arg.val=MAXSEM;if(semctl(emptyid,0,SETVAL,arg)=-1)perror(semctl setval error);arg.val=1;if(semctl(mutxid,0,SETVAL,arg)=-1)perror(setctl setval error);/初始化 PV 操作V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;P.sem_num=0;23P.sem_op=-1;P.sem_flg=SEM_UNDO;/生产者进程if(fork()=0)int i=0;whil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论