zoukankan      html  css  js  c++  java
  • 操作系统——生产者消费者

    有界缓冲问题
    有n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲上。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程cj就可从缓冲区取走并消耗产品。

     模型:

    int k;        //k个单位的缓冲区 
    typedef anyitem item;    //item类型
    item buffer[k];    //缓冲区 
    int in=0,out=0,counter=0;    //in是生产者的定位 out是消费者的定位 counter是产品 
    
    //生产者线程 
    process producer(void) {
    while (true)  {
        {produce an item in nextp}//生产下一个产品 
         if (counter==k)  //缓冲满时,生产者睡眠
               sleep(producer); 
       //sleep和wakeup系统内核函数,供应用程序调用
           buffer[in]=nextp;
           in=(in+1)%k;      //循环队列 
           counter++;         //产品       
           if(counter==1)    
           wakeup(consumer);  //唤醒消费者 
            }
       }
     
    //消费者线程  
    process consumer(void) {
        while (true) {     
        if (counter==0)   //缓冲区空,消费者睡眠
            sleep(consumer);
            nextc=buffer[out];
            out=(out+1)%k;     //循环对列 
            counter--;     //产品 
        if(counter==k-1) //取走一件产品,唤缓冲区有新的位置 
            wakeup(producer);      //醒生产者
        {consume the item in nextc};//消费产品
        }
    } 
  • 相关阅读:
    mysql 每条数据增加随机数
    Linux 的VSFTP报错
    Linux 常见命令指南
    Python文件
    Python合并2个文件
    J2ME获取移动手机号码
    不同角度来理解面向对象的几个关键性概念
    打印字符串中第一个只出现一次的字符(C语言)
    ftp上传文件
    ftp上传到nas
  • 原文地址:https://www.cnblogs.com/junfblog/p/12805600.html
Copyright © 2011-2022 走看看