class="markdown_views prism-kimbie-light">
开学第一个礼拜就开始验收操作系统设计,很醉,在家效率基本为负,所以加班加点和小伙伴们合力完成这个设计,因为二次开发更具性价比,所以本次参考的博文有:
System V 信号量(生产者与消费者模型)
设计要求
- 设置两类进程/线程,一类为生产者,一类为消费者;
- 建立缓冲区的数据结构,应用System V信号量机制实现互斥访问;
- 以读取配置文件的方式配置生产者和消费者进程参数(个数,生产/消费时间);
- 进程运行过程中输出相关信息(运行时刻,缓冲区占用、生产/消费物品个数)。
思路:
首先利用Linux本身具备的C语言库文件,结合IPC内核和共享内存,应用System V信号量机制简单的实现互斥访问,然后再通过简单的C语言基本语法读取文件方式实现配置文件等等
正文:
1. PV 原语
- P(S) :表示将资源 S 数量减 1,即 S = S - 1. 如果 S <= 0,该进程进入等待。
- V(S):表示将资源 S 数量加 1,即 S = S + 1. 如果 S > 0,该进程继续执行,否则释放一个正在等待的进程。
PV 操作是原子的,原子操作可以理解为一次性执行完若干条机器指令,中间不能打断。如果一个操作不是原子的,就可能会产生竞态错误。
while(1) {
P(EMPTY);
P(MUTEX);
if (cake < 5) {
cake++;
}
V(MUTEX);
V(FULL);
}
while(1) {
P(FULL);
P(MUTEX);
if (cake > 0) {
cake--;
}
V(MUTEX);
V(EMPTY);
}
如果用来描述蛋糕个数的信号量 FULL <= 0 了,消费者执行到 P(FULL) 就会立即被投入等待状态,不再被 OS 调度。什么时候 FULL > 0 了,才可能会被 OS 调度。
**基本上这就是实现生产者和消费者互斥访问的模型了,接下来就是应用Linux下的C语言库文件实现以上模型。**
2.Linux下的IPC
参考博文:
【Linux编程】进程间通信(IPC)
通过了解我们可以清楚的知道,有五个库文件是值得我们留意的:
而我们本次使用到的这两个正是信号量(#include < sys/shm.h> 共享内存和#include < sys/sem.h> 符合 System V 标准的 semaphore接口)
设计的过程中主要涉及到的问题有
- 如何快速的理解生产者-消费者模型
- 如何在Linux下快速开始C语言模块(编写Makefile)
- 如何方便快捷的熟悉IPC内核库文件和System V接口
- 如何编写配置文档
- 等等
因为是二次开发,所以必须在前人的基础上进行改良,首要任务就是理解源码才能够二次开发,所以时间上比较捉急,但东西就是这样,一遍不熟,多弄几遍就熟了。
看下运行效果:
编写的Makefile
运行原理
首先创建和初始化IPC内核,然后创建共享内存,开启生产者和消费者进程,它们分别作用于同样的缓冲区中,因为引入了Linux下的线程库(pthread.h),所以通过调用Linux下的多线程,实现多个生产者线程和多个消费者线程,
(config.conf)配置文件说明:
- 1、生产者生产时间(sleep实现)
- 2、消费者消费时间(通过sleep实现)
- 3、消费者次数
- 4、缓冲区大小
- 5、生产个数(每次)
- 6、消费个数(每次)
代码已上传至:
http://download.csdn.net/download/mikeoperfect/10267899
小结:
时间很紧张,不过得亏是个简单的生产者-消费者模型,所以理解上还是挺不错的,Linux下编写Makefile真的很不错,最起码执行起来很方便,C语言库文件确实很多,不过最重要的还是要先懂得原理模型,才能够快速的实现二次开发,所以操作系统还是挺重要的。