操作系统进程与线程思维导图

# *进程与线程*

## 进程(动态的)

### 组成

- 进程控制块(PCB)

- 进程存在的唯一标识

- 程序段

- 数据段

### 特征

- 动态性

- 并发性

- 独立性

- 进程事能够独立运行、独立获得资源、独立接受调度的基本单位

- 异步性

- 结构性

### 状态

- 运行态

- 就绪态

- 阻塞态

- 创建态

- 终止态

-

### 进程控制:原语实现

### 进程通信(PV)

- 共享存储(访问是互斥的)

- 基于数据结构

- 基于存储区

- 消息传递

- 直接通信

- 直接指明发送的进程ID

- 间接通信

- 指明发送的信箱(中间实体)

- 管道通信

- 设计一个管道(pipe文件)

- 单向(先进先出)

- 实现双向设置俩个管道

### 线程

- 比较

- 进程拥有资源和独立调度的基本单位,线程是独立调度的基本单位

- 有更好的并发性和独立性

- 无需操作系统的干扰,系统开销小

- 支持多处理系统

- 同一进程中的线程切换,不需要引起进程的切换。不同一进程中的线程切换,引起进程的切换

- 实现方式

- 用户级线程(ULT)

- 只在用户态完成

- 与操作系统无关

- 缺:当一个线程被阻塞时,所有进程都会被阻塞

- 内核级线程(KLT)

- 在内核态完成

- 有操作系统的支持,当一个线程被阻塞时,系统可运行其他进程的线程

- 缺:从用户态转换成核心态系统开销较大

- 组合方式(用户级线程和内核级线程结合)

- 多线程模型

- 一对一

- 优:并发高

- 缺,每一个线程都需要系统支持,开销大

- 一对多

- 优:开销小

- 缺:并发低

- 多对多

- 集二者之长

## CPU调度

### 层次

- 作业调度

- 内存与外存的调度--只调入一次,调出一次

- 内存调度

- 内存与外存的调度--暂时不运行的进程变为挂起态

- 进程调度

- 内存与CPU的调度

- 基本调度之一,调度频率最高

### 时机

- 可以调度

- 主动放弃

- 正常终止、主动阻塞、发生异常

- 被动放弃

- 有优先级更高的进程、更紧急的进程、时间片用完,

- 不可以调度

- 处理中断、原语(原子操作过程)

- 在操作系统内核程序临界区

### 切换

- 进程调度、切换有代价

### 方式

- 抢占式

- 非抢占式

### 目标

- CPU利用率

-

- 系统吞吐量

-

- 周转时间

-

- 等待时间

- 进程处于等待CPU的时间之和

- 响应时间

- 指从用户提交请求到首次产生响应所用的时间

### 调度程序

- 创建新进程、进程退出、运行进程阻塞、I/O中断

### 闲逛进程

- 没有就绪进程的时候运行闲逛进程

### 算法

- 先来先服务(FCFS)

- 按照作业/进程到达的先后顺序进行服务

- 非抢占式的算法、不会导致饥饿

- 优:公平、算法实现简单

缺:对长作业有利,对短作业不利

- 短作业优先(SJF)

- 最短的作业/进程优先得到服务

- 非抢占式、会导致饥饿

- 优:“最短的”平均等待时间、平均周转时间

缺:对短作业有利,对长作业不利。可能产生
饥饿现象

- 高响应比优先(HRRN)

- 在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务

- 非抢占式、不会导致饥饿

- 等待时间相同时,要求服务时间短的优先

要求服务时间相同时,等待时间长的优先

- 时间片轮转(RR)

- 按照各进程到达就绪队列的顺序,轮流让各个进程执行一
个时间片

- 抢占式、不会导致饥饿

- 优点:公平;响应快,适用于分时操作系统;
缺点:由于高频率的进程切换,因此有一定开销;不区分
任务的紧急程度。

- 优先级调度

- 每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程

- 抢占式、非抢占式都有、会导致饥饿

- 优点:用优先级区分紧急程度、重要程度,适用于实时操
作系统。可灵活地调整对各种作业/进程的偏好程度。
缺点:若源源不断地有高优先级进程到来,则可能导致饥
饿

- 多级反馈队列

- 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大

新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾

只有第 k 级队列为空时,才会为 k+1 级队头的进程分配时间片

- 抢占式、会导致饥饿

- 对各类型进程相对公平(FCFS的优点);每个新到达的进程都可以很快就得到响应(RR的优点);短进程只用较少的时间就可完成(SPF的优点);不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)

## 同步与互斥

### 同步

### 进程互斥

- 四大部分

