有限缓冲区问题的实现说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年秋季学期
操作系统课程设计
题目:有限缓冲区问题的实现
专业班级:计算机科学与技术(1)姓名:杨占宏
学号:10240123
指导教师:李明
成绩:
目录
前言 (3)
摘要 (4)
正文 (5)
1.设计思想 (5)
2.算法用到的主要数据结构(采用类C语言定义) (6)
3.相关的各模块的伪码算法 (6)
4.调试分析 (10)
5.测试结果 (10)
6.源程序(带注释) (13)
总结 (18)
参考文献 (19)
致谢 (20)
附件Ⅰ部分源程序代码 (21)
前言
本操作系统课设题目为:优先缓冲区问题的实现,其目的是为了了解UNIX 的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。编写程序实现有限缓冲区问题。要求设计两个线程,在一个地址空间运行,一个生产者线程生产产品,并把每个产品放到一个空缓冲中供消费者消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。
摘要
关键词:有限缓冲区问题;进程同步;生产者消费者
本程序实现有限缓冲区问题。设计了两个进程,在一个地址空间运行,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。
程序使用共享内存的方法实现缓冲区,利用PV操作与信号量的方法实现生产者与消费者的同步。程序利用了三个信号量,mutexid用于互斥地访问缓冲区,fullid用于判断缓冲区是否满,用于指示消费者线程能否从缓冲区中取出产品,而emptyid则是用于判断缓冲区是否空,用于指示生产者线程能否进行生产。
正文
1.设计思想
PV操作时原子操作,也就是不可以中断的,在一定的时间内,只能够有一个进程的代码在CPU上面执行。在系统当中,有时候为了顺利的使用和保护共享资源,提出了信号量的概念,POSIX标准提出了有名信号量和无名信号量的概念,由于Linux只实现了无名信号量,我们只介绍无名信号量。
信号量的使用主要是来保护共享资源,使得资源在一个时刻只有一个进程所拥有。为此可以使用一个信号灯,当信号灯的值为某个值的时候,就表明此时资源不可以使用,否则就表示可以使用。为了提供效率,Linux系统提供可下面几个函数
int sem_init(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_wait调用将阻塞进程。直到信号灯的值大于0.这个函数返回的时候自动将信号灯的值的件一sem_post和sem_wait相反,是将信号灯的内容加一同时发出信号唤醒等待的进程。Sem_trywait和sem_wait相同,不过不阻塞的,当信号灯的值为0的时候返回EAGAIN,表示以后重试。Sem_getvalue得到信号灯的值。
这几个函数的使用相当的简单,比如我们有一个程序要向一个系统请求一个资源时,首先创建一个信号灯。并使其初始值为1,表示有一个资源可用,然后一个进程调用sem_wait由于这个信号灯的值为1,所以这个函数返回,打印机开始打印了,同时信号灯的值为0了。如果第二个进程要使用,调用sem_wait时候,有一信号灯的值为0,资源不可用,于是被阻塞了。当第一个进程对资源的使用完毕后,调用sem_post信号灯的值为1了,这个时候系统通知第二个进程,于是第二个进程的sem_wait返回,第二个进程开始工作了。
2.算法用到的主要数据结构(采用类c语言定义)
int sem_init(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);
3.相关的各模块的伪码算法
3.1包含的头文件:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
3.2主函数
int main()
{