第二章进程管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1046765624/article/details/84673029

前序:

1.关于程序执行顺序

1)引入前趋图

前趋图是有向无循环图(DAG),是一个拓扑图。就像入下图所示。

程序的执行顺序要按照箭头方向来。

2)程序顺序执行时的特征


(1) 顺序性
    处理机的操作严格按程序规定顺序执行
(2) 封闭性
    程序一旦开始执行,其计算结果不受外界因素影响。
(3) 可再现性
    程序执行只要初始条件一样,不论如何停顿,重复执行多少次结果都一样。

3)程序的并发执行分析


1.要符合前趋关系:
2.并发不是随意的

4)并发提高效率但并发也带来问题

多个程序如果无序并发,得到的只能是混乱的执行结果,
多道程序运行,走走停停的可能顺序有很多种,符合前趋图的关系才是合理并发。

5)并发程序执行时的特征


间断性(运行表现):相互制约导致并发程序具有“执行——暂停——执行”这种间断性的活动规律。
失去封闭性:共享资源,资源状态由多道程序改变,程序运行失去封闭性。即程序运行受其他程序的影响。
结果不可再现性:结果不确定,程序执行将没有任何意义。

正文

1.进程

1)进程的定义


进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
*可并发执行的程序在一个数据集合上的一次执行过程。
*程序的一次执行
*是一个程序与其数据一道通过处理机的执行所发生的活动。


2)进程的特征


结构性特征,进程的根本——PCB
动态性
进程实质上是进程实体的一次有生命期的执行过程。程序只是静态的一组有序指令。
进程最基本特征
并发性
多个进程实体同存于内存中,在一段时间内同时运行。
有PCB的程序才能并发。
独立性
异步性


3)进程的基本状态


(1)就绪状态(Ready)
      进程获得除CPU之外的所有必需资源,一旦得到CPU控制权,可立即运行。
(2)运行状态(Running)
      进程已获得所有运行必需的资源,正在处理机上执行。
(3)阻塞状态(Blocked)
      正在执行的进程由于发生某事件(请求I/O、申请缓冲、时间片到)而暂时无法执行时,便放弃CPU后暂停
(4)不少系统除上述三种状态,还有其他一些细节状态:挂起、新建、终止状态等。

* 挂起状态 *


就绪的、但不会被调度执行
产生原因
用户自己请求暂停
父进程检查、协调子进程时挂起子进程
调节负荷的需要,负载过重,为保证实时任务的控制,挂起一些不重要的进程
操作系统的检查和记录需要挂起进程。

2.  进程控制块PCB

1)进程控制块中的信息(pcb内)

(1)进程标识符信息 
每个进程都必须有一个唯一的标识符
内部标示符:唯一的数字序号,方便系统使用
外部标示符:方便用户使用,用户进程访问某进程时使用
(2)处理机状态信息
主要由处理机的各种寄存器中的内容组成,被中断时这些信息要存放到PCB。
通用寄存器:用户程序访问的,暂存信息
指令计数器:下一条指令地址
程序状态字PSW:一些状态信息
用户栈指针:每个用户进程都有的存放过程和系统调用参数及调用地址的一组系统栈。

(3)进程调度信息
进程状态
进程优先级
进程调度所需的其他信息:调度算法相关信息
事件:状态转换有关的事件
(4)进程控制信息
程序和数据的地址(单个进程)
数据所在的内外存地址
进程同步和通信机制(多进程间)
同步和通信机制的信号量、消息队列指针等
资源清单
链接指针(PCB的组织)
本PCB所在队列的下一个进程PCB首地址。


2)PCB信息的存放


系统运行中有若干个程序的PCB,它们常驻内存的PCB区。
采用的数据结构:PCB结构体,PCB链表或队列


3)PCB的组织方式


系统中存在数十个PCB,如何有效的管理它们。
链接方式
同一状态的PCB,依靠链接指针链接成队列。就绪队列;若干个阻塞队列;空白队列(PCB区的空PCB块)
索引方式
同状态的PCB同样集中记录,但以索引表的方式记录PCB的地址。用专门的单元记录各索引表的首地址。

3.1进程控制


1.进程的创建

