20210403OS第二章Chap2 进程管理

Chap2 进程管理

内容
	前趋图和程序执行
		有向无循环图 用于描述进程之间执行的前后关系 
		前趋图中必须不存在循环
	进程的描述
		进程:程序关于某个数据集合的一次执行过程
	进程控制
	进程同步
	经典进程的同步问题
	进程通信
	线程的基本概念

目的及要求

1.领会程序顺序执行和并发执行的特征;
	程序顺序执行时的特征(1) 顺序性 (2) 封闭性(3) 可再现性
	程序并发执行时的特征(1)  间断性(2)  失去封闭性(3)  不可再现性


2.理解和掌握进程的概念和特征、进程的基本状态及转换
	进程:程序关于某个数据集合的一次执行过程
	进程的特征(与程序比较):
	(1) 结构特征
        进程控制块(PCB) + 程序 + 数据 = 进程实体
	(2) 动态性——最基本特征
		进程:进程实体的一次执行过程,有生命周期。
		程序:程序是一组有序指令的集合,是静态的概念。
	(3) 并发性
	(4) 独立性
	(5) 异步性
    	进程按各自独立的、不可预知的速度向前推进
    /2.  进程的三种基本状态
	(1)就绪状态(Ready)
      	进程已获得除CPU之外的所有必需的资源,一旦得到CPU控制权,立即	可以运行。
	(2)运行状态(Running)
      	进程已获得运行所必需的资源,它的程序正在处理机上执行。 
	(3)阻塞状态(Blocked)
      	正在执行的进程由于发生某事件而暂时无法执行时,便放弃处理机而处于暂停状态,称该进程处于阻塞状态或等待状态。
     就绪    进程调度 ---   执行
     执行    时间片完 ---   就绪
     执行    I/O请求  ---  阻塞
     阻塞    I/O完成  ---  就绪
   
   /3.  挂起状态
	1)  引起挂起状态的原因:
 		终端用户的请求
 		父进程请求
 		负荷调节的需要
		操作系统的需要
		
	2)  进程状态的转换
     	引入挂起状态后,增加了挂起状态(静止状态)到
    	非挂起状态(活动状态)的转换,或者相反。

	
    
3.理解进程控制块的作用、包含信息和组织方式;
	/1.  进程控制块(PCD)的作用
      存放进程管理和控制信息的数据结构称为进程控制块。它是进程管理和控制的最重要的数据结构,在创建时,建立PCB,并伴随进程运行的全过程,直到进程撤消而撤消。PCB就象我们的户口。
     /2.  进程控制块中的信息
	1) 进程标示符   
  		每个进程都必须有一个唯一的标识符
		内部标示符
		外部标示符
	2) 处理机状态
			处理机状态信息主要由处理机的各种寄存器中的内容组成。处理机运行时的信息存放在寄存器中,当被中断时这些信息要存放在		 PCB中。
	3) 进程调度信息
		进程状态
		进程优先级
		进程调度所需的其他信息
		事件
	4) 进程控制信息
		程序和数据的地址
		进程通信和同步机制
		资源清单
		链接指针
	/3.  进程控制块的组织方式
	1) 线性方式
	2) 链接方式
      	把具有同一状态的PCB用其中的链接字链接成一个队列。
	就绪队列;若干个阻塞队列;
	3) 索引方式
		系统根据所有进程的状态建立几张索引表,把各表的内存首地址记录在内存的专用单元中。索引表的表目中		记录了相应状态的某个PCB在PCB表中的地址。






4.领会引起进程创建、终止、阻塞、唤醒、挂起、激活的过程和各类进程控制

5.原语的执行过程;
	生产者—消费者问题:生产者进程
	生产者进程和消费者进程都以异步方式运行,但它们之间必须保持同步。
P操作  			wait(S):	 
                   While (S<=0) do no-op;			                                         
                    S--;
V操作 			 signal(S):	  
                    S++;
semaphore  mutex =1;
        begin
        parbegin
            process 1: begin
                                   repeat
                                      wait(mutex);
                                      critical section
                                      signal(mutex);
                                      remainder section
                                   until false;
                               end
            process 2: begin
                                   repeat
                                      wait(mutex);
                                      critical section
                                      signal(mutex);
                                      remainder section
                                   until false; 
                               end
        parend                           

