文档章节

进程题目锦集

木木情深
 木木情深
发布于 2014/02/14 13:29
字数 1368
阅读 28
收藏 0

【例1】生产者-消费者问题
在多道程序环境下,进程同步是一个十分重要又令人感兴趣的问题,而生产者-消费者问题是其中一个有代表性的进程同步问题。下面我们给出了各种情况下的生产者-消费者问题,深入地分析和透彻地理解这个例子,对于全面解决操作系统内的同步、互斥问题将有很大帮助。

(1)一个生产者,一个消费者,公用一个缓冲区。
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为1
   full——表示缓冲区中是否为满,初值为0。
生产者进程

while(TRUE){

生产一个产品
;
     
P(empty);
     
产品送往Buffer;
     
V(full);
}

消费者进程

while(True){
P(full);

   
从Buffer取出一个产品;
   
V(empty);
   
消费该产品;
   
}
2)一个生产者,一个消费者,公用n个环形缓冲区。
定义两个同步信号量:

empty
——表示缓冲区是否为空,初值为n。
full
——表示缓冲区中是否为满,初值为0。

    设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指
,指向下一个可用的缓冲区。

生产者进程

while(TRUE){

     
生产一个产品;
     
P(empty);
     
产品送往buffer(in);
     
in=(in+1)mod n
     
V(full);
}

消费者进程

while(TRUE){

 
P(full);
   
从buffer(out)中取出产品;
   
out=(out+1)mod n
   
V(empty);
   
消费该产品;
   
}

3)一组生产者,一组消费者,公用n个环形缓冲区
    
在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区。
定义四个信号量:

empty
——表示缓冲区是否为空,初值为n。
full
——表示缓冲区中是否为满,初值为0。
mutex1
——生产者之间的互斥信号量,初值为1。
mutex2
——消费者之间的互斥信号量,初值为1。

    设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。
生产者进程

while(TRUE){

     
生产一个产品;
     
P(empty);
     
P(mutex1)
     
产品送往buffer(in);
     
in=(in+1)mod n
     
V(mutex1);
     
V(full);
}

消费者进程

while(TRUE){

 
P(full)
   P(mutex2)

   
从buffer(out)中取出产品;
   
out=(out+1)mod n
   
V(mutex2);
   
V(empty);
   
消费该产品;
   
}
  需要注意的是无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒。应先执行同步信号量的P操作,然后再执行互斥信号量的P操作,否则可能造成进程死锁。

【例2】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

分析 在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

    :在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S
1;
int Sa=
0;
int So=0;

      
main()
      
{
        
cobegin
            
father();      /*父亲进程*/
            
son();        /*儿子进程*/
          
  daughter();    /*女儿进程*/
        
coend
    

   
 father()
    
{
        
while(1)
          
{
            
P(S);
            
将水果放入盘中;
            
if(放入的是桔子)V(So);
            
else  V(Sa);
           
}
     
}
    
son()
    
{
        
while(1)
          
{
             
P(So);
             
从盘中取出桔子;
           
  V(S);
             
吃桔子;
            

    
}
    
daughter()
    
{
         
while(1)
            
{
              
P(Sa);
              
从盘中取出苹果;
              
V(S);
              
吃苹果;
            


 

思考题:

四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
    
(1)应定义的信号量及初值:                    
    
(2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:
     
A()                B()                  C()                 D()
      {                 {                    {                  {
      [1];                [3];                  [5];                 [7];
      read F;             read F;                read F;              read F;
     [2];                [4];                  [6];                 [8];
      }                  }                    }                  } 

    思考题解答:
1)定义二个信号量S1、S2,初值均为1,即:S1=1,S2=1。其中进程A和C使用信号量S1,进程B和D使用信号量S2。
2)从[1]到[8]分别为:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)



本文转载自:http://www.cnblogs.com/sonic4x/archive/2011/07/05/2098036.html

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案

最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴、京东、美团、滴滴),面试回来之后会发给我一些面试题。有些朋友轻松过关,拿到offer,但是有一些是来询问我答案的。 我特意整理了...

youanyyou
2017/11/08
0
0
CTF内存取证入坑指南!稳!

最近,斗哥在刷CTF题目。突然刷到了内存取证类,了解到了一款牛逼的工具——Volatility,在kali linux也默认安装好了这个工具,正好可以好好学习一波。 Volatility 简介: Volatility是一款开...

漏斗社区
2017/11/02
0
0
经典.net面试题目

经典.net面试题目 1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访...

pin621
2016/12/06
2
0
LeetCode:Nth Highest Salary - 第N高的工资

1、题目名称 Nth Highest Salary(第N高的工资) 2、题目地址 https://leetcode.com/problems/nth-highest-salary/ 3、题目内容 与这道题目相比,上一道题目“Second Highest Salary”是本题...

北风其凉
2015/08/16
0
0
智能教育深度学习推荐系统---1.2.合成推荐算法CKE解读和算法实现1

在推荐系统构建中,人们最常用的方法当属协同过滤推荐算法。协同过滤推荐算法仅需要考虑用户和待推荐条目的交互关系,算法可以处理毫不费力地同时应用于电影推荐、图书推荐、音乐推荐等,而无...

最老程序员闫涛
08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
40分钟前
1
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
48分钟前
1
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
54分钟前
1
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
2
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部