一,进程
(一),进程概念
1,进程的意义
为提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术,使多个程序同时在系统中存在并运行,在多道程序系统中,各个程序之间并发执行(并发:两个或多个事件在同一时间间隔内发生),共享系统资源,CPU需要在各个运行程序之间来回切换,采用进程便于,描述这些多道的并发活动,进程是一个正在执行的程序
2,进程组成
进程分为用户进程和系统进程
一个进程包括:
·程序的代码
·程序的数据
·PC中的值,用来指示下一条将运行的指令
·一组通用的寄存器的当前值,堆,栈
·一组系统资源
#进程 != 程序:程序是静态文本,描述语句;进程是正在执行的程序(动态),含有上下文信息
#一个程序可以对应多个进程,一个进程只能对应一个程序(即一个进程只能执行一个程序)
3,进程概念
进程是具有一定功能的程序在一个数据集合上的运行过程,它是系统进行资源分配和调度管理的一个可并发执行的基本单位
·进程是程序的一次执行
·进程是可以与其他计算并发执行的计算
·进程是一个程序及其数据在处理器上顺序执行时发生的活动
·进程是进程实体的一次活动
·进程是支持程序运行的机制
(二),进程特性
1,动态性
进程的实质是程序一次执行过程,是动态产生,动态消亡的,进程在其生命周期内,在三种基本状态之间转换
2,并发性
任何进程都可以同其他进程一起向前推进
3,独立性
进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
4,异步性
由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的,不可预知的速度向前推进
5,结构特性
为控制和管理进程,系统为每个进程设立了一个进程控制块——PCB,系统中运行的实体通常由程序,数据和一个PCB三部分组成
(三),进程状态和转换
·就绪(Ready)状态:进程一旦获得CPU就可以投入运行的状态
·执行(Running)状态:进程获得CPU正在执行的状态
·阻塞(Blocked)状态:进程由于等待资源或者某个事件的发生而暂停执行的状态
(四),进程的组成
1,程序
2,数据
3,进程控制块(PCB)
·一个进程只有一个PCB
·PCB是进程存在与否的唯一标记
PCB中的基本信息有:描述信息和管理信息
·进程状态标识信息
·进程状态
·进程特征
·进程位置及大小信息
·处理器现场保留区
·进程资源清单
·进程同步与通信机制
·进程间联系
(五),进程队列
1,线性方式
2,链接方式
3,索引方式
(六),进程控制
1,进程控制的主要任务
控制系统中所有进程从产生,存在,到消亡的全过程,进程控制一般由操作系统内核来实现,内核在执行操作时,是通过原语(操作系统内核中用于完成特定功能的一个过程,此过程在执行过程中呈原子特征,不可中断)来进行的
2,进程控制原语
·进程创建原语
·进程撤销原语
·阻塞原语
·唤醒原语
(1),进程创建的主要过程
a,创建一个PCB
b,赋予一个统一的进程标识符
c,为进程映像分配空间
d,初始化进程控制块(许多默认值,如:状态为new,无I/O设备或文件等)
e,设置相应链接(如:把新进程加到就绪队列的链表中)
创建原语的实现过程
(2),引起撤销的原因
·正常结束
·异常结束(越界错,保护错,特权指令错,非法指令,运行超时,I/O故障等)
·外界干预(操作员干预,死锁,父进程请子进程终止)
撤销原语的实现过程
(3),进程阻塞原语
·停止调用进程的执行变为等待
·入口信息:可省
阻塞原语的实现过程
(4),进程唤醒原语
·功能:唤醒某一处于等待队列当中的进程
·入口信息:被唤醒进程的名字
·引起唤醒的原因:系统服务得不到满足,I/O完成,新数据到达,进程提出新请求(服务)
唤醒原语的实现过程
二,线程
(一),线程引入
1,进程的两个基本属性
·资源的拥有者:给每个进程分配一虚拟地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态,优先级,调度
·调度单位:进程是一个执行轨迹
2,对进程系统必须完成的操作
·创建进程
·撤销进程
·进程切换
3,线程概念
由于进程时间空间开销大,限制并发度的提高,引入线程
·线程是进程中实施调度和分派的基本单位
·线程优势:响应度高,资源共享,经济,效能高
4,线程状态
·运行状态
·阻塞状态
·就绪状态
·终止状态
5,线程管理
·线程创建
·线程终止
·线程等待
·线程让权
6,线程和进程的关系
·一个进程对应多个线程活动;一个线程只能在一个进程的地址空间内活动
·资源分配给进程;同一进程的线程共享资源
·CPU分配给线程
·线程在执行过程中需要协作同步;不同进程则利用通信实现同步
7,线程的实现
·用户级线程与核心级线程
·用户级线程与核心级线程的比较
8,线程池
·定义:将多个线程放在一个池中
·优势:服务更快,限定了线程的数量
·设计原则:CPU数量,物理内存容量,并发用户数量
三,同步
(一),进程同步和进程间通信
1,进程间相互关系
·同步:同步是指一组相互协同的进程,在完成同一任务,对某些共享资源进行操作时,为协调资源占用而相互等待,相互交换信息所产生的制约关系
·互斥:互斥是指并发进程间因相互竞争使用独占资源所产生的制约关系
·通信:进程间交换信息称为通信
2,临界资源与临界区
·临界资源:一次只能允许一个进程使用的资源
·临界区:每个进程中访问或者使用临界资源的代码称为临界区
·进程的通用结构:
Repeat
entry section 进入区
critical section 临界区
exit section 退出区
remainder section 剩余区
3,使用临界区的规则
·空闲让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入
·忙则等待:不允许两个以上的进程同时进入互斥区
·有限等待:任何进入互斥区的要求应该在有限时间内得到满足
·让权等待:处于等待状态的进程应放弃占用CPU,以使其他进程有机会得到CPU的使用权
(二),互斥的实现方式
解决进程互斥进入临界区有两种方式:
·硬件解决方式:禁止中断,专用机器指令
·软件算法实现:进入区,退出区,剩余区
四,信号量
(一),整型信号量
1,性质
(1),信号量可以初始为一个非负值
(2),只能由P和V操作来访问信号量
·P操作:测试;DOWN操作
·V操作:增加;UP操作
·P(S): while S<= 0 do no-op;
S:= S-1;
·V(S):S:= S+1;
·进程Pi利用信号量实现伪代码形式:信号量为mutex,并初始化为1
do{
P(mutex)
临界区(Critical Section)
V(mutex)
剩余区(remainder sdction)
}while(1);
(二),记录型信号量
为解决忙等待问题引入记录型信号量
1,定义
由两个成员组成的数据结构,其中一个成员是整型变量,表示该信号量的值;另一个是指向PCB的指针。当多个进程都要等待同一信号量时,它们就排成一个队列,由信号量的指针项指示该队列的队首,进程控制块PCB是通过PCB自身所包含的指针项进行链接的,最后一个PCB(队尾)的链接指针为0。
2,使用
信号量被描述为一个记录(或者结构)
记录型信号量值和相应资源有关
·大于0:表示当前可用资源数量
·小于0:绝对值表示等待进程个数
·P(S)操作
Void P(S){
S.value --;
if(S.value <0){
将这个进程加到S.list队列;
block();
}
}
·V(S)操作
Void V(S){
S.value ++;
if(S.value <= 0)
从S.list队列中将Q移走;
wakeup(Q);
}
}
(三),信号量的应用
1,用信号量实现进程的互斥
·设置一个互斥信号量mutex,其初值为1。P1(分配进程)和P0(释放进程)的临界区代码可描述为:
2,用信号量实现进程间同步
例:短信缓冲池的同步使用
规定S1和S2的初值分别为1和0,对缓冲池的供者进程和取者进程的同步关系用下述方式实现:
3,信号量还可以描述程序或语句之前的前驱关系
Var a, b, c, d, e, f, g: semaphore: = 0, 0, 0, 0, 0, 0, 0, 0
begin
parbegin
begin S1; V(a); V(b); end;
begin P(a); S2; V(c); V(d); end;
begin P(b); S3; V(e); end;
begin P(c); S4; V(f); end;
begin P(d); S5;V(g); end;
begin P(e); P(f); P(g); S6; end;
parend
end
(四),经典同步问题
1,生产者消费者问题
描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息
·同步
·互斥
·问题限制
缓冲池中有n个缓冲区,每个缓冲区存放一个消息,可利用互斥信号量mutex使各进程对缓冲池实现互斥访问;利用empty 和full 两个计数信号量分别表示空缓冲及满缓冲的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者可以将消息送入缓冲池;只要缓冲池未空,消费者可以从缓冲池取走一个消息。
·生产者进程(Producer)
while(true){
P(empty);
P(mutex);
产品放入缓冲区buffer(in);
in = (in +1)mod N; #以N为模
V(mutex);
V(full);
}
消费者进程(Consumer)
while(true){
P(full);
P(mutex);
缓冲区取出一产品buffer(out);
out = (out+1) mod N; #以N为模
V(mutex);
V(empty);
}
注意:1,每个进程先执行P操作,后执行V操作
2,同步信号量的PV操作要成对出现;应该在不同的进程中;
3,两个进程的P操作次序不能颠倒
2,读者写者问题
·两组并发线程:读者和写者共享一组数据区
·要求:可以有多个读者同时进行读操作,读者写者操作不能同时进行,不允许多个写者同时操作。
·分析:如果读者来:
(1)无读者,写者,新读者读
(2)有写者等,其他读者读,新读者也可以读
(3)有写者写,新读者等
如果写者来:
(1)无读者,新写者写
(2)有读者,新写者等·
(3)有其他写者,新写者等
int readcount = 0 #读者计数器,整型变量,初值为0
int rmutex = 1 #读互斥信号量,用于进程互斥访问readcount,初值为1
int wmutex = 1 #写互斥信号量,用于保证一个写者与其他用户互斥地访问共享资源,初值为1
#读者
while(true){
P(rmutex)
readcount++;
if readcount == 1:
P(wmutex)
V(rmutex)
P(rmutex) #读
readcount --;
if readcount == 0:
V(wmutex)
V(rmutex)
}
#写者
while(true){
P(wmutex)
V(wmutex) #写
}
3,理发师问题
问题描述:理发店里有一位理发师,N张椅子,无顾客时理发师在椅子上休息,顾客来到理发店时,需要叫醒理发师,理发师在理发时顾客到店则在椅子上休息,若椅子不足,则顾客离开
int waiting = 0 #记录等候理发的顾客数,初值为0
int customers = 0 #记录等候理发的顾客数(不包括正在理发店顾客),并用作阻塞理发师进程,#初值为0
int barbers = 0 #记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0
int mutex = 1 #用于互斥,初值为1
Procedure barber{
while(true) #理完一人,是否还有顾客
P(customers) #若无顾客理发师休息
P(mutex) #进程互斥
waiting = waiting-1 #等候顾客数少一个
V(barbers) #理发师去为一个顾客理发
V(mutex) #退出临界区
cut_hair #正在理发
}
Procedure customer{
P(mutex) #进程互斥
if(waiting<chairs){
waiting = waiting +1 #等待顾客数加一
V(customers) #必要的话唤醒理发师
V(mutex) #退出临界区
P(barbers) #无理发师,顾客坐椅子等待
get_haircut() #顾客理发
}else
V(mutex)#无椅子顾客离开
}
(五),信号量,P,V原语小结
对信号量和P,V原语的使用,可以归纳为三种情形:
1,把信号量视为一个加锁标志位,其目的是为了实现对某个唯一的共享数据的互斥访问,如数据库中的某个记录,各个进程间的某个共享变量。该共享数据的取值与信号量本身的取值并没有什么直接关系,信号量的作用仅仅是作为一个加锁标志位,其特征是信号量的初始值为1,然后在一个进程内部对它进行配对的P,V操
P(mutex); // mutex的初始值为1
访问该共享数据
V(mutex);
非临界区
2,把信号量视为是某种类型的共享资源的剩余个数,其目的是为了实现对这种类型的共享资源的访问,如各种I/O设备。信号量的取值具有实际的意义,就等于空闲资源的个数,多个进程可以同时使用这种类型的资源,直到所有空闲资源均已用完。其特征是信号量的初始值为N(N>1),然后在一个进程内部对它进行配对的PV操作
P(resource) //resource初始值为1
使用资源
V(resource)
非临界区
3,把信号量作为进程间同步的工具,利用它来设定两个进程在运行时的先后顺序,比如说,它可以是某个共享资源的当前个数,但是由一个进程负责生成该资源,而另一个进程负责消费该资源,由此引发了两个进程之间的先后顺序。其特征是信号量的初始值为N,(N>0),然后在一个进程里面对它使用V原语,减少资源个数,从而实现两个进程之间的同步关系。