wait(mutex)和signal(mutex)必须成对出现
正确使用时能实现同步和互斥
含义:信号量>0,代表可用资源的数量
     信号量<0,代表由于申请信号量代表的资源而阻塞的进程数量
Process  A: wait(Dmutex);  于是Dmutex=0
Process  B: wait(Emutex);  于是Emutex=0
Process  A: wait(Emutex);  于是Emutex=-1   A阻塞
Process  B: wait(Dmutex);  于是Dmutex=-1   B阻塞

	Process  A:
    wait(Dmutex);
    wait(Emutex);
        使用D、E
    Signal(Dmutex)
    Signal(Emutex)

	Process  B:
    wait(Emutex);
    wait(Dmutex);
       使用D、E
    Signal(Dmutex)
    Signal(Emutex)
2.5.1 生产者——消费者问题
	生产者进程和消费者进程都以异步方式运行,  但它们之间必须保持同步。
	1. 利用记录型信号量解决生产者——消费者问题
      可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲池和满缓冲池的数量。  假定这些生产者和消费者相互等效

2.5.2 哲学家进餐问题
	五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。
	
	至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕后释放出他用过的两只筷子,从而使更多的哲学家能够进餐。
	仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐。
	规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;偶数号哲学家则相反。

2.5.3 读者——写者问题
只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象
“读者——写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。
       由于只要有一个Reader进程在读,便不允许Writer进程写。   ∴仅当Readcount=0,即无Reader进程在读时,Reader才需要执行Wait(wmutex)操作。若Wait(wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。

6.了解线程的基本概念,理解线程与进程的联系与区别。
	线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。
	线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。 
7.理解临界资源和临界区的概念,领会进程同步机制应遵循的准则;
8.理解和掌握整型信号量和记录型信号量机制;
9.熟练掌握利用信号量机制解决进程同步问题;
10.了解进程通信的类型,理解消息传递系统中的发送和接收原语。

重点


1.程序并发执行的特征;
2.进程的概念和特征;
3.进程的基本状态及其转换;
4.临界资源和临界区的概念;
5.记录型信号量机制;
6.利用信号量机制解决进程同步问题;
7.线程与进程的比较。

难点

程序的顺序执行和并发执行比较;
进程和程序的联系与区别;
利用信号量机制解决经典进程同步与互斥问题;
线程与进程的比较。
例题讲解
1)生产者-消费者问题
一般意义的“生产者—消费者”问题:N个buffer,多个生产者,多个消费者,循环存取buffer。这就是一般意义的“生产者—消费者”问题。利用记录型信号量解决一般意义的“生产者—消费者”问题算法描述,请看教材。
说明:
(1)由于buffer有N个,而且buffer又是临界资源,因此,需要增加一个信号量mutex来实现对buffer的互斥访问,其初始值为1。需要特别强调的是,这种情况下,mutex不能省略。
(2)这种情况下,只要保证为不同的进程分配不同buffer,putdata和getdata操作是可以同时进行的,因此,对buffer的互斥访问不是发生在对buffer的存取操作上,而是发生在对buffer的分配上。
2)“哲学家进餐”问题
教材中解决哲学家进餐问题的算法有可能发生死锁,为避免死锁,可以采用以下三种策略:
策略一原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。定义信号量count,只允许4个哲学家同时进餐,这样就能保证至少有一个哲学家可以就餐。
semaphore chopstick[5]={1,1,1,1,1};
semaphore count=4;
void philosopher(int i)
{while(true)
{
think();
wait(count); //请求进入房间进餐
wait(chopstick[i]); //请求左手边的筷子
wait(chopstick[(i+1)%5]); //请求右手边的筷子
eat();
signal(chopstick[(i+1)%5]); //释放右手边的筷子
signal(chopstick[i]); //释放左手边的筷子
signal(count); //退出房间释放信号量
}
}

