定义
进程的典型定义:进程是程序的一次动态执行
进程在传统OS中的定义: 进程是进程实体的运行过程,是系统进行资源分配和调度的独立单位.
一般情况下,我们所说的进程实体(也叫进程映像)简称进程,进程实体包括程序段,数据段和进程控制块(PCB).
PCB
创建进程的实质就是创建PCB,撤销进程实质也是撤销PCB.
PCB作用:作为独立运行的基本标志, 实现间断性运行方式, 提供进程管理需要的信息,提供进程调度需要的信息, 与其他进程通信
PCB包含的信息
1.进程标识符:外部标识符,内部标识符
2.处理机状态:通用寄存器, 指令计数器, 程序状态字, 用户栈指针
3.进程调度信息:进程状态, 进程优先级, 进程调度的其他信息, 事件
4.进程控制信息:程序和数据地址, 进程同步和通信机制, 资源清单,链接指针
进程控制块的组织方式:线性方式, 链接方式, 索引方式
线性方式:所有的PCB都组织在一张线性表中
链接方式:具有相同状态的PCB通过PCB中的链接字链接成一个队列.
索引方式:系统根据进程状态建立几张索引表.
进程的特征
动态性:有创建而产生,由调度而执行,由撤销而消亡.程序只是一组有序指令的集合
并发性:多个进程实体在内存中,且在一段时间内同时运行.程序没有建立PCB所以不能并发执行,只能顺序执行
独立性:进程是一个能独立运行,独立获得资源和独立就收调度的进本单位.
异步性:进程按各自独立的, 不可预知的速度运行.
进程的状态与转换
三个基本状态:
就绪状态:只要获得cpu就可以立即执行
执行状态:已获得cpu正在执行
阻塞状态:因发生某些事件(I/O请求等)放弃cpu而暂停执行.
引入挂起
原因:终端用户的需要, 父进程请求, 负荷调节, 操作系统的需要
状态转换:
进程控制
引起创建进程的事件:用户登录, 作业调度, 提供服务, 应用请求
创建进程
1.申请空白PCB
2.为新进程分配所需资源
3.初始化进程控制块PCB
4.新进程插入就绪队列
引起进程终止的事件:正常结束, 异常结束(越界错, 保护错, 非法指令, 运行超时等), 外界干预
终止进程
1.找到该进程的PCB
2.终止进程及其子孙进程
3.回收该进程所占资源
4.移出进程所在队列
引起进程阻塞和唤醒的事件:向系统请求共享资源失败, 等待某种操作的完成, 新数据尚未到达, 等待新任务的到达.
阻塞进程
1.停止执行进程(失去cpu)
2.改变进程状态
3.插入阻塞队列
唤醒进程:
1.移除阻塞队列
2.检查并改变进程状态
3.插入就绪队列
挂起进程:
1.改变进程转态
2.赋值进程PCB到指定内存
3.若挂起进程正在执行则重新调度
激活进程:
1.将进程从外存调入内存
2.检查并改变进程状态
进程同步
并发进程在执行次序上的协调,以达到有效的资源共享和相互合作,使程序执行有可再现性
进程间可能存在的制约关系:间接制约(并发进程互斥的访问临界资源), 直接制约(进程需相互合作执行)
临界资源:一次只允许一个进程访问
临界区:进程中访问临界资源的代码称为临界区
进入区:检查临界资源是否正被访问的代码
退出去:检查临界资源是否访问完毕的代码
实现临界区互斥的基本方法
软件方法:信号量,管程(遵循原则:空闲让进, 忙则等待, 有限等待, 让权等待)
硬件方法:关闭中断,硬件指令(TS, Swap)
信号量机制
整型信号量
wait(S){
while(S<=0);
S--;
}
signal(S){
S++;
}
记录型信号量
typedef struct{
int value;
struct process_control_block *list;
}semaphore;
wait(semaphore *S){
S->value--;
if(S->value<0)block(S->list);
}
signal(semapohre *S){
S->value++;
if(S->value<=0)wakeup(S->list);
}
AND型信号量
一次性全部分配
Swait(S1, S2, …, Sn)?
if Si≥1 and … and Sn≥1 then?
for i∶ =1 to n do?
Si∶=Si-1;?
endfor?
else
place the process in the waiting queue associated with the first Si found with Si<1, and set the program count of this process to the beginning of Swait operation
endif
Ssignal(S1, S2, …, Sn)
for i∶ = 1 to n do
Si=Si+1;
Remove all the process waiting in the queue associated with Si into the ready queue.
endfor;
信号量集
(S:信号量, d:需求值, t:下限值, t>=d)
Swait(S1, t1, d1, …, Sn, tn, dn)
if Si≥t1 and … and Sn≥tn then
for i∶=1 to n do
Si∶=Si-di;
endfor
else
Place the executing process in the waiting queue of the first Si with Si<ti and set its program counter to the beginning of the Swait Operation.
endif
signal(S1, d1, …, Sn, dn)
for i∶=1 to n do
Si ∶=Si+di;
Remove all the process waiting in the queue associated with Si into the ready queue
endfor;
经典的进程同步问题
由进程同步而引起的一些经典的进程同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)可以在我的另一篇文章中查看.
管程
管程 (英语:Monitors,也称为监视器) 是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量.
代表共享资源的数据结构以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序共同构成了一个操作系统的资源管理模块,我们称之为管程.
由定义, 管程由四部分组成:
1.管程的名称;
2.局部于管程内部的共享数据结构说明;
3.对该数据结构进行操作的一组过程;
4.对局部于管程内部的共享数据设置初始值的语句
(维基百科)一个管程包含:
多个彼此可以交互并共用资源的线程
多个与资源使用有关的变量
一个互斥锁
一个用来避免竞态条件的不变量
管程特