一、操作系统四个特性
- 并发性:同一段时间内多个程序执行
- 共享性:系统中的资源被内存中多个并发执行的进/线程共同使用
- 虚拟性:通过复用技术(如时分和空分)实现一个物理实体虚拟为多个
- 异步性:进程是走走停停的方式执行,且以一种不可预知的速度推进
二、进程
2.1 多进程的组织形式
- PCB(process control block):记录进程信息的数据结构
- 进程状态:就绪、执行、阻塞
- 队列:就绪队列、阻塞队列
2.2 CPU调度算法
- 调度算法:在就绪队列中挑选进程让CPU执行的规则
- 响应时间:开始申请执行任务到开始执行任务
- 周转时间:开始申请执行任务到执行任务完成
算法类型 | 说明 | 性能 |
---|---|---|
先来先服务调度(FCFS) | 按先来后到的顺序依次调度 | 平均周转时间可能会长 |
短作业优先调度(SJF) | 选择估计时间最短的进行调度 | 响应时间可能会长 |
高响应比调度(HRN) | 响应比=(等待时间+服务时间)/服务时间 | – |
时间片轮转调度(RR) | 给予处在队列首部的进程一定时间片,时间用完后放入队尾,循环分配时间片 | 响应时间有保证 |
多级反馈队列调度 | 设置多个就绪队列,并为其设置调度优先级,优先级越高分配时间片越短 | 目前公认最好的调度算法 |
进程的分类
Linux系统进程类型:
- 系统进程:可执行内存资源分配和进程切换等管理工作
- 用户进程:可在用户的控制下进行
- 交互进程:由一个shell终端启动的进程
- 批处理进程:一个进程集合,负责按顺序启动其他进程
- 守护进程:一直在运行中的进程。
- 进程的状态:
- 就绪状态:获得处理器即可运行
- 执行状态:正在占用处理器
- 阻塞状态:等待事件发生
状态码 | 状态 | 状态码全称 |
---|---|---|
R | 可执行状态 | TASK_RUNNING |
S | 可中断的睡眠状态 | TASK_INTERRUPTIBLE |
D | 不可中断的睡眠状态 | TASK_UNINTERRUPTIBLE |
T | 跟踪状态(或暂停状态) | TASK_TRACED |
Z | 退出状态,进程成为僵尸进程 | TASK_ZOMBLE |
死锁
- 定义:
在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。
- 产生条件:
- 互斥条件:一个资源只能被一个进程使用
- 请求保持条件:进程因请求资源而阻塞时,对已获取的资源保持不放
- 不可抢占条件:进程已获取的资源未使用完之前不能强行夺取
- 循环等待条件:若干进程之间形成一种头尾相连的循环等待资源关系
- 死锁处理:
- 预防:破坏产生死锁的必要条件(但可能会降低资源利用率和吞吐量)
- 避免死锁:在资源的动态分配中,防止系统进入不安全状态
- 检测死锁:允许死锁产生,采用相关方法清除该死锁
- 解除死锁:与检测死锁配合。
三、进程与线程
- 进程:系统进行资源调度和分配的基本单位
- 线程:CPU调度的基本单位
进程间通信用于数据交换,线程间通信为了线程同步
四、内存管理
问题:
- 每个进程代码中使用的地址可能相同,解决思路:地址重定向
- 物理内存可能较小,解决思路:内存置换
4.1 分段
一个程序分成多个段,段表保存在进程中的PCB中
4.2 页表
将内存按也分配,防止内存碎片的存在
4.3 内存换出
页面置换算法 | 说明 | 性能 |
---|---|---|
先进先出(FIFO) | 最先淘汰最先进去的页面 | 缺页率高 |
最近最久未使用(LRU) | 每页赋予一个访问字段用以记录上次页面访问到这次访问的时间间隔,将时间间隔最大的页面置换出去 | 使用寄存器或者栈实现 |
时钟算法(clock/NRU) | 页面设置访问位R,R=1访问,R=0置换 | 效率不高 |