策略二原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。可以利用AND 型信号量机制实现,也可以利用信号量的保护机制实现。利用信号量的保护机制实现的思想是通过记录型信号量mutex对取左侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。描述如下:
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{while(true)
{
think();
wait(mutex);
wait(chopstick[(i+1)%5]);
wait(chopstick[i]);
signal(mutex);
eat();
signal(chopstick[(i+1)%5]);
signal(chopstick[i]);
}
}
策略三原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则相反。按此规定,将是1、2号哲学家竞争1号筷子,3、4号哲学家竞争3号筷子。即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐。
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{while(true)
{
think();
if(i%2 == 0) //偶数哲学家,先右后左。
{
wait (chopstick[(i + 1)%5]) ;
wait (chopstick[i]) ;
eat();
signal (chopstick[(i + 1)%5]) ;
signal (chopstick[i]) ;
}
else //奇数哲学家,先左后右。
{
wait (chopstick[i]) ;
wait (chopstick[(i + 1)%5]) ;
eat();
signal (chopstick[i]) ;
signal (chopstick[(i + 1)%5]) ;
}
}

3)“读者—写者”问题的演变
从本质上讲,读者—写者问题要解决:读、读共享;写、写互斥;写、读互斥。有两种解决模式:
模式一,读者优先的“读者—写者”问题解决模式(算法描述请参考教材):
①定义互斥信号量wmutex,实现写、写互斥和写、读互斥。
②定义整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程写,因此仅当Readcount=0,即无Reader进程在读时,Reader才需要执行Wait(wmutex)操作。若Wait(wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader进程在执行了Readcount减1操作后其值为0时,才需执行signal(wmutex)操作,以便让Write进程写。
③由于Readcount为多个读进程共享(修改),因此需要以互斥方式访问,为此,需要定义互斥信号量rmutex,保证读进程间互斥访问Readcount。
说明:在读者—写者问题中,实现“读、读共享”是有一定难度的,请掌握该模式(由②和③构成)。
模式二,写者优先的“读者—写者”问题解决模式,算法描述如下:
设3个信号量:
rmutex --- 读互斥信号量,初值为1;
wmutex --- 写互斥信号量,初值为1;
s --- 用于在写进程到达后封锁后续的读者,初值为1;
count --- 共享变量,用于记录当前正在读文件的读者数目,初值为0;
semaphore rmutex=1, wmutex=1, s=1;
int count=0;
main() {
Cobegin
Reader();
Writer();
Coend
}
Reader() {
While(1)  {
P(s);  
P(rmutex);
If (count==0) P(wmutex);  /*当第1个读者读文件时,阻止写者写*/
count++
V(rmutex);
V(s);
读文件;
P(rmutex);
count--;
If (count==0) V(wmutex);  /*当最后1个读者读完文件时,允许写者写*/
V(rmutex);
}
}
Writer() {
While(1)  {
P(s);
P(wmutex);
写文件;
V(wmutex);
V(s);
}
}


例题解析
【例1】 桌上有1空盘,允许存放1个水果。爸爸向盘中放苹果,也可以向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放1个水果供吃者取用。请用Wait()、Signal()原语实现爸爸、儿子、女儿三个并发进程的同步。
【南京大学2000】
【分析】这是复杂情况的“生产者—消费者”问题,既有同步又有互斥。爸爸进程与儿子进程、女儿进程需要同步,儿子进程与女儿进程需要互斥。设置4个信号量S(盘子是否为空,初值为1)、So(盘中是否有桔子,初值为0)、Sa(盘中是否有苹果,初值为0)和mutex(用于对盘子的互斥访问,初值为1)。由于只有一个盘子(相当于只有一个buffer),对盘子的互斥访问发生在对盘子的存取操作上,S、So和Sa就可以保证对盘子的互斥操作了,故mutex也可以省略。
解:设三个信号量:
S --- 盘子是否为空,初值为1;
So --- 盘中是否有桔子,初值为0;
Sa --- 盘中是否有苹果,初值为0;

Semaphore S=1, So=0, Sa=0;
Main() {
Cobegin
Father();
Son();
Daughter();
Coend
}
Father() {
While(1)  {
Wait(S);   将水果放入盘中;
If  (放入的是桔子)  Signal(So);
Else   Signal(Sa);
}
}
Son() {
While(1)  {
Wait(So);   从盘中取出桔子;Signal(S); 吃桔子;
}
}
Daughter() {
While(1)  {
Wait(Sa);   从盘中取出苹果;Signal(S); 吃苹果;
}
}



【例2】 如图7所示,有多个PUT操作同时向BUFF1放数据,有一个MOVE操作不断地将BUFF1的数据移到BUFF2,有多个GET操作不断地从BUFF2中将数据取走。BUFF1的容量为m,BUFF2的容量是n,PUT、MOVE、GET每次操作一个数据,在操作的过程中要保证数据不丢失。试用P、V原语协调PUT、MOVE的操作,并说明每个信号量的含义和初值。
 
图7  进程操作图
【分析】这里存在两个一般意义的“生产者—消费者”问题,PUT(生产者)与MOVE(消费者)之间,需要设置三个信号量;MOVE(生产者)与GET(消费者)之间,需要设置三个信号量。PUT进程套用生产者进程即可,MOVE进程只有在Buff1有新数据且Buff2有空闲区的时候才移动数据,GET进程套用消费者进程即可。
答案:设置6个信号量full1、empty1、B-M1、full2、empty2、B-M2,它们的含义和初值如下:
1)	full1表示Buff1是否有数据,初值为0;
2)	empty1表示Buff1有空间,初值为m;
3)	B-M1表示Buff1是否可操作,初值为1;
4)	Full2表示Buff2是否有数据,初值为0;
5)	Empty2表示Buff2有空间,初值为n;
6)	B-M2表示Buff2是否可操作,初值为1;
<PUT类进程>
 {
repeat
P(empty1);  /*判断Buff1是否有空间,没有则等待 */     
P(B-M1);   /*是否可操作Buff1*/
PUT;                 
V(B-M1);   /*设置Buff1可操作标志 */               
V(full1);    /*设置Buff1有数据的标志 */ 
until false 
}
<MOVE类进程>
 {
repeat
P(full1);    /*判断Buff1是否有数据,没有则等待*/
P(empty2);  /*判断Buff2是否有空间,没有则等待*/      
P(B-M1);   /*是否可操作Buff1  */
P(B-M2);   /*是否可操作Buff2  */
MOVE;                 
V(B-M1);   /*设置Buff1可操作标志*/  
V(B-M2);   /*设置Buff2可操作标志*/  
V(empty1);  /*设置Buff1有空间标志*/             
V(full2);    /*设置Buff2有数据标志*/ 
until false 
}