1)一个进程创建另一进程的事件(原因)


用户登录:分时情况下用户的请求
作业调度:批处理中
提供服务:运行中的用户程序提出功能请求,要创建服务进程(如打印服务)
应用请求:应用程序自己创建进程,完成特定功能的新进程。(木马程序)


2)创建过程


(1) 申请空白PCB
(2) 为新进程分配资源
        主要是内存资源的处理
(3) 初始化进程控制块
        标识符(包括父进程的)、程序计数器指向程序入口地址,就绪态、优先级等信息的填写。
(4) 将新进程插入就绪队列


2.进程的终止


1)引起进程终止的事件


正常结束
异常结束
内存越界错误
保护错(权限错,如修改只读文件等)
非法指令(不存在的指令,程序异常转向而把数据当指令)
特权指令错(用户态程序试图执行只有OS可执行的指令)
运行超时、运算错、i/o故障等
外界干预
操作员或操作系统干预(死锁时,可人为结束)
父进程请求终止子进程
父进程终止,子孙进程也跟着终止


2)终止过程


对上述事件,OS调用内核终止原语,执行下列过程:
(1) 根据进程标示符,检索出该进程PCB,读其状态。
    *IF 执行态,立即终止该进程,置调度标志为真,指示重新进行调度。
    *IF 有子孙进程,亦应予以终止,以防成为不可控进程。
(2) 归还全部资源至其父进程或系统。
(3) 将该进程PCB从所在队列或链表中移出。


3.进程的阻塞与唤醒


1)引起进程阻塞和唤醒的事件


请求系统服务的满足情况
启动某种需等待(I/O)操作
合作需要的新数据尚未到达
执行某功能的进程暂时无新工作可做(如发送数据进程)


2)阻塞和唤醒过程


由进程调用阻塞原语阻塞自己,是主动行为:
(1)将PCB中的状态改为阻塞
(2)该PCB加入到阻塞队列中
(3)转进程调度,将处理机分配给另一进程
(4)进行进程切换,即根据两切换进程的PCB,保护与重新设置处理机状态


阻塞与唤醒原语作用相反,成对使用


(1)把阻塞进程从等待该事件的阻塞队列中移出
(2)将其PCB中的现行状态改为就绪
(3)将PCB插入到就绪队列中。


4.进程的挂起与激活


(1)检查被挂起进程的状态,活动就绪则改为静止就绪,活动阻塞则改为静止阻塞
(2)将该PCB复制到内存(方便检查)/外存(对换)指定区域
(3)*若挂起的进程是执行态,则需重新进行进程调度。

2.2 进程同步


两种制约关系:
间接相互制约关系:主要源于资源共享,表现为
进程A---打印机资源---进程B(互斥)
直接相互制约关系:主要源于进程合作,表现为
进程A写缓冲---进程B读缓冲(有序)


1)进程同步的主要任务:


         使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性.


2)临界资源


一次仅允许一个进程使用的资源。
互斥:在操作系统中,当一个进程进入临界区使用临界资源时,另一个进程必须等待,直到占用临界资源的进程退出临界区,我们称进程之间的这种相互制约关系为“互斥”。
同步:多个相互合作的进程,在一些关键点上可能需要互相等待或互相交换信息,这种相互制约关系称为进程同步关系。可理解为“有序”。


3)临界区


每个进程中访问临界资源的那段代码叫临界区。
为了正确同步,对临界区的代码要增加控制


4)同步机制应遵循的规则


实现互斥的方法应符合如下每条原则
空闲让进:资源使用最基本原则
忙则等待:保证互斥
有限等待:合适时被唤醒防止死等
让权等待:能主动释放CPU防止忙等


2.信号量机制

1) 整型信号量


信号量定义为一个整型量;
根据初始情况赋相应的值;
仅能通过两个原子操作来访问。


2)记录型信号量


整型信号量符合“有限等待”原则 signal释放资源后,当CPU被分配给等待进程后,等待进程仍可继续执行,可以符合“有限等待”。 但整型信号量不符合“让权等待”原则 整型信号量的wait操作,当s ≤0时,当前进程会占着CPU不断测试; 信号量原语不能被打断,这个占有CPU的进程会一直不断的占据CPU循环下去,陷入忙等。

