文档介绍:目录
前言 2
摘要 3
正文 4
1. 设计思想 4
2. 算法中用到的主要数据结构(采用类c语言定义) 5
3. 相关的各模块的伪码算法 5
4. 调试分析 9
5. 测试结果 9
6. 源程序(带注释) 12
总结 17
参考文献 18
致谢 19
附件Ⅰ部分源程序代码 20
前言
本操作系统课设题目为:优先缓冲区问题的实现,其目的是为了了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,、gdb编译、调试C程序。编写程序实现有限缓冲区问题。要求设计两个线程,在一个地址空间运行,一个生产者线程生产产品,并把每个产品放到一个空缓冲中供消费者消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。
摘要
关键词: 有限缓冲区问题;进程同步;生产者消费者
本程序实现有限缓冲区问题。设计了两个进程,在一个地址空间运行,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。
程序使用共享内存的方法实现缓冲区,利用PV操作与信号量的方法实现生产者与消费者的同步。程序利用了三个信号量,mutexid用于互斥地访问缓冲区,fullid用于判断缓冲区是否满,用于指示消费者线程能否从缓冲区中取出产品,而emptyid则是用于判断缓冲区是否空,用于指示生产者线程能否进行生产。
正文
设计思想
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 创建一个信号灯,。由于目前Linux还没有实现进程间共享信号灯,。Sem_wait调用将阻塞进程。,是将信号灯的内容加一同时发出信号唤醒等待的进程。Sem_trywait和sem_wait相同,不过不阻塞的,当信号灯的值为0的时候返回EAGAIN,表示以后重试。Sem_getvalue得到信号灯的值。
这几个函数的使用相当的简单,比如我们有一个程序要向一个系统请求一个资源时,首先创建一个信号灯。并使其初始值为1,表示有一个资源可用,然后一个进程调用sem_wait由于这个信号灯的值为1,所以这个函数返回,打印机开始打印了,同时信号灯的值为0了。如果第二个进程要使用,调用sem_wait时候,有一信号灯的值为0,资源不可用,于是被阻塞了。当第一个进程对资源的使用完毕后,调用sem_post信号灯的值为1了,这个时候系统通知第二个进程,于是第二个进程的sem_wait返回,第二个进程开始工作了。
算法用到的主要数据结构(采用类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*se