为了描述个和控制进程的运行,系统为每个进程定义了一数据结构——进程控制块PCB(Process Control Block)。PCB中主要包括下述四方面的信息:
进程标识符:内部标识符,外部标识符
处理机状态
进程调度信息
进程控制信息
PCB的作用:
① PCB是系统只为每个进程定义的一个数据结构,是为了使程序(含数据)能独立运行,为之配置的一进程控制块(Process Control Block);
② PCB、程序段和相关的数据段三部分构成了进程实体,创建进程,实质上是创建进程和实体中的PCB,而撤销进程,实质上是撤销进程的PCB;PCB是为了保证程序的并发执行;
③ PCB使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。
一言以蔽之,使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
新进程的创建过程
1)申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB
2)为新进程分配其运行所需的资源
3)初始化PCB
4)如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
临界区:每个进程中访问的临界资源的那段代码成为临界区。
信号量进程的同步和互斥问题
界资源与临界区的概念:临界资源就是一次只允许一个进程访问的资源,一个进程在使用临界资源的时候,另一个进程是无法访问的,操作系统也不能够中途剥夺正在使用者的使用权利,正所谓“泼出去的女儿嫁出去的水”。即临界资源是不可剥夺性资源。所谓临界区就是进程中范文临界资源的那段程序代码,注意,是程序代码,不是内存资源了,这就是临界资源与临界区的区别。临界区的使用原则(也即同步机制应遵循的准则)十六字诀:“空闲让进,忙则等待,有限等待,让权等待”。
(1)空闲让进:临界资源空闲时一定要让进程进入,不发生“互斥礼让”行为。
(2)忙则等待:临界资源正在使用时外面的进程等待。
(3)有限等待:进程等待进入临界区的时间是有限的,不会发生“饿死”的情况。
(4)让权等待:进程等待进入临界区是应该放弃CPU的使用。
进程间通常存在着两种制约关系:直接制约关系和间接制约关系,就是所说的进程的同步与互斥。顾名思义,一个是合作关系,一个是互斥关系。进程互斥说白了就是“你用的时候别人都不能用,别人用的时候,你也不能去用”,是一种源于资源共享的间接制约关系。进程同步指的是“我们大家利用一些共同的资源区,大家一起合作,完成某些事情,但是我在干某些小事的时候,可能要等到你做完另一些小事”,是一种源于相互合作的直接制约关系。两者区别在于互斥的进程间没有必然的联系,属于竞争者关系,谁竞争到资源(的使用权),谁就使用它,直到使用完才归还。就比如洗衣房的洗衣机这个资源,去洗衣的同学并不需要有必然联系,可以互不认识,但是谁竞争到洗衣机的使用权,就可以使用,直到洗完走人。而同步的进程间是有必然联系的,即使竞争到使用权,如果合作者没有发出必要的信息,该进程依然不能执行。
信号量是Dijkstra提出的用于解决进程同步的有效工具。信号量是一个数据结构以及对其的操作。除初始化外,仅能通过两个标准的原子操作wait(S)he signal(S)来访问。两个语句在执行到一半的时候不能被中断。
什么是P操作、什么是V操作(P、V操作的处理流程,以记录型信号量为例)
P(S):wait(S)
每次wait操作,意味着进程请求一个单位的该类资源,使系统可供分配的该类资源数减少一个。
① 将信号量S的值减1,即S.value:=S.value-1;
② 当S.value<0时,表示该类资源分配完毕,进程调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表中。
V(S):signal(S)
每次signal操作,表示执行进程释放一个单位资源,使系统中可供分配的该类资源数增加一个
① 将信号量S的值加1,即S.value:=S.value+1;
② 如果S.value<=0,表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将链表中的第一个等待进程唤醒。
wait(S){ while(S<=0); S--;}
signal(S){ S++; }
用信号量和P、V操作机制实现互斥和同步的方法,信号量取值的含义
利用信号量和PV操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P,V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
(2)P,V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
(3)互斥信号量得初值一般为1
其中信号量S用于互斥,初值为1。
利用信号量和P V操作实现进程同步
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
使用PV操作实现进程同步时应该注意的是:
(1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,那些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置那些信号量。
(2)信号量的初值与相应资源的数量有关,也与P,V操作在程序代码中出现的位置有关。
(3)同一信号量的P,V操作要成对出现,但他们分别在不同的进程代码中。
(4)互斥信号量一般要在资源信号量之后。
PV操作特点:简单而且表达能力强能解决任何进程同步问题,缺点:不安全,容易出现死锁现象。
进程是资源拥有者,而线程是为了提高程序并发执行的调度(调度和分派的基本单位)。