操作系统核心:运行程序
进程
它是操作系统的CPU调度和资源分配单位。
一个程序在一个数据集上的一次执行
进程包括:
1.代码
2.当前活动
- 程序计数器(PC)-指向当前要执行的指令(地址)
- 堆栈(Stack):存放函数参数、临时变量等临时数据
- 数据(Data)
- 堆(Heap)
进程和程序
- 进程是程序的一个实例,是程序的一次执行
- 一个程序可对应一个或多个进程,同样一个进程可对应一个或多个程序
- 程序是进程的代码部分
- 进程是活动实体,程序是静止(被动)实体
- 进程在内存,程序在外存
程序状态
就绪(ready):进程等待分配处理器
运行(running):指令在执行
阻塞(waiting):进程等待某些事件发生
新建(new):在创建进程
终止(terminated):进程执行完毕
new->新建成功->ready->被调度程序选中,获得处理机->running->有三种转变可能:
- 被中断程序打断,或时间片运行完毕->ready
- 运行一段时间后等待某事件发生如(IO)->waiting
- 进程运行结束->terminated
处于阻塞态(waiting)的进程如果等待的事件完成则->ready,不能直接转化为运行(running)态。
进程控制块(PCB)
PCB包含同进程有关的信息:
进程状态
进程号
程序计数器
CPU寄存器
CPU调度信息
内存管理信息
计账信息
I/O状态信息
进程间通信(IPC)
两种基本模式:
共享内存:以最快速度进行方便的通信
消息传递:交换较少数据,时间多
线程
为什么要线程:
性能:
- 操作进程系统开销大
- Unix的轻型进程(fork)
应用
- 进程代码有并行执行的需求
硬件
- 多核处理器
- 加速进程的运行
什么是线程:
可在CPU上运行的基本执行单位
进程内的一个代码片段可以被创建称为一个线程
线程状态:就绪、运行、等待等
线程操作:创建、撤销、等待、唤醒等
进程依旧是资源分配的基本单位
线程自己不拥有系统资源,通过进程申请资源
线程和进程区别
从代码来看:进程包含线程,而线程是进程中的一段代码。
从资源来看:进程是资源分配的基本单位,线程不拥有资源,共享进程的资源。
从调度来看:同一进程中的线程切换不会引起进程切换,线程是基本的调度单位。
从切换来看:进程是重量级上下文切换,代价大;线程是轻量级切换,代价小。
从生命周期看:进程撤销会导致所有线程被撤销,线程撤销不会影响进程。
CPU调度
多任务操作系统的基础,目的是使得CPU尽可能用于执行指令,从而提高CPU效率。
- 长程调度
- 中程调度
- 短程调度
有些状态转换是必然的,如运行完成的状态必然转变成结束状态,有些状态必须CPU干预,因为进程间存在竞争,需要操作系统选择一个进程来进行这种转换。这种选择称为CPU调度。
CPU调度有OS的两个部件完成:
- 调度程序:根据某种策略选择内存中的一个就绪进程
- 分派程序:负责具体的进程切换工作
具体过程:
- 利用定时器把CPU的控制权转交CPU调度程序,让调度程序选择一个需要运行的进程。
- 进行进程上下文切换,把该进程从就绪状态转换到运行状态。
- 系统切换到用户态,跳转到用户程序的适当位置并重新运行
CPU调度方式:
- 非抢占式调度:
一旦CPU分配给某进程后。系统不可以抢占已分配的CPU并分配给其他进程。
只有进程资源释放CPU,才可以吧CPU分配给其他进程
优点:易实现,调度开销小,适合批处理系统
缺点:响应时间长,不适合交互式系统
- 抢占式调度
调度程序可根据某种原则暂停某个正在执行的进程,将已分配给它的CPU重新分配给另一个进程。
可防止单一进程长时间独占CPU
系统开销大
两者区别:运行进程是否是自愿放弃CPU
调度基本指标
- CPU利用率:固定时间内CPU运行时间的比例
- 吞吐量:单位时间内运行完的进程数
- 周转时间:进程从提交到运行结束的全部时间
- 等待时间:进程等待调度(不运行)的时间片总和
- 响应时间:从进程提交到首次运行的时间段,也就是第一段的等待时间
周转时间=运行时间+等待时间
CPU调度算法
1.先来先服务调度(FCFS)
按进程请求CPU的先后顺序使用CPU
- 实现简单,可使用FIFO队列实现
- 属于非抢占式调度
- 适用于长程调度,后台批量处理系统的短程调度
2.短作业有限调度算法(SJF)
关联到每个进程下次运行的CPU区间长度,调度最短的进程。有两种调度模式:非抢占式和抢占式。
- 非抢占式:一旦进程拥有了CPU,只有当该CPU脉冲时间结束才会让出CPU的控制权
- 抢占式:当有比当前进程剩余时间片更短的进程到来时,新来的进程抢占当前进程获得CPU运行,这种调度算法也被称为最短剩余时间优先调度,简写为SRTF。
优点:具有最短的平均等待时间
缺点:存在饥饿问题
3.优先级调度算法
为每个进程分配一个优先数,该数值为整数,然后按照进程的优先数来分配使用CPU。默认优先数越小,优先级越高,页就是说,具有最小优先数的进程具有最高优先级。就绪队列的排队策略是优先级高在前,优先级低在后。
- 抢占式:当一个比正在运行进程的优先级高的进程加入就绪队列后,该进程将抢占正在运行进程的CPU。
- 非抢占式
优先级
- 动态优先级:高响应比优先调度算法
- 静态优先级
4.高响应比优先调度算法
优先数=响应比=等待时间/运行时间
优点:能够避免饥饿现象,兼顾长短作业
缺点:计算响应比增加系统开销
5.时间片轮转调度算法(RR)
专为分时系统设计,类似于FCFS,但增加了抢占。
把一段时间分割为若干个小碎片,每个需要运行的进程获得一个碎片运行,也就是在这段时间内每个进程都得到运行。
6.多级队列调度(MLQ)
可针对不同进程使用不同的调度算法。允许系统中存在多个就绪队列,每个就绪队列有自己的调度算法
7.多级反馈队列调度(MLFQ)
进程在其运行过程中,能在不同队列间移动。
死锁
死锁是两个或两个以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象;若无外力干预,它们都将无法推进下去。(竞争的资源可以是锁、线程、网络连接、通知事件、打印机、磁盘、宽带等)
死锁的四个必要条件
- 互斥
- 占有并等待
- 非抢占
- 循环等待
死锁的解决方法
- 可使用协议来预防或避免死锁,确保系统不会进入死锁状态。
- 可允许系统进入死锁状态,然后检测它,并加以恢复
- 可忽略这个问题,认为死锁不可能在系统内发生