* 信号量结构信息发生变化
不仅要有值的处理,还有队列的处理。 此时形成记录型数据结构,包括两部分: 整型变量value(代表资源数目) 进程链表L(链接所有等待进程)

3)信号量的基本应用


互斥信号量注意点:
互斥信号量mutex初值为1; 每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间 必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏: 遗漏P原语则不能保证互斥访问 遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程);
实现有序
前趋关系:     并发执行的进程P1和P2中,分别有代码C1和C2,要求C1要在C2开始前完成; 为每对前趋关系设置一个同步信号量S12,并赋初值为0。则只有V操作所在进程获得cpu时能运行


控制同步顺序的注意点


信号量值为0的点是限制的关键所在; 成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步顺序出错。


5)信号量集


引入原因: 每次只能获得或释放一个单位的资源,低效;

某些时候资源分配有下限的限制;

修改:在大于可分配设置的下界值t前提下,每次可分配d个

2.3 经典进程同步问题

1. 生产者—消费者问题

The proceducer – consumer problem:多个生产者和消费者对n个缓冲区的使用。
不考虑互斥、同步问题会导致counter计数错误
如何设置信号量?从资源、顺序两个角度分析:

无论生产者、消费者使用缓冲池时应保证互斥使用(互斥信号量mutex )
生产者和消费者间交叉有序:
有序的控制最根源在产品数量上。
设置两个信号量:分别针对生产者、消费者设置不同的信号量,empty和full分别表示缓冲池中空缓冲池和满缓冲池(即产品)的数量。

empty、full两者有天然的数量关系,在PV控制下值不断变化,但在值等于0的点上是控制顺序的关键。

producer :
repeat

produce an item in nexp;

wait(empty);
wait(mutex);
buffer(in):=nexp;
in:=(in+1) mod n;
signal(mutex);
signal(full);
until  false; 

consumer :
repeat
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
consume the item in nexc;                        
until  false;   

1)记录型信号量解决哲学家进餐问题


筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。
    Var chopstick: array [0, …, 4] of semaphore;
    所有信号量均被初始化为1。

第i 位哲学家的活动可描述为:
repeat
          wait(chopstick[ i ]);
          wait(chopstick[ ( i +1) mod 5] );
     …
     eat;
     …
          signal(chopstick[ i ]);
          signal(chopstick[ ( i +1) mod 5] );
     …
     think;
until  false;


2)就餐死锁问题


假如五位哲学家同时饥饿而各自拿起左边的筷子时,就会使五个信号量chopstick均为0,当他们再试图去拿右边的筷子时,都将因无筷子可拿而无限等待。

一刀切:仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐。---采用AND信号量。

在哲学家进餐问题中,要求每个哲学家先获得两个临界资源(筷子)后方能进餐。
Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1);
Process i
     repeat
         think;
         Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
         eat;
         Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] );     
     until  false;

3. 读者——写者问题


一个数据文件被多个进程共享。Reader进程只要求读文件,Writer进程要求写入内容。
合理的同步关系是:
多个读进程可同时读;
Writer进程与任何其他进程(包括Reader进程或其他Writer进程)不允许同时访问文件。

如何设置互斥信号量?
所有进程都对一个互斥信号量m进行操作?
不符合读者之间不需要互斥的要求。

写者操作要和其他的都互斥,所以必要判断互斥信号量,
没有变化:
Writer :
while(true){
   wait(wmutex);
   写入文件;
   signal(wmutex);
}
只有第一个读进程进行互斥判断;
只要有一个“读进程”在读就不释放,“写进程”就不能写。(一种读者优先的方式)

解决读者问题的关键:除第1读者,其他读者不申请读写互斥信号量,防止读者间互斥
while(true){

   wait(rmutex);
   if Readcount=0  wait(wmutex);

    Readcount =Readcount +1;
    signal(rmutex);

   …
   perform read operation;
   …
   wait(rmutex);

   Readcount =Readcount -1;
   if Readcount=0 signal(wmutex);
   signal(rmutex);

}

类似问题


单行问题


同向不互斥,异向互斥


船闸问题


同闸航道不互斥,不同闸的互斥

2.4管程(monitor)机制

1973年,Hoare和Hanson提出管程思想:
    将共享变量及对共享变量能够进行的所有操作集中在一个模块中。
(把信号量及其操作原语“封装”在一个对象内部)    


1.管程的组成


一组局部变量
对局部变量操作的一组过程
对局部变量进行初始化的语句。
(联想面向对象中的类)


2.管程特点


任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;
就如同使用临界资源,就要先通过其信号量的申请。
任何时刻,仅允许一个进程在管程中执行某个内部过程。
管程如何实现同步?
对共享变量互斥操作:
        管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量。
管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确。
操作的同步控制:
靠条件变量的操作管理实现。
进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行


3.条件变量


(主要作用就是进程同步的阻塞和唤醒控制)
局部于管程的变量有两种:
普通变量
条件变量(用于控制进程阻塞和唤醒)
类似信号量变量,但不取具体值;相当于每个阻塞队列的队列指针。
对条件变量的操作需结合对普通变量的条件判断,从而控制进程状态。


管程的优点


保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。
管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性
引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。


管程的缺点


大多数常用的编程语言中没有实现管程,如果某种语言本身不支持管程,那么加入管程是很困难的。
虽然大多数编程语言也没有实现信号量,但可将P、V操作作为一个独立的子例程或操作系统的管理程序调用加入

2.5进程通信

进程通信是指进程之间的信息交换。


1.进程通信的类型


高级通信机制可归结为四大类
共享存储器系统(操作存储区方式)
2消息传递系统(发--收方式)
3管道通信(中间文件方式)
4Client-Server system
套接字(Socket)
一个套接字就是一个通信标识类型的数据结构,包含了通信目的的地址,端口号,传输层协议、进程所在的网络地址,以及针对C\S程序提供的不同系统调用(API函数)等。
系统中所有的连接都持有唯一的一对套接字及端口连接,从而方便地区分来自不同应用程序进程或网络连接的通信,确保通信双方间逻辑链路的唯一性。

2.消息传递通信的实现方法


1)直接通信方式
发送进程利用OS所提供的发送命令(原语),直接把消息发送给目标进程。此时,发送进程和接收进程都以显式方式提供对方的标识符。通常利用系统通信命令(原语)
2)间接通信方式
基于共享数据结构的实体用来暂存发送给目标进程的消息;接收进程则从该实体中,取出对方发送给自己的消息。通常把这种实体称为信箱。消息在信箱中可以安全地保存,只允许核准的目标用户随时读取。既可实时通信,又可非实时通信。


3.消息传递系统的实现


1通信链路的建立
2消息格式
3同步方式


4.消息缓冲队列通信机制


1不需管理链路
2定义简单数据结构(亦即消息格式)
3实现发送和接收的操作原语

一、认识线程


1.线程的引入


多道程序管理:追求效率的目的下实现“并发”
进程内的一条执行路径
多线程系统中,同一个进程中的多个线程
共享进程资源
可并发执行


2.线程的属性


多线程OS中,一个进程包括多个线程,每个线程都是利用CPU的基本单位。
轻型实体:只需一点必不可少的、能保证独立运行的资源。(TCB)
独立调度和分派的基本单位:调度切换迅速且开销小。
可并发执行
共享进程资源:同进程中的线程可共享相同的进程地址空间、已打开文件、信号量机构等。

3.线程的信息


(TCB管理什么信息?)
状态参数
标识符、运行状态、优先级、寄存器状态、堆栈、专有存储器、信号屏蔽等。
运行状态
执行、就绪、阻塞


4. 线程的创建和终止


在多线程OS中,应用程序启动时,通常只有一个线程(初始化线程)在执行,它根据需要再创建若干线程。
创建新线程
利用线程创建函数(或系统调用),提供相应参数。线程创建函数执行完后,返回一个线程标识符供以后使用。
线程被终止:
不立即释放资源,只有当进程中的其它线程执行分离函数后,资源才分离出来能被其它线程利用。
被终止而未释放资源的线程仍可被需要它的线程调用,使其重新恢复运行。
 

猜你喜欢

转载自blog.csdn.net/a1046765624/article/details/84673029