用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

咕噜船长    -  云代码空间

——

操作系统进程经典问题之——生产者和消费者问题

2017-04-24|664阅||

摘要:生产者只有在获得了一个空的缓冲区的时候,才可以进行写入操作,消费者只有获得一个满的缓冲区(也就是有内容的缓冲区)的时候,才可以进行取出其中内容的操作,同时,在生产者进行写入操作的时候消费者不可以进行读取操作,而当消费者进行读取操作的时候,生产者不可以进行写入操作,所以,生产者和消

生产者只有在获得了一个空的缓冲区的时候,才可以进行写入操作,消费者只有获得一个满的缓冲区(也就是有内容的缓冲区)的时候,才可以进行取出其中内容的操作,同时,在生产者进行写入操作的时候消费者不可以进行读取操作,而当消费者进行读取操作的时候,生产者不可以进行写入操作,所以,生产者和消费者对于缓冲区的访问是互斥关系,而生产者和消费者又是一个同步的关系,只有生产者生产,消费者才可以在缓冲区中进行读取。
(注:同步和互斥是两种关系,同步指的是生产者和消费者之间的存取是同步关系,而互斥是指生产者和消费者对于缓冲区的操作是互斥对立的操作,一次只可以对于缓冲区进行一种操作)

编写生产者和消费者进程的执行过程:
有三个控制的量:空的缓冲区、满的缓冲区以及互斥信号量metux;
  1. semaphore mutex=1; //临界区互斥信号量
  2. semaphore empty=n; //空闲缓冲区
  3. semaphore full=0; //缓冲区初始化为空
  4. producer () { //生产者进程
  5. while(1){
  6. produce an item in nextp; //生产数据
  7. wait(empty); //获取空缓冲区单元
  8. wait(mutex); //进入临界区.
  9. add nextp to buffer; //将数据放入缓冲区
  10. signal(mutex); //离开临界区,释放互斥信号量
  11. signal(full); //满缓冲区数加1
  12. }
  13. }
  14. consumer () { //消费者进程
  15. while(1){
  16. wait(full); //获取满缓冲区单元
  17. wait(mutex); // 进入临界区
  18. remove an item from buffer; //从缓冲区中取出数据
  19. signal (mutex); //离开临界区,释放互斥信号量
  20. signal (empty) ; //空缓冲区数加1
  21. consume the item; //消费数据
  22. }
  23. }
其中,metux在生产者和消费者任何之一对于其置为0时,另一个进程对于其访问时则会阻塞。













顶 3踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: 咕噜船长
    • 等级: 中级程序员
    • 积分: 215
    • 代码: 0 个
    • 文章: 4 篇
    • 随想: 0 条
    • 访问: 5 次
    • 关注

    人气代码

      最新提问

        站长推荐