https://www.bilibili.com/video/av6538245?from=search&seid=15415472580385966467
练习
- 在uCore操作系统上做实验
- http://github.com/chyyuu/mooc_os_lab
用户角度上, 操作系统是一个控制软件
管理应用程序
为应用程序提供服务
杀死应用程序
资源管理
管理外设, 分配资源
硬件之上,软件之下
Linux/Windows/Android的界面属于外壳(shell), 而不是内核(kernel).kernel在shell之下.
Kernel-操作系统内部组件包括:
OS Kernel的特征:
小知识:
CPU:中央处理单元(Cntral Pocessing Uit)的缩写,也叫处理器,是计算机的运算核心和控制核心。人靠大脑思考,电脑靠CPU来运算、控制。让电脑的各个部件顺利工作,起到协调和控制作用。
硬盘:存储资料和软件等数据的设备,有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”
内存: 负责硬盘等硬件上的数据与CPU之间数据交换处理; 缓存系统中的临时数据; 断电后数据丢失
一下电脑应用程序是如何执行起来的?
当我们在电脑上打开QQ时(右键-打开或者双击QQ图标),其实是通过鼠标(输入设备)向CPU发送了一条命令,CPU接收到这条命令后,QQ程序就从硬盘里被加载到内存(加载时不通过处理器,直接从硬盘加载程序到内存里),加载完成后,CPU就开始执行QQ程序。程序执行起来后,CPU可以让QQ程序显示在我们的在显示器上。也就是你看到了QQ程序运行起来了。如果这个时候,你用QQ截取了一张屏幕的图片,那么这张图片会首先保存到内存,在没有退出截屏状态时,你可以在这张图片上写字、画线条,等你右键保存这张图片的时候,这张图片就会保存到硬盘里。
为什么要通过内存链接CPU和硬盘?
内存存取数据的速度比硬盘的存取速度快了10倍,在某些环境里,硬盘和内存之间的速度差距可能会更大.而CPU的速度比内存不知还要快多少倍。当我们把程序从硬盘放到内存以后,CPU就直接在内存运行程序,这样比CPU直接在硬盘运行程序就要快很多.
内存解决了一部分CPU运行过快,而硬盘数据存取太慢的问题。 提高了我们的电脑的运行速度.内存就如同一条“高速车道”一般,数据由传输速度较慢的硬盘通过这条高速车道传送至CPU进行处理.
三者之间的关系
简单来说,硬盘用来存储我们的程序和数据,当我们运行程序的时候,CPU首先接受到我们的命令,之后CPU是告诉硬盘,我要运行你存储的程序A,你把程序A送到内存去。CPU对内存说,我让硬盘把程序A送到你这里来了,你保存一下
系统调用:
应用程序主动向操作系统发出服务请求
异常(来源于不良的应用程序)
非法指令或者其他坏的处理状态(如:内存出错)
中断(来源于外设)
来源于不同的硬件设备的计时器和网络中断
操作系统如何设计和实现中断,异常和系统调用?三者之间有什么区别和特点?
三者的来源:
处理时间
中断有两种,一种是CPU本身在执行程序的过程中产生的(也称为异常),一种是由CPU外部产生的。
外部中断,就是通常所讲的“中断”(interrupt)。对于执行程序来说,这种“中断”的发生完全是异步的,因为不知道什么时候会发生。CPU对其的响应也完全是被动的,
可以通过“关中断”指令关闭对其的响应。由软件产生的中断一般是由专设的指令,如X86中的“INT n”在程序中有意产生的,是主动的,同步的。只要CPU执行一条INT指令,在开始执行下一条指令之前一定会进入中
断服务程序
响应
1.中断和异常的处理机制
中断是外设时间
异常是内部的CPU事件
中断和异常迫使CPU访问一些被中断和异常服务访问的功能
硬件响应:
软件响应:
异常:
2.系统调用
程序访问主要是通过高层次的API接口而不是直接进行系统调用.
https://www.cnblogs.com/Allen-rg/p/7171105.html(用户态和内核态的一个详细介绍)
跨越操作系统边界的开销:
https://blog.csdn.net/sinat_33363493/article/details/53647129(计算机系统组成和基本工作原理)
计算机硬件系统
计算机硬件5大组成部分:运算器、控制器、存储器、输入设备和输出设备
计算机硬件的电线结构包括:单总线结构、双总线结构和采用通道的大型系统结构
1.单总线结构:使用一组系统总线将计算机的各个部件连接起来,各部件通过总线交换信息。
一般用在小型或者微型计算机。
优点:易于扩充新I/O设备,I/O设备的寄存器和主存储器可以统一编址使CPU访问I/O更 加灵活。
缺点:限制了信息传送的吞吐率。
2.双总线结构:常见的就是在内存和CPU之间设置一组专有的高速存储总线。分为以CPU为中心的双总线和以存储器为中心的双总线。
以存储器为中心的双总线结构:
主存储器通过存储总线和CPU交换信息,同时可以通过系统总线与I/O设备交换信息。
优点:信息传输效率高。
缺点:增加硬件成本。
以cpu为中心的双总线结构:
优点:控制线路简单,对I/O的总线的要求低。
缺点:CPU效率低。
采用通道的大型系统结构:一台主机可以连接多个通道,一个通道可以连接一台或多台I/O设备,具有较大的扩展性。由通道控制I/O设备,减少了CPU的压力,提高了系统效率。
操作系统的四个目标:
在操作系统中管理内存的不同方法
地址空间:
逻辑地址空间:
比较好理解的一节
内存碎片问题:
内存的动态分配
压缩式碎片整理:
交换式碎片整理:
把程序运行过程中会有等待,等待时把其占用的主存的内存空间腾出来,而暂时把该程序移植到磁盘(虚拟内存),等到等待时间结束,再重新移植回主存。这个过程称之为交换。
https://www.zhihu.com/question/50796850/answer/522734117(此回答可有更通俗的理解分页和分段)
https://www.jianshu.com/p/7bfe9bb44c07(对分段,分页做了详细解释)
为什么需要非连续内存分配?目的就是改善连续内存分配的缺陷
连续内存分配的缺点:
非连续内存分配的优点:
非连续内存分配的缺点:
分段:
分页的思想:固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低。为尽量避免碎片的产生,引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。
分页方法与固定分区技术不同点在于:块的大小相对于分区小很多,而且进程也按照块进行划分,进程运行时,按照块申请主存可用空间并执行。与分区留在较大的内部碎片不同,分页方式只会在最后一个主存块上留下页内碎片。
现在的计算机操作系统大都使用分页机制来进行内存管理(需要好好理解)
分页:
划分方案:
物理内存被分割为 大小相等的帧 。帧存在帧号(frame number)与偏移(offset),相当于段中的段号与偏移。 帧号占了F这么多位,本身大小占了S这么多位。
小知识: 在电脑当中,运行内存包括了物理内存和虚拟的内存。虚拟内存是在物理内存(真的内存条)不够的时候,占用硬盘一部分空间作为虚拟内存,虚拟内存运行比较慢。
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。
地址变换机构的任务是将逻辑地址转换为内存中物理地址,地址变换是借助于页表实现的。转换过程中,业内偏移是固定的,需要完成由页号到块号的变换。
在系统中通常设置一个页表寄存器(PTR),存放页表在内存的始址F和页表长度M。进程未执行时,页表的始址和长度存放在进程控制块中,当进程执行时,才将页表始址和长度存入页表寄存器。设页面大小为L,逻辑地址A到物理地址E的变换过程如下:
关于页表项长度的解释:
将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置。
于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
列出式子出来: 页表始址+页号x页表项长度
1)页表项长度是页面长度是吗?
2)如果是页面长度,那两者相乘就是整个内存的大小来,你想一想整个内存都用来存储页表可能吗?
当然是不可能了,首先内存被划分成若干个和页面大小相等的片。
每个页表项代表一个页面的地址,一般很小。
假设内存大小是2GB,页面大小(物理块)是4KB,页表项长度是4B。
则整个内存可以被划分成2GB/4KB=512K个页面。
页表的长度=页表项的长度x页面的个数=4Bx512K=2M。
内存中用2M的大小来存放页表。
性能问题:
性能问题解决方案:缓存(caching)和间接(indrection)访问
具备快表的地址变换机构
在具有快表的分页机制中,地址的变换过程:
二级页表将页表的10页空间也进行地址映射,建立上一级页表,用于存储页表的映射关系。上一级页表只需要1页就足够(可以存储2^10=1024个页表项)。在进程执行时,只需要将这1页的上一级页表调入内存即可,进程的页表和进程本身的页面,可以在后面的执行中再调入内存。
对二级页表再进行拓展,得到多级页表。64位计算机通常将可寻址存储空间减少为45位长度,这样可以使用三级页表结构来实现分页存储管理。
内存越来越不够用,理想中的存储器是更大,更快,更便宜的非易失存储器。为内存提供更大的空间
https://blog.csdn.net/github_36487770/article/details/54934919
目标:
缺点:
(1) 设计开销,程序员要划分模块和确定覆盖关系,编程复杂度增加了
(2) 覆盖模块从外存装入内存,实际是以时间来换空间。
何时交换?
硬盘操作很慢, 一动系统就要等, 所以当内存空间不够时, 或者有不够的危险时换出
交换区的大小
极端下是内存中只留一个程序,其余都在交换区. 必须够大以存放所有用户进程的所有内存映像的拷贝:必须能对这些内存映像直接存取.
swap in重定位:
再次换入的内存地址一定要在原来位置上吗?
不一定,可能已被占用,要正确寻址,需要动态地址映射,虚拟地址一样,物理地址不一样。
覆盖、交换的比较:
目的是一样的。
覆盖是发生在一个运行中的程序内部没有调用关系的模块之间,代价是程序员手动指定和划分逻辑覆盖结构;交换是内存中程序与管理程序或OS之间发生的,以进程作为交换的单位,需要把进程的整个地址空间都换进换出,对程序员是透明的,开销相对较大。
起因: 由于覆盖和交换技术存在缺陷
为了实现虚存,要利用程序的局部性原理(principle of locality)
虚存技术的目标:
为了实现虚存,要利用程序的局部性原理(principle of locality), 也就是程序在执行过程的一个较短时期,所执行的指令的地址,指令的操作数地址都局限于一定区域。
因此, 虚存技术可以在页式或者段式内存管理的基础上实现
虚存技术基本特征:
具体实现:多采用虚拟页式内存管理,增加了请求调页和页面置换功能
大部分虚拟存储系统都采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能
例子:第一个操作:把虚拟地址0读入寄存器中
最底下,2代表驻留位是1,页帧号是2,页面大小4k,物理地址2*4096=8192
第二个操作:把虚拟地址32780读入,对应第8个32k-36k,X说明缺页,抛出缺页异常
对缺页中断的处理:
(1) 如果在内存中有空闲的物理空间,则分配一个物理页帧f,然后转4,否则2
(2) 采用某种页面置换算法,选择一个被替换的物理页帧,其对应逻辑页为q,没修改过可直接释放,如果修改位是1则要写回外存
(3)把q的对应页表项驻留位设为0
(4)把需要访问的页面p装入到物理页面f中
(5)修改p对应页表项,驻留位为1,物理页帧好置为f
(6)restart
在何处保存未被映射的页?
能简单地被识别,在二级存储器中的页;交换空间(磁盘/文件):特殊格式,用于存储未被映射的页面swap file
硬盘也有多种方式存储,数据,代码,动态库—>后备存储中的前三个,动态产生的数据,是没与文件直接对应的内存内容→硬盘上专门开一个区swap file
后备存储(backing store),二级存储
数据:一个虚拟地址空间的页面可以被映射到一个二级存储中文件的某个位置;
代码段:映射到可执行二进制文件;
动态加载的共享库程序段:映射到动态调用的库文件
其他段:可能被映射到交换文件(swap file)
虚拟内存性能
为了便于理解分页开销,使用有效存储器访问时间的概念
—–effective memory access time(EAT)
EAT = 访存时间 * 页表命中几率(即1-page fault) + page fault处理时间 * page fault 几率
page fault处理时间* page fault 几率= 总的磁盘访问时间 = 单次访问磁盘时间(读/写)page fault 几率 (1 + dirty page几率)
如果有修改,还要将修改位为1的页面读出到外存
开销决定于p,所以程序必须有局部性特点
https://blog.csdn.net/github_36487770/article/details/59127556
功能目标:
选择最久未使用的那个页面淘汰掉. 这是对最优置换算法的近似,以过去推测未来.根据局部性原理,如果最近一段时间内某些页面被频繁访问,那么在将来还可能被频繁访问. 反之未被访问的将来也不会被访问.
在内存中维持一个环形页面链表,更新并删除used bit=0的页面
区分读和写,enhanced clock algorithm
读和写都是访问,dirty bit是写位,如果写,为1,否则是0。同时使用脏位和使用位。
修改clock算法,使它允许脏页总是在一次时钟头扫描时保留下来,以减少写回硬盘的操作(仅读的页可以直接释放)
需要替换的页,其访问位和脏位都是0,如果都是 1,则有两次机会才被淘汰。从而让更多使用频率的页有更多的机会留在内存中。
较为接近LRU算法,尽量保存dirty page,更好地减少了访问外存
LRU和FIFO本质都是先进先出,但LRU是页面的最近访问时间而不是进入内存的时间,有动态调整,符合栈算法的特性,空间越大缺页越少。如果程序局部性,则LRU会很好。如果内存中所有页面都没有被访问过会退化为FIFO。
Clock 和enhanced clock也是类似于FIFO的算法,但用了硬件的BIT来模拟了访问时间和顺序,近似了LRU,综合起来较好,但也会退化为FIFO。
都对程序的访问次序有局部性的要求,不然都会退化。
开销上,LRU开销大,FIFO开销小但BELADY,折中的是clock算法,开销较小,对内存中还未被访问的页面,效果等同LRU。对曾经被访问过的则不能记住其准确位置。
工作集模型:
如果局部性原理不成立,那各种算法都没啥区别,比如是单调递增,那不管哪种都会缺页中断。如果局部性原理成立, 那么如何来证明他的存在, 如何对它进行定量的分析?这就是工作集模型!
工作集: 一个进程当前正在使用的逻辑页面的集合,可以用一个二元函数 W ( t , Δ ) W(t, \Delta) W(t,Δ)来表示:
常驻集是指当前时刻, 进程中实际驻留与内存中的页面集合
https://blog.csdn.net/github_36487770/article/details/60144610
https://blog.csdn.net/github_36487770/article/details/60144610
包含了正在运行的一个程序的所有状态信息
进程与程序的联系
程序是进程的基础,代码控制操作,可以多次执行程序,每次构成不同的进程;进程是程序功能的体现;多次执行——某一个程序对应多个进程;调用关系——某一个进程包括多个程序
多对多的映射关系
进程与程序的区别
描述进程的数据结构:进程控制块,PROCESS control block PCB
OS给每个进程都维护了一个PCB,保存与之有关的所有状态信息。
PCB(进程控制块):进程存在的唯一标识,操作系统管理控制进程运行所用的信息集合,描述进程的基本情况和运行变化的过程.
用PCB的生成,回收,组织管理来完成进程的创建、终止和管理。
PCB含有三大类信息:
PCB的组织方式:
进程生命期管理:创建—>运行—>等待—>唤醒—>结束
创建:
引起进程创建的3个主要时间:系统初始化时,创建INIT进程,INIT再负责创建其他进程;
运行:
运行:内核选择一个就绪的进程,让它占用处理机(cpu)并执行.
等待:
以下三种情况,进程等待(阻塞)
进程只能自己阻塞自己,因为只有进程自身才知道何时需要等待某件事情的发生.
唤醒:
结束:
进程结束前的处于且仅处于的三种状态之一:
创建态(new) 已创建还没就绪
结束态(exit) 正在从OS中消失,PCB还存在
使用进程挂起的目的是为了合理利用资源。但是不同于进程阻塞。挂起时没有占用该内存空间,而是映像在磁盘上。类似虚存中,有的程序段被放到了硬盘上。
两种挂起状态:
状态转换:
1.在内存中被挂起:
2.外存中:
OS怎么通过PCB和定义的进程状态来管理?
以进程为基本结构的OS,底层为CPU调度程序(执行哪个?中断处理等),上面是各种进程。
OS要维护一组状态队列(重要的数据结构),表示系统中所有进程的当前状态。
就绪队列,各种类型的阻塞队列,挂起队列
PCB根据状态排入相应队列,状态变化加入和脱离队列
线程(thread): 进程中的一条执行流程。
重新理解进程:
进程由两部分构成:
(1)资源管理,包括地址空间(代码段,数据段),打开的文件等的资源平台(环境)等
(2)从运行的角度,线程,即代码在这个资源平台上的一条执行流程。一个进程所拥有的线程共用进程的资源平台。利于通信。
线程有自己的TCB(thread control block)只负责这条流程的信息,包括PC程序计数器,SP堆栈,State状态,和寄存器。有不同的控制流,需要不同的寄存器来表示控制流的执行状态,每个线程有独立的这些信息,但共享一个资源。
线程=进程-共享资源
线程是控制流,一个进程中可以同时存在多个线程,各个线程并发执行,共享地址空间和文件等资源。
多线程: 在进程空间内有多个控制流且执行流程不一样,有各自独立的寄存器和堆栈,但共享代码段,数据段,资源。
线程与进程的比较:
https://blog.csdn.net/u013007900/article/details/79620082
三种实现方式:
什么是上下文切换?
进程共享CPU,停止当前进程,并调度其他进程的切换叫做上下文切换。
上下文切换的要求:
要存储什么上下文?
进程执行中要关注寄存器,PC(进程执行到了什么地方),栈指针(调用关系,相应的局部变量位置)等。这些信息要被保存到PCB中,进程挂起时要把PCB的这些值重置,恢复到寄存器中去,使接下来进程可以继续在CPU上执行。
上下文切换的开销越小越好,且所有信息都与硬件紧密相连。
本节知识点来源于http://c.biancheng.net/cpp/html/2590.html
创建、加载、执行、等待和结束进程
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
进程创建:
允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程。
在操作系统中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。操作系统创建一个新进程的过程如下(创建原语):
进程终止
引起进程终止的事件主要有:正常结束,表示进程的任务已经完成和准备退出运行。异常结束是指进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、I/O故障等。外界干预是指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止。
操作系统终止进程的过程如下(撤销原语):
进程的阻塞和唤醒
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。
阻塞原语的执行过程是:
当被阻塞进程所期待的事件出现时,如它所启动的I/O操作已完成或其所期待的数据已到达,则由有关进程(比如,提供数据的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒。
唤醒原语的执行过程是:
需要注意的是,Block原语和Wakeup原语是一对作用刚好相反的原语,必须成对使用。 Block原语是由被阻塞进程自我调用实现的,而Wakeup原语则是由一个与被唤醒进程相合作或被其他相关的进程调用实现的。
进程切换
对于通常的进程,其创建、撤销以及要求由系统设备完成的I/O操作都是利用系统调用而进入内核,再由内核中相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
进程切换是指处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化
进程切换的过程如下:
注意,进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。如果进程因中断或异常进入到核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。
上下文切换:切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文
CPU调度:从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个线程/进程
调度程序:挑选进程/线程的内核函数(通过一切调度策略)使得效率最高,满足用户需求
1.在进程/线程的生命周期中的什么时候进行调度?
从一个状态变为另一个状态,特别是和运行(running)相关的状态。
2.内核运行调度程序的条件:进程从运行状态切换到等待状态;一个进程被终结了.(这两者满足一个就可以)
3.不可抢占调度:调度必须等待事件/进程结束(早期OS)。
4.可以抢占:调度程序在中断被响应后执行;当前的进程从运行切换到就绪,或者一个进程从等待切换到就绪;当前运行的进程被换出(OS决定在何时打断进程).
可以抢占针对的是用户态的进程。 进程在内核中通过系统调用执行,因为系统调用返回时是到发起这个调用的进程继续执行,所以内核中不会切换,抢占。只要进程在系统调用时不存在从运行态到阻塞态的变化,OS可以确保返回正常。 如果在内核中也允许这种抢占,系统调用返回时不是原来的进程而是另一个优先级更高的进程,就是内核中的抢占。
os早期是完全不可抢占,后来用户态进程允许抢占,现在内核态进程也可以抢占。
CPU的占用率是波状,CPU大量运算是高峰,而读写I/O时是平稳的低值。每个调度决定都是关于下一个CPU突发时将哪个工作交给CPU,在时间分片下,线程可能在结束当前CPU突发前被迫放弃CPU。
程序在CPU突发和I/O中交替,CPU占用率高说明是在充分地使用CPU。
选择调度方法的评价指标:
用户要求:
用量化的方法来看调度算法:
1、先到先服务调度算法(FCFS)
根据就绪队列的到达时间来服务,此时就绪队列是一个FIFO队列,先到先服务,后到的线程不能抢占前面正在服务的线程。这种算法的优点是实现简单,缺点也很明显,就是CPU进程区间变化很大时,平均等待时间会变化很大。
2、最短作业优先调度(SJF)
顾名思义,就是CPU进程区间最短的先执行,如果两个进程区间具有同样的长度,那么按照FCFS来调度。
SJF可以是抢占的,也可以是不抢占的。它的平均等待时间优于FCFS。
3、优先级调度(HRRN)
其实上面的SJF算法就是一种特殊的优先级调度,只不过这里的优先级定义更加广泛一些,SJF算法的优先级是按照CPU进程区间长短来定义的,这里的优先级可以是其他的一些定义。
优先级调度可以是抢占的,也可以是非抢占的。
优先级调度的一个主要问题是无穷阻塞(也称为饥饿),如果一个线程的优先级很低,可能需要等待很长的时间才能到这个线程执行,甚至永远不执行,一种解决方法是老化(随着时间的增长,增加线程的优先级)
4、轮转法调度(RR)
轮转法调度专门是为分时系统设计的。它类似于FCFS,但是增加了抢占为了切换线程。定义一个较小的时间单元,称为时间片,通常为10-100ms。为了实现RR算法,将就绪队列保存为FIFO队列,新进程增加到就绪队列队尾,CPU调度程序从就绪队列选择第一个进程,设置定时器在一个时间片之后再中断,再分派这个进程。
如果该进程的CPU区间小于时间片,进程本身就会释放CPU,调度程序继续处理下一个进程,如果当前进程的CPU区间比时间片长,定时器会产生CPU中断,实行上下文切换,然后将此进程放到就绪队列队尾,继续调度就绪队列第一个进程。
5、多级队列调度:
这里对进程进行分组,在组内使用FCFS和SJF算法,在组间实行优先级调度或者轮转法调度。但是不允许进程在组间切换。
6、多级反馈队列调度
允许进程在组间切换,主要思想是根据不同区间的特点区分进程,如果CPU进程占用过多CPU时间,那么它会被转移到更低优先级队列。这种形式老化阻止饥饿。
各个调度算法的详细解释:
1、FCFS first come first served先来先服务
如果前面的进程运行的时间长,后面的进程就只能等着,导致周转时间慢。如果进程阻塞了,队列中的下一个会得到CPU
优点:简单
缺点:平均等待时间波动大;花费时间少的可能反而排在后面;可能导致CPU和I/O之间的重叠处理,没考虑抢占,CPU密集的进程导致I/O闲置时,I/O密集型进程也在等。
2、SPN/SJF/SRT shortest process next/shortest JOB first/shortest remaining time 短剩余时间,短进程优先
不可抢占: SJF SPN
可抢占: ready queue中的第一个进程正在运行时,来了一个比它的预测完成时间还短的进程,SRT
优点:最小的平均等待时间和周转时间
缺点:可能导致长任务饥饿,不能保证公平;需要预知未来下一个进程的时间,比如询问用户,如果用户欺骗就杀死进程。
可以根据进程执行历史看将来某个进程CPU突发的持续时间,递归展开
预测和实际情况可能会有差距,但是趋势是一致的。
3、HRRN 最高相应比优先
R = ( w + s ) / s R=(w+s)/s R=(w+s)/s
w: waiting time 等待时间
s: service time 服务时间
选取R值最高的进程作为高优先级进程。
优点:交互性,响应性更好
缺点:对抢占性的支持不够,也需要预知service time
4、Round Robin 轮循
用时间切片和抢占来轮流执行,强调了公平
有点:公平,相对稳定;
缺点:但平均等待时间较长
开销:额外的上下文切换;
时间量子的选择:
目标:选择一个合适的时间量子,经验是维持上下文切换开销处于1%以内,现在LINUX是千分之一秒
Multilevel Queues→ multilevel Feedback Queues
多级队列:
就绪队列分为相对独立的队列,前台交互,RR,后台/底层批处理,FCFS,调度在队列间进行
进程和队列都在动态变化,能否动态调整?
多级反馈队列 优先级队列中的轮循 有动态调整:
一个进程可以在不同队列中移动,N级优先级
在所有队列中优先级调度,每个级别内部RR轮循
时间量子大小随优先级增加而增加,若当前时间量子中没有完成就给当前任务则降到下一个优先级
Fair share scheduling cpu的等待时间和执行时间公平共享在用户级别实现公平共享
FFS控制用户对系统资源的访问
调度火车,工厂,需要确保任务在规定时间内完成的
1、定义: 正确依赖于其时间和功能两个方面的一种操作系统。
2、性能指标:
3、主要特性
4、类别
5、任务/工作单元job:一次计算,一次文件读取,一次信息传递等等
6、属性:取得进展所需要的资源和实时参数