操作系统设计之Linux下的生产者-消费者模型

2019-07-12 19:11发布

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 操作是原子的,原子操作可以理解为一次性执行完若干条机器指令,中间不能打断。如果一个操作不是原子的,就可能会产生竞态错误。
  • 生产者进程(资源以cake为例子)
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语言库文件确实很多,不过最重要的还是要先懂得原理模型,才能够快速的实现二次开发,所以操作系统还是挺重要的。