进程
进程(进程实体)由PCB()Process Control Block)、程序段、数据段三 部分组成。
对用户而言,我们能看到一个个PID,而对操作系统而言,底层需要处理的是一个个PCB。
PCB是进程存在的唯一标志 !
从不同的角度,进程可以有不同的定义,比较传统典型的定义有:
1.进程是程序的一次执行过程。
2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3.进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
注:严格来说,进程实体和进程并不一样,进程实体是静态的,进程则是动态的。
进程的特征
动态性,并发性,独立性,异步性,结构性。
进程的组织方式
进程的状态
运行态,就绪态,阻塞态,创建态,终止态。
进程状态转换的条件:
运行 -> 阻塞 等待I/O或事件完成
运行 -> 就绪 进程的CPU时间片用完
就绪 -> 运行 获得了CPU的时间片
阻塞 -> 就绪 I/O或事件完成
进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
用“原语”实现实现进程控制。原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断。
正常情况:CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段程序,转而执行相应的中断处理程序。
CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。这样,关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了“原子性”。
思考:为何进程控制(状态转换)的过程要“一气呵成”?
如果不能“一气呵成”,就有可能导致操作系\统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。
思考:如果开中断,关中断特权指令允许用户程序 使用的话,会发生什么情况?
进程控制相关的原语
创建, 终止, 阻塞, 唤醒, 切换。
- 更新PCB中的信息
a. 所有的进程控制原语一定都会修改进程状态标志
b. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
c. 某进程开始运行前必然要恢复期运行环境 - 将PCB插入合适的队列
- 分配 / 回收资源
程序的状态字寄存器(PSW)
PSW用来存放两类信息:一类是体现当前指令执行结果的各种状态信息,如有无进位(CY位),有无溢出(OV位)等;另一类是存放控制信息,如允许中断(IF位),跟踪标志(TF位)等。
进程通信
进程通信是指进程之间的信息交换。**进程是分配系统资源的单位,**因此各个进程拥有的内存地址相互独立,为了保证安全,一个进程不能直接访问另一个进程的地址空间。
进程通信方式:共享存储、消息队列/信箱、管道通信、信号量、套接字。
线程
进程是资源分配的基本单位,线程是调度的基本单位,往往一个进程包含多个线程。线程并发,系统开销小,不需要切换系统资源。
线程实现方式
用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换); 内核级线程的管理工作由操作系统内核完成。
处理机调度
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
操作系统调度层次分为三类:高级调度、中级调度、低级调度。
高级调度:从外存的后备作业中挑选一个(多个),建立相应的PCB,获得竞争处理的权力。后面会讲到的虚拟内存技术出现后,为了提高系统的利用率和吞吐量,会将暂时等待的进程挂起到外存。
中级调度:能够决定哪个被挂起的进程重新回到内存中。
低级调度:从就绪队列中选取一个进程,使其能够被CPU处理。
三种调度方式的频率从低到高。
进程调度
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区: 一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)
有的系统中,只允许进程主动放弃处理机有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理时,也会强行剥夺处理机(被动放弃)
进程在普通临界区中是可以进行调度、切换的。
调度算法评价指标
- CPU利用率:指CPU “忙碌”的时间占总时间的比例。
- 系统吞吐量:单位时间内完成作业的数量(总共完成了多少道作业/总共花了多少时间)。
- 周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(作业完成时间–作业提交时间)。操作系统更关心
平均周转时间 = 各作业周转时间之和/作业数
它包括四个部分:
- 作业在外存后备队列上等待作业调度(高级调度)的时间、
- 进程在就绪队列上等待进程调度(低级调度)的时间、
- 进程在CPU上执行的时间、
- 进程等待I/O操作完成的时间。
- 等待时间,指进程 / 作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。
对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。
对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。
一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业 / 进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。
- 响应时间,指从用户提交请求到首次产生响应所用的时间。
调度算法
-
先来先服务(FCFS, First Come First Serve)
按照作业 / 进程到达的先后顺序进行服务
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间/运行时间
等待时间 = 周转时间 – 运行时间 -
短作业优先(SJF, Shortest Job First)
每次调度时选择当前已到达且运行时间最短的作业/进程。
最短剩余时间优先算法(SRTN):每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。
追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间 -
高响应比优先( HRRN, Highest Response Ratio Next )
高响应比优先算法:非抢占式的调度算法,只有当前运行的进程主动放弃CPU时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选响应比最高的进程上处理机。
响应比 = (等待时间+要求服务时间)/要求服务时间