一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程.
进程的组成
进程与程序的联系
进程与程序的区别
并发和并行
特点:
进程控制块
(Process Control Block, PCB). 操作系统为每个进程都维护一个PCB, 用来保存
与该进程有关的各种状态信息, 是进程存在的唯一标识.
进程标识信息: 本进程的标识PID, 本进程的产生者标识PPID, 用户标识UID. 处理机状态信息保存区: 用户可见寄存器, 控制和状态寄存器, 栈指针. 进程控制信息: 调度和状态信息, 进程间通信信息, 存储管理信息, 进程所用资源, 有关数据结构 连接信息
PCB使用链表组织, 同一状态的进程其PCB成一链表, 外个状态对应多个不同的链表. 因为进程的 状态是动态变化的, 使用链表方便删除和添加状态. 如果操作系统有特殊作用, 也可以使用索引 表.
基本状态 1: 就绪态 2: 运行态 3: 等待态
4: 创建态 5: 结束态
进程没有占用内存空间.
阻塞挂起状态(blocked suspend): 进程在外存并等待某事件的出现 就绪挂起状态(ready suspend): 进程在外存, 但只要进入内存即运行
选择挂起进程: 在内存
状态队列: 每种状态都有一个队列. 挂起队列(notify) 如果一个事件只满足一个进程 , 那么只改变一个进程的状态.(notify_all)如果一个事件满足队列中的所有进程 , 那么改变所有进程的状态
进程间如果需要紧密的协同工作, 那么1: 进程之间如何通信? 2: 维护进程的系统开销较大 (创建, 撤消, 切换)
线程: 1: 实体之间可以并发执行; 2: 实体之间共享相同的地址空间.
线程是进程当中的一条执行流程. 进程用来管理资源, 把执行过程交给线程.
线程控制块 thread control blocl, 线程有独立资源和共享资源
线程开销:
线程的种类:
上下文切换使用汇编来实现
僵尸状态: 子进程exit()后, 资源释放, 但是PCD没有被释放, 等待被释放的状态.
上下文切换: * 切换CPU的当前任务, 从一个进程/线程到另一个 * 保存当前进程/线程在PCB/TCP中的执行上下文(CPU状态) * 读取下一个进程/线程的上下文
CPU调度: * 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程 * 调度程序: 挑选进程/线程的内核函数(通过一些调度策略) * 什么时候进行调度?
内核运行调度程序的条件(满足一条即可) * 一个进程从运行状态切换到等待状态 * 一个进程被终结了
不可抢占: * 调度程序必须等待事件结束
可以抢占: * 调度程序在中断被响应后执行 * 当前的进程从运行切换到就绪, 或者一个进程从等待切换到就绪 * 当前运行的进程可以被换出
调度与抢占, 分为用户态和内核态, 如果一个进程发起系统调用, 而且这个系统调用不会
进入到阻塞状态, 那么这个进程不会被抢占.
执行模型: 程序在CPU突发和I/O中交替 * 每个调度决定都是关于在下一个CPU突发时将哪个工作交给CPU * 在时间分片机制下, 线程可能在结束当前CPU突发前被迫放弃CPU
指标:
目标:
Linux CFS Scheduler: Completely Fair Scheduler
realtime, 确保在规定的时间内完成任务. 强实时, 任务非常重要, 必须完成; 弱实时, 尽量
完成.时间约束的及时性(deadlines)
任务(工作单元)
, 一次计算, 一次文件读取, 一次信息传递等等.
静态优先级调度: 运行前确定优先级 RM(Rate Monotonic) 动态优先级调度: 运行中动态改变优先级 EDF(Earliest Deadline First)
考虑的问题:
高优先级任务, 依赖低优先级的运行结果. 导致优先级反转
解决: