一、进程管理
1、进程管理之进程实体
1)为什么需要进程
在没有进程出现时:
- 没有配置OS之前,资源属于当前运行的程序
- 配置OS之后,引入多道程序设计的理念
- 使用进程可以合理的隔离资源、运行环境,提升资源利用率
为什么需要进程(在多道程序技术的基础上):
- 进程是系统进行资源分配和调度的基本单位
- 进程作为程序独立运行的载体保障程序正常执行
- 进程的存在使得操作系统资源的利用率大幅提升
2)进程的实体
i、主存中的进程形态
在主存中进程是连续存储的空间–进程控制块
进程控制块中的内容有:
进程标识符、处理机状态、进程调度信息、进程控制信息。
a、 进程控制块存储的内容:
标识符 |
---|
状态 |
优先级 |
程序计数器 |
内存指针 |
上下文数据 |
IO状态信息 |
记账信息 |
…… |
- 标识符:唯一标记一个进程,用于区别其他进程
- 状态:标记进程的进程状态,如:运行态
- 程序计数器:指向进程即将要执行的下一条指令的地址
- 内存指针:指向程序代码、进程数据的相关指针
- 上下文数据:进程执行时处理器存储的数据
- IO状态信息:被进程IO操作所占用的文件列表
- 记账信息:存储进程使用处理器的时间、时钟数总和等
b、进程控制块PCB
- 用于描述和控制进程运行的通用数据结构
- 记录进程当前状态和控制进程运行的全部信息
- PCB使得进程是能够独立运行的基本单位
- PCB是操作系统进行调度经常会被读取的信息
- PCB是常驻内存的,因此存放在系统专门开辟的PCB区域内
ii、进程与线程
a、线程
- 线程是操作系统进行运行调度的最小单位(进程是系统进行资源分配和调度的基本单位)
- 包含在进程之中,是进程中实际运行工作的单位
- 一个进程可以并发多个线程,每个线程执行不同的任务
b、线程与进程
进程的线程共享进程资源
进程(process) ,线程(Thread)
总结:
进程 | 线程 | |
---|---|---|
资源 | 资源分配的基本单位 | 不拥有资源 |
调度 | 独立调度的基本单位 | 独立调度的最小单位 |
系统开销 | 进程系统开销大 | 线程系统开销小 |
通信 | 进程间的通信 | 读写同一进程数据通信 |
2、进程管理之五状态模型
1)简述
创建、就绪、阻塞、执行、终止
2)就绪状态
- 当进程被分配到除CPU以外所有必要的资源后
- 只要再获得CPU的使用权,就可以立即运行
- 其他资源都准备号、只差CPU资源的状态为就绪状态
- 在一个系统中多个处于就绪状态的进程通常排成一个队列—就绪队列
3)执行状态
- 进程获得CPU,其程序正在执行称为执行状态
- 在单处理机中,在某个时刻只能有一个进程处于执行状态
4)阻塞状态
- 进程因某种原因如:其他设备未就绪而无法继续执行
- 从而放弃CPU的状态称为阻塞状态
- 阻塞队列:存放被阻塞的进程,可能有一个或多个
5)状态间的切换(就绪、执行、阻塞之间)
进程调度:当进程发生进程调度时,就可以获取到CPU的资源
时间片用完:分配给某个进程使用CPU的时间用完了
IO请求:当需要IO设备资源,但是不能马上满足时
IO完成:IO请求被满足时
6)创建状态
- 分配PCB(进程控制块)
- 插入就绪队列
创建进程时拥有PCB但其他资源尚未就绪的状态称为创建状态
操作系统提供fork函数接口创建进程
7)终止状态
- 系统清理
- PCB归还
进程结束由系统清理或者归还PAB的状态称为终止状态
8)进程的五状态模型
3、进程管理之进程同步
1)为什么需要进程间同步
i、生产者-消费者问题
有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者进程可以并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程需要将所生产的产品放到一个缓冲区中,消费者进程可以从缓冲区中取走产品消费
在生活中这种模型没有问题:
- 生产者往缓冲区 + 1
- 消费者往缓冲区 - 1
在计算机中这种模型存在问题:
- 缓冲是在Cache上的
- 操作缓冲(临界资源)需要三个步骤(count当作仓库,register当作生产者或者消费者)
- register=count:将缓存中的数据取出放在寄存器中
- register=register+1(register=register-1) :在CPU的寄存器中生产了一个产品
- count=register:将register放回缓存中
- 单从生产者程序或消费者程序是没问题的
- 但两者并发执行时就可能出错
- 举例说明:红色为生产者和缓冲区,蓝色为消费者和缓冲区
可以看到,最开始时缓冲区为10,过程中,生产者生产了一个,消费者消费了一个,最后应该仍为10,但是结果却是11
- 举例说明:红色为生产者和缓冲区,蓝色为消费者和缓冲区
这里缓冲区就是临界资源
ii、哲学家进餐问题
有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共同使用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子。平时哲学家们只进行思考,饥饿时则试图取靠近他们的左、右两支侉子,只有两支筷子都被他拿到的时候就能就餐,进餐完毕之后,放下左右筷子继续思考
问题:
这里的筷子就是临界资源
iii、由两个问题引发
- 出现上述两个问题的根源是:彼此相互之间没有通信
- 在生产者-消费者问题中,“如果生产者通知消费者我已经完成一件生产”,就不会发生错误
- 在哲学家就餐问题中,“如果哲学家向旁边哲学家说我要进餐了”,就不会都饿死
- 因此就需要进程间的同步
iv、为什么需要进程间的同步
- 对竞争资源在多进程间进行使用次序的协调
- 使得并发执行的多个进程之间可以有效使用资源和相互合作
2)进程间同步的原则
i、临界资源
指虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源,才可重新竞争使用该资源。
ii、进程间同步的原则
- 空闲等待:资源无占用,允许使用
- 忙则等待:资源有占用,请求进程等待
- 有限等待:保证有限等待时间能够使用资源
- 让权等待:等待时,进程需要让出CPU
iii、进程同步的方法
- 消息队列
- 共享存储
- 信号量
3)线程同步
当多个线程并发使用进程资源时,会发生什么?
也会发生生产者或哲学家的问题,因此进程内多线程也需要同步
i、线程同步的方法
- 互斥量
- 读写锁
- 自旋锁
- 条件变量
4、Linux的进程管理
1)Linux进程的相关概念
i、Linux进程的类型
前台进程、后台进程、守护进程(特殊的后台进程)
- 前台进程
- 前台进程就是具有终端Shell,可以和用户交互的进程
- 前台进程在运行时,终端Shell是无法使用的,因为前台进程占用了终端Shell
- 后台进程
- 与前台进程相对,没有占用终端的就是后台进程
- 后台进程基本上不和用户交互,优先级比前台进程低
- 将需要执行的命令以“&”符号结束
- 后台进程在运行时,虽然会有输出,但是终端Shell仍可以使用处理别的内容(使用重定向2>&1 > B将输出保存在B文件中,这样可以不在Shell输出)
- 守护(daemon)进程(特殊的后台进程)
- 很多守护进程在系统引导的时候启动,一直运行直到系统关闭
- 进程名字以“d”结尾的一般都是守护进程
- Linux有很多典型的守护进程
- cround、httpd、sshd、mysqld
ii、Linux进程的标记
a、进程ID
- 进程ID是进程的唯一标记,每个进程拥有不同的ID
- 进程ID表现为一个非负整数,最大值由操作系统限定
(1)进程的层级关系
操作系统提供fork函数接口创建进程
假设:
进程A调用fork接口创建进程B,进程B调用fork接口创建进程C
则:
进程A:父进程
进程B:子进程
进程A和进程B就是父子进程关系
父子进程关系查看命令:pstree
(2)特殊ID的进程
- ID为0的进程为idle进程,是系统创建的第一个进程
- ID为1的进程为init进程,是0号进程的子进程,完成系统初始化
- init进程是所有用户进程的祖先进程
b、进程的状态标记
通过命令“man ps ”查看Linux系统中各种进程状态标记
状态符号 | 状态说明 |
---|---|
R | (TASK_RUNNING),进程正处于运行状态 |
S | (TASK_INTERRUPTIBLE),进程正处于睡眠状态 |
D | (TASK_UNINTERRUPTIBLE),进程正在处于IO等待的睡眠状态 |
T | (TASK_STOPPED),进程正处于暂停状态 |
Z | (TASK_DEAD or EXIT_ZOMBIE),进程正处于退出状态,或僵尸进程 |
2)操作Linux进程的相关命令
i、ps命令
- ps命令常用于显示当前进程的状态
- ps命令常配合aux参数或ef参数和grep命令检索特定进程
ps: 列出当前进程
ps -aux:列出当前进程及进程的详细信息
ps -u xx:查看xx用户的进程
ps -aux | grep ‘A’ :查看A正在运行的进程
ps -ef --forest:查看进程树(呈现父子进程关系)
ps -aux --sort=-pcpu:以占用CPU资源的顺序(由大到小)列出所有进程
ps -aux --sort=-pmen:以占用内存的顺序列出所有进程
ii、top命令
top: 查看系统中所有进程的状态
其中:
PID:进程ID
USER:进程所属的用户
PR:进程的优先级
VIRT:进程的虚拟内存
%CPUL:进程所占CPU资源
%MEM:进程所占内存资源
TIME:进程运行使用的时间
COMMAND:进程执行使用的命令
iii、kill命令
- kill命令发送指定信号给进程
- kill -I 可以查看操作系统支持的信号
- 只有kill -9 信号可以无条件终止进程,其他信号进程有权忽略
kill -9 1122: 无条件的停止1122编号的进程
二、作业管理
1、作业管理之进程调度
1)进程调度概述
进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权
i、进程调度步骤
- 保留旧进程的运行信息,请出旧进程(收拾包袱)
- 选择新进程,准备运行环境并分配CPU(新进驻)
ii、三种机制
- 就绪队列的排队机制
- 将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程
- 选择运行进程的委派机制
- 调度程序以一定的策略选择就绪进程,将CPU资源分配给它
- 新老进程的上下文切换机制
- 保存当前进程的上下文信息(到主存中),装入新的需要执行的进程的运行上下文,配置好环境,使新进程能运行起来
- 如果要执行新进程时,旧进程还没执行完怎么办?
- 非抢占式的调度
- 处理器一旦分配给某个进程,就让该进程一直使用下去
- 调度程序不以任何原因抢占被使用的处理器
- 直到进程完成工作或因为IO阻塞才会让出处理器
- 抢占式的调度
- 允许调度程序以一定的策略暂停当前运行的进程
- 保存好旧进程的上下文信息,分配处理器给新进程
- 非抢占式的调度
抢占式调度和非抢占式调度对比:
抢占式调度 | 非抢占式调度 | |
---|---|---|
系统开销 | 频繁切换 | 切换次数少,开销小 |
公平性 | 相对公平 | 不公平 |
应用 | 通用系统 | 专用系统 |
2)进程调度算法
i、先来先服务调度算法
根据就绪队列中就绪进程的先后顺序选择进程执行
ii、短进程优先调度算法
- 调度程序优先选择就绪队列中估计运行时间最短的进程
- 短进程优先调度算法不利于长作业进程的执行
iii、高优先权优先调度算法
- 进程附带优先权,调度程序优先选择权重高的进程
- 高优先权优先调度算法使得紧迫的任务可以优先处理
iv、时间片轮转调度算法
- 按先来先服务的原则排列就绪进程
- 每次从队列头部取出待执行进程,分配一个时间片执行;
- 时间片用尽后,不管有没有执行完,将剩余的进程重新插入就绪队列,调度程序再从队列头部选择新的进程执行
- 是相对公平的调度算法,但不能保证及时响应用户
2、作业管理之死锁
1)死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
2)死锁的产生
- 竞争资源
- 进程调度顺序不当
i、竞争资源
- 共享资源数量不满足各个进程需求
- 各个进程之间发生资源进程导致死锁
比如:进程1和进程2都需要使用传真机、打印机,进程1先使用传真机,进程2先使用打印机,但是他们都想要使用另外一个资源,却都不释放自己现有的资源,因此:
- 等待请求的资源被释放
- 自身占用资源不释放
- 造成死锁
ii、进程调度顺序不当
进程1使用传真机为步骤A,使用打印机为步骤D
进程2使用传真机为步骤C,使用的打印机为步骤B
若调度顺序为A->B->C->D,就会产生死锁
若调度顺序为A->D->B->C,就不会产生死锁
iii、死锁产生的必要条件
四个条件必须都满足才会发生
- 互斥条件
- 请求保持条件
- 不可剥夺条件
- 环路等待条件
a、互斥条件
- 进程对资源的使用是排他性的使用
- 某资源只能由一个进程使用,其他进程需要使用只能等待
b、请求保持条件
- 进程至少保持(占有)一个资源,又提出新的资源请求
- 新资源被占用,请求被阻塞
- 被阻塞的进程不释放自己占有的资源
c、不可剥夺条件
- 进程获得的资源在未完成使用前不能被剥夺
- 获得的资源只能由进程自己释放
d、环路等待条件
- 发生死锁时,必然存在进程-资源环形链
3)死锁的处理
i、预防死锁的方法
破环产生死锁的四个必要条件中的一个即可
a、摒弃请求保持条件
- 系统规定进程运行之前,一次性申请所有需要的资源
- 进程在运行期间不会提出资源请求,从而摒弃请求保持条件
b、摒弃不可剥夺条件
- 当一个进程请求新的资源得不到满足时,必须释放占有的资源
- 进程运行时占有的资源可以被释放,意味着可以被剥夺
c、摒弃环路等待条件
- 可用资源线性排序,申请必须按照需要递增申请
- 线性申请不再形成环路,从而摒弃了环路等待条件
ii、银行家算法
- 是一个可操作的著名的避免死锁的算法
- 以银行借贷系统分配策略为基础的算法
a、策略基础
- 客户申请的贷款是有限的,每次申请需申明最大资金量
- 银行家在能够满足贷款时,都应该给用户贷款
- 客户在使用贷款后,能够及时归还贷款
b、银行家算法过程
已分配资源表:表示每个进程已占有的A/B/C/D的资源
A | B | C | D | |
---|---|---|---|---|
P1 | 0 | 0 | 1 | 4 |
P2 | 1 | 4 | 3 | 2 |
P3 | 1 | 3 | 5 | 4 |
P4 | 1 | 0 | 0 | 0 |
所需资源表:表示每个进程对于A/B/C/D资源一共需要多少
A | B | C | D | |
---|---|---|---|---|
P1 | 0 | 6 | 5 | 6 |
P2 | 1 | 9 | 4 | 2 |
P3 | 1 | 3 | 5 | 6 |
P4 | 1 | 7 | 5 | 0 |
可分配资源表:A/B/C/D资源现在分别剩余多少
A | B | C | D |
---|---|---|---|
1 | 5 | 2 | 0 |
- 首先所需资源表 — 已分配资源表 = 还需分配资源表
- 将还需分配资源表与可分配资源表对比,一个进程一个进程对比,看可分配资源表可以满足哪个进程的还需分配资源,然后优先将资源分配给哪个进程
- 直到这个进程执行结束,将资源归还,再进行计算选择……