有限缓冲区问题的实现说明书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

{

相关文档
最新文档