<GET类进程>
           {
repeat
P(full2);  /*判断Buff2是否有数据,没有则等待 */     
P(B-M2);   /*是否可操作Buff2*/
GET;                 
V(B-M2);   /*设置Buff2可操作标志 */               
V(empty2);    /*设置Buff2有空间的标志 */ 
until false
 
【例3】(8分)某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用,当营业员空闲时,通过叫号选取1位顾客,并为其服务。顾客和营业员的活动过程描述如下:
cobegin
{
   process 顾客i
   {
      从取号机获得一个号码;
      等待叫号;
      获得服务;
   }

   process 营业员
   {
      while (TRUE)
         {
            叫号;
            为顾客服务;
         }
   }
} coend

请添加必要的信号量和P、V(或wait()、signal())操作,实现上述过程中的护持与同步。要求写出完整的过程,说明信号量的含义并赋初值。               【全国统考 2011】

解:
semaphore  emptySeats:=10       //空闲座位数
semaphore  fullSeats:=0          //已占座位数
semaphore  mutex:=1            //顾客使用取号机互斥信号量

cobegin
{
   process 顾客i
   {
      wait(emptySeats);        //获取一个座位
      wait(mutex);             //占用取号机取号
从取号机获得一个号码;
signal(mutex)            //释放取号机
      signal(fullSeats)         //座位上增加一个顾客
等待叫号;
      …………
      获得服务;
signal(emptySeats);      //释放一个座位

      
   }

   process 营业员
   {
      while (TRUE)
         {
            wait(fullSeats);        //座位上减少一个顾客
            叫号;
            为顾客服务;
         }
   }
} coend
讲评:此题为生产者-消费者问题的翻版。课本上的哲学家进餐问题、生产者–消费者问题、读者–写者问题为基础性的进程同步问题,需要认真真正掌握,以此为基础用于解决其他进程同步问题。
 


1、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。
   var mutex, readcount :semaphore := 1,100;
Begin
              Parbegin
              Process Reader:begin
              repeat
              wait(readcount);
              wait(mutex);
              <填入座号和姓名完成登记>;
              signal(mutex);
<阅读>
              wait(mutex)
      			 <删除登记表中的相关表项,完成注销>
              signal(mutex);
              signal(readcount);
              until false;
              end;
              parend;
       End;
2、	有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。
var Sempty, Stiger, Spig,: semaphore:= 1,0,0;  
begin
       parbegin
              Hunter: begin
                            repeat
                                   wait(Sempty);
                                   <put tiger in cage>;
                                   signal(Stiger);
                            until false;
                       end;
              Farmer: begin
                            repeat
                                   wait(Sempty);
                                   <put pig in cage>;
                                   signal(Spig);
                            until false;
                        end;
              Zoo: begin
                            repeat
                                   wait(Stiger);
                                   <take tiger>;
                                   signal(Sempty);
                            until false;
                      end;
              Hotel: begin
                            repeat
                                   wait(Spig);
                                   <take pig>;
                                   signal(Sempty);         until false;
                       end;
              parend;
end;




3、某车站售票厅任何时刻最多可容纳20名购票者进入当售票厅中少于20名
购票者时则厅外的购票者可立即进入否则需在外面等待。若把一个购票者看
作一个进程请回答下列问题 
(1)用PV操作管理这些并发进程时应怎样定义信号量写出信号量的初值以及
信号量各种取值的含义。

定义信号量S,初值为20。当s > 0时它表示可以继续进入购票厅的人数当s = 
0时表示厅内已有20人正在购票当s < 0时|S|表示正等待进入的人数 
(2)若欲购票者最多为n个人写出信号量可能的变化范围(最大值和最小值)。 

var S:semaphore; 
S=20; 
cobegin 
	procedure P_i: 
	  begin 
		p(s); 
. 
		Enter and buy ticket; 
. 
		v(s)
	 end 
coend 
(2)最大值为20最小值为20-N。
4、在公共汽车上司机负责开车、停车和驾驶售票员负责门的开门、关
门和售票。基本操作规则是只有停车后售票员才能开门只有售票员关门后
司机才能开车。汽车初始状态处于行驶之中。当只有1个司机、2个售票员、2
个门、每个售票员负责一个门时的协调操作。请使用P、V原语实现售票员与司
机之间的协调操作说明每个信号量的含义、初值和值的范围。【燕山大学 2006
复试】
确定P、V操作的位置:
司机操作中,是否关前门没关则等待,这是一个P操作,P (Door1);是否关后门没关则等待,这是一个P操作,P (Door2);
司机操作中,设立启动标志,通知前、后门售票员可以售票,这是两个V操作,V(T1)V(T2);
司机操作中,设立停车标志,通知前、后门售票员可以开门,这是两个V操作,V(S1)V(S2);
前门售票员售票操作中,汽车是否启动没启动则等待,这是一个P操作,P(T1)。
前门售票员开门操作中,是否停车没停则等待,这是一个P操作,P(S1);
前门售票员关门操作中,设立关门标志,这是一个V操作,V(Door1);
后门售票员售票操作中,汽车是否启动没启动则等待,这是一个P操作,P(T2)。
后门售票员开门操作中,是否停车没停则等待,这是一个P操作,P(S2);
后门售票员关门操作中,设立关门标志,这是一个V操作,V(Door2);
由于汽车初始状态处于行驶之中,所以Door1=Door2=0,T1=T2=0(不严格),S1=S2=0,所有信号量的取值范围都是-11。
Semaphore Door1=Door2=1;
Semaphore S1=S2=0;
main()
{
	cobegin
	driver();busserver 1();busserver 2();
	coend
}
driver()
{ 
	P(Door1);
	p(Door2);
	启动车辆;
	正常行车;
	到站停车;
	V(S1);
	V(S2);
}
busserver 1()
{
	p(S1);
	开前门;
	关前门;
	V(Door1);
	售票;
}
busserver 2()
{
	P(S2);
	开后门;
	关后门;
	V(Door2);
	售票;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值