- 进入区、临界区、退出区、剩余区

- 四大原则

- 空闲让进、忙则等待、有限等待、让权等待

### 软件实现

- 单标志法

- 进入区只"检查" 不"上锁"

- 不遵循“空闲退让”

- 双标志先检查法

- 进入区先"检查" 后"上锁",退出区“解锁”

- 不遵循“忙则等待”

- 双标志后检查法

- 进入区先"加锁" 后"检查",退出区“解锁”

- 不遵循“空闲退让、有限等待”,可能导致饥饿

- Peterson算法

- 在进入区“主动争取-主动谦让-检查对方是否想进、己方是否谦让”

- 不遵循“让权等待”,会发生”忙等“

### 硬件实现

- 中断屏蔽方法

- 利用“开/关中断指令”实现

- 优:简单、高效

缺:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程

- TestAndSet(TS指令/TSL)

- 把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作

- 优:实现简单、适用于多处理机环境

缺:不满足“让权等待”原则、会导致“忙等”。

- Swap指令(XCHG)

- 把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作

- 优:实现简单、适用于多处理机环境

缺:不满足“让权等待”原则、会导致“忙等”。

### 锁

- 互斥锁

- 解决临界区最简单的工具

- 优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低

- 缺:不太适用于单处理机系统,忙等的过程中不可能解锁

### 信号量机制

- 整型信号量

- 用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。

- 缺陷是存在“忙等”问题

- wait(S)、signal(S) 也可以记为 P(S)、V(S)、这对原语可用于实现系统资源的“申请”和“释放

默认 S 为记录型信号量

- 记录型信号量

- P操作,先S.value--,之后可能需要执行block原语

V操作,先S.value++,之后可能需要执行wakeup原语

- 实现系统资源的“申请”和“释放”

实现进程互斥、进程同步

- 信号量机制(解决带权等待)

- P( S ) —— 申请一个资源S,如果资源不够就阻塞等待
V( S ) —— 释放一个资源S,如果有进程在等待该资源,则唤醒一个进程

- 进程互斥

- 设置互斥信号量 mutex,初值为 1
、在进入区 P(mutex)——申请资源
、在退出区 V(mutex)——释放资源

- 进程同步

- 设置同步信号量 S, 初始为 0
、在“前操作”之后执行 V(S)
、在“后操作”之前执行 P(S)

- 实现前驱关系

- 原则:前V后P

### 管程

- 解决信号量机制编程麻烦、易出错

- 组成

- 共享数据结构

- 对数据结构初始化的语句

- 一组用来访问数据结构的过程

- 基本特征

- 各外部进程/线程只能通过管程提供的特点“入口”才能访问共享数据

- 每次仅允许一个进程在管程内执行某个内部过程

## 死锁

### 区别

- 死锁

- 至少俩个进程一起死锁,死锁进程处于阻塞态

- 饥饿

- 可以只有一个进程饥饿,饥饿进程可能阻塞也可能就绪

### 必要条件

- 互斥条件

- 不剥夺条件

- 请求和保持条件

- 循环等待条件

- 循环等待未必死锁,死锁一定有循环等待

### 发生原因

- 对不可剥夺资源的不合理分配

- 请求和释放资源顺序不当

### 处理策略

- 预防死锁(静态)

- 破坏互斥条件

- SPOOLing技术-将资源改为共享资源

- 破坏不剥夺条件

- 剥夺调度,主动释放

- 破坏请求和保持条件

- 静态分配

- 破坏循环等待条件

- 顺序资源分配法

- 避免死锁

- 安全序列

- 按照这个序列执行,每一个进程都可以完成

- 银行家算法

- 银行家算法步骤:
①检查此次申请是否超过了之前声明的最大需求数
②检查此时系统剩余的可用资源是否还能满足这次请求
③试探着分配,更改各数据结构
④用安全性算法检查此次分配是否会导致系统进入不安全状态

- 安全性算法

- 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,
并把该进程持有的资源全部回收。
不断重复上述过程,看最终是否能让所有进程都加入安全序列

- 死锁的检测和解除

- 资源分配图

- 俩种节点

- 俩种边

- 死锁检测算法

- 依次消除与不阻塞进程相连的边,直到无边可消

注:所谓不阻塞进程是指其申请的资源数还足够的进程

- 死锁定理:若资源分配图是不可完全简化的,说明发生了死锁

- 解除方法

- 资源剥夺法

- 撤销进程法(终止进程法)

- 进程回退法

-

 

posted @ 2025-06-02 21:26  浊酒123  阅读(39)  评论(0)    收藏  举报