进程
进程的概念
进程与程序有何区别?程序是存放在磁盘里的可执行文件,是一系列的指令集合,是静态的;而进程是程序的一次执行过程,同一个程序多次执行会对应多个进程,是动态的。
操作系统通过不同进程唯一的不重复的PID来区分各个进程,还会记录UID、进程控制和管理信息、资源分配清单、处理机相关信息等,这些信息都被保存在一个数据结构PCB中,即进程控制块,进程结束时会回收PCB。
总而言之,进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程的组成
进程分为给操作系统用的PCB和给进程自己用的程序段(指令程序)、数据段(运行过程中产生的各种数据)。
进程的特征
动态性、并发性、独立性、异步性、结构性。
- 动态性:进程的最基本特性。
- 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位。
- 异步性:各进程以不可预知的速度向前推进,可能导致运行结果的不确定性。
进程的状态和转换
进程pcb中,有一个变量state来表示进程的当前状态
三种基本状态:
- 运行态:占有cpu,并在cpu上运行。多核cpu可能有多个进程处于运行态
- 就绪态:已具备运行条件,但由于没有空闲cpu,而暂时不能运行
- 阻塞态(等待态):因等待某一事件而暂时不能运行
另外两种状态 - 创建态(新建态):进程正在被创建,操作系统为进程分配资源,初始化pcb
- 终止态(结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源,撤销pcb
贴一张图来描述进程的五状态模型
为了对同一状态下的各个进程进行统一的的管理,操作系统会将各个进程的pcb组织起来,分为链接方式(常用)和索引方式。链接方式是按照进程状态将pcb分成多个队列,操作系统持有指向各个队列的指针;索引方式是根据进程状态的不同建立几张索引表,操作系统持有指向各个索引表的指针。
进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,使它具有创建新进程、撤销已有进程、实现进程状态转换等功能。进程控制用原语实现,原语是一种特殊的程序,执行必须一气呵成不可中断,由关/开中断来实现。
相关原语:进程的创建、终止、阻塞、唤醒、切换原语。阻塞和唤醒原语成对出现,不同类型原语做的事情有差别,但主要就是三件事情:更新PCB的信息(修改进程状态、保存/恢复进程环境)、将PCB插入合适的队列、分配/回收资源。
进程通信IPC
进程间通信是指两个进程之间产生数据交互。进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立,为了保证安全,一个进程不能直接访问另一个进程的地址空间。有三种进程通信方式,分别是共享存储、消息传递和管道通信。
共享存储
简单来说就是给两个进程设置一个共享内存区域,并映射到进程的虚拟内存空间,让两个进程都可以访问以实现通信,但注意要互斥地访问。分为基于数据结构的共享和基于存储区的共享。
- 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组,速度慢限制多,是低级通信方式
- 基于存储区的共享:操作系统在内存中划出一片共享存储区,数据的形式和存放位置都由通信进程决定,速度快,是高级通信方式
消息传递
进程之间的数据交换以格式化的消息为单位,进程通过操作系统提供的发送、接收消息两个原语进行数据交换。消息分为消息头和消息体。消息传递分为直接通信方式和间接通信方式。
- 直接通信方式:会指明发送进程id和接收进程id,消息直接挂到接收进程的消息队列里。
- 间接通信方式:也称为信箱通信方式,在操作系统内核的地址空间开辟一些信箱,写进程通过发送原语指明要发到哪个信箱但不指明发向哪个进程,读进程通过接收原语指明从哪个信箱接收消息
管道通信
管道通信类似于共享存储,设置一个特殊的共享文件,也就是一个内存缓冲区。但是是一个先进先出的队列,类似于水管,同一时刻只支持单向传输,各进程要互斥地访问管道,因此一个管道只能实现半双公通信。当管道满时,写进程会阻塞,当管道空时,读进程会阻塞。如果多个进程同时读一个管道,可能会错乱,对此不同的操作系统有不同的解决办法,一般允许有多个读进程,一个写进程。
线程
线程的概念
有的进程可能需要同时做很多事,但传统的进程只能串行地执行一系列程序,因此引入线程来增加并发度,程序执行流的最小单位由进程变成线程。传统进程机制中,进程是资源分配调度的基本单位,引入线程之后,进程只作为除cpu以外的系统资源的分配单位,线程是调度度的基本单位;在并发性方面,是不仅进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度;在系统开销方面,同一进程内的线程切换,无需切换系统环境,并发所带来的系统开销减小。
线程的实现方式
线程有几种实现方式
- 用户级线程:从用户视角能看到的线程,进程切换在用户态进行,操作系统看不到,由线程库实现,可以理解为是代码逻辑的载体
- 内核级线程:操作系统视角看到的线程,由操作系统实现,内核级线程才是处理机分配的单位,可以看成是运行机会的载体,一段代码逻辑只有获得了运行机会才能被cpu执行
- 组合方式:上述两种方式结合
多线程模型
根据用户级线程和内核级线程的对应方式,有几种多线程模型
- 一对一模型:一个用户级线程映射到一个内核级线程。各个线程可以分配到多核处理机并行执行,并发度高;但一个用户级线程占用太多内核级线程,线程管理都需要操作系统支持,开销大
- 多对一模型:多个用户级线程映射到一个内核级线程。线程管理开销小效率高;一个线程阻塞会导致整个进程都被阻塞并发度低
- 多对多模型:n个用户级线程映射到m分内核级线程,n>=m。集二者之所长
线程的状态与转换
线程的状态与转换和进程是一模一样的,也有与PCB类似的TCB,多个TCB组成一张线程表
处理机调度
调度的基本概念
如果有好几个进程都需要使用处理机,该如何进行分配,这就涉及到了处理机调度。处理机调度就是按某种算法选择一个进程将处理机分配给它。
三个层次
处理机调度有三个层次,分别是:
- 高级调度:也称为作业调度,按某种规则从后备队列里选择合适的作业将其调入内存,并为其创建进程。外存→内存(面向作业),创建态→就绪态,发生频率最低
- 中级调度:也称为内存调度,按某种规则从挂起队列中选择合适的进程将其数据调回内存。外存→内存(面向进程),挂起态→就绪态,发生频率中等
- 低级调度:也称为进程调度,按某种规则从就绪队列中选择一个进程为其分配处理机。内存→cpu,就绪态→运行态,发生频率最高,几毫秒一次
挂起态是什么呢?为了减轻系统负载,提高资源利用率,暂时不执行的进程会被调到外存从而变成挂起态
进程调度的时机
什么时候需要进行进程调度,什么情况不能进行进程调度?
有两种情况需要进行进程调度:当前运行的进程主动放弃处理机(进程正常终止或发生异常而终止或诸佛难请求阻塞)和当前运行的进程被动放弃处理机(分给进程的时间片用完或有更紧急的事情要处理或有更高优先级的进程进入就绪队列)。
有几种情况不能进行进程调度:在处理中断的过程中,在操作系统内核程序临界区中,在原子操作过程中。
调度器/调度程序
运行态和就绪态的切换是由调度程序操作的,当创建新进程或者进程退出、阻塞、io中断时,就会触发调度程序来决定谁运行(调度算法)和运行多久(时间片)。当没有其他就绪进程时,就会触发闲逛进程。
调度算法
评价指标
- cpu利用率:cpu忙碌的时间占总时间的比例,
忙碌时间/总时间
- 吞吐量:单位时间内完成的作业的数量,
总共完成了多少道作业/总共花了多少时间
- 周转时间:作业从被提交给系统开始到作业完成为止的这段时间间隔,包括四个部分,高级调度和三个状态的时间,
作业完成时间-作业提交时间
,平均周转时间就是各周转时间之和/作业数,越小越好 - 带权周转时间:
作业周转时间/作业实际运行时间
,必然大于1,越小越好 - 等待时间:指进程/作业处于等待处理机状态时间之和,
周转时间-运行时间-IO等待时间
。对进程来说,是等待被服务时间至和;对作业来说,不仅考虑建立进程之后的等待时间,还要加上作业在外存后备队列中的等待的时间 - 响应时间:指从用户提交请求到首次产生响应所用的时间
先来先服务FCFS
按作业/进程到达的先后顺序进行服务,是非抢占式的算法,不会导致饥饿。
- 优点:公平,算法实现简单
- 缺点:对长作业有利,对短作业不利
短作业优先SJF
最短的作业/进程优先得到服务,默认是非抢占式算法。抢占式也称为最短剩余时间优先,每次有进程加入就绪队列改变时就需要调度,当一个进程完成时也需要调度。会导致饥饿,如果一直有短作业进来,使长作业一直得不到服务,
- 优点:最短的平均等待时间、平均周转时间
- 缺点:不公平,对短作业有利,对长作业不利
高响应比优先HRRN
每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务,响应比=(等待时间+要求服务时间)/要求服务时间
,非抢占式,只有当前运行的作业/进程主动放弃处理机时才需要计算响应比。不会导致饥饿。
- 优点:综合考虑作业和进程的等待时间和要求服务时间,等待时间相同时,要求服务时间短的优先;要求服务时间相同时,等待时间长的优先。
时间片轮转RR
下面适用于交互式系统。
按各个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片,若进程未在一个时间片内执行完,则剥夺处理机,重新放到就绪队列队尾重新排序。是抢占式算法,由时钟装置发出时钟中断来通知cpu时间片已到。只用于进程调度,不会导致饥饿。
如果时间片太大,就会退化为先来先服务算法,并且会增大进程响应时间,因此时间片不能太大;如果时间片太小,会导致进程切换过于频繁,导致实际用于执行的时间比例减少,因此时间片不能太小。
- 优点:公平响应快,适用于分时操作系统
- 缺点:高频的进程切换会有一定开销,且不区分任务的紧急程度
优先级调度算法
调度时选择优先级最高的作业/进程,有抢占式和非抢占式,可能导致饥饿。根据优先级是否可以改变,可以将优先级分为静态优先级和动态优先级,比如等待时间长的进程可提高优先级,频繁IO操作的进程可以提高优先级,已经运行时间很长的进程可以降低优先级。
通常系统进程优先级高于用户进程,前台进程优先级高于后台进程,操作系统更偏好IO型进程。
- 优点:用优先级区分紧急程度重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度
- 缺点:如果源源不断地有高优先级进程进来,可能导致饥饿
多级反馈队列调度算法
看不懂,再说吧