目录
- 操作系统的概念、功能、目标
- 操作系统的概念
- 操作系统的功能和目标
- 作为系统的资源管理者
- 作为用户和计算机硬件之间的接口
- 作为最接近硬件的层次
- 总结
- 操作系统的四个特征
- 并发
- 共享
- 虚拟
- 异步
- 总结
- 操作系统的发展与分类
- 手工操作阶段
- 批处理阶段-单道批处理系统
- 多道批处理系统
- 分时操作系统
- 实时操作系统
- 其它几种操作系统
- 总结
- 操作系统的运行机制和体系结构
- 两种指令、两种处理器状态、两种程序
- 指令
- 两种处理器状态
- 两种程序
- 操作系统的内核
- 操作系统的体系结构
- 总结
- 中断和异常
- 中断的概念和作用
- 中断的分类
- 外中断的处理过程
- 总结
- 系统调用
- 什么是系统调用,有什么作用?
- 系统调用和库函数的区别
- 系统调用背后的过程
- 总结
- 进程的定义、组成、组织方式、特征
- 进程的定义
- 进程的组成
- 进程的组织
- 进程的特征
- 总结
- 进程的状态和转换
- 进程的状态--三种状态
- 进程另外两种状态
- 进程的状态转换
- 总结
- 进程控制
- 什么是进程控制?
- 如何实现进程控制?
- 进程控制相关的原语
- 总结
- 进程通信
- 什么是进程通信?
- 进程通信--共享存储
- 进程通信--管道通信
- 进程通信--消息传递。
- 总结
- 线程概念和多线程模型
- 什么是线程,为什么要引入线程?
- 引入线程之后,有什么变化?
- 线程属性
- 线程实现方式
- 多线程模型
- 总结
- 处理机调度的概念、层次
- 调度的基本概念
- 调度的三个层次--高级调度
- 调度的三个层次--中级调度
- 补充知识:进程的挂起与七状态模型
- 调度的三个层次--低级调度
- 总结
- 进程调度的时机、切换与过程、方式
- 进程调度的时机
- 进程调度的方式
- 进程切换与过程
- 总结
- 调度算法的评价指标
- cpu利用率
- 系统吞吐量
- 周转时间
- 等待时间
- 响应时间
- 总结
操作系统的概念、功能、目标
操作系统的概念
- 负责协调软件和硬件的计算机资源工作
- 为上层应用提供简易的服务
- 操作系统是系统软件,而不是硬件。
操作系统的功能和目标
- 操作系统作为系统资源的管理者需要提供什么功能?
- 操作系统作为用户和计算机硬件之间的接口需要为上层用户、应用提供简单服务,需要实现什么功能?
- 操作系统作为最接近硬件的层次,需要在纯硬件基础上实现什么功能?
补充
进程是程序的执行过程,需要把程序放入内存才能被cpu处理
作为系统的资源管理者
- 找到执行文件的位置qq.exe,找到的这个位置依靠的就是文件管理
- 双击点击执行文件,如qq.exe,这个时候就要把程序加载进内存,这个就是内存管理也可以说是存储器管理。
- qq程序正常运行,这个就是处理机管理
- qq视频聊天需要使用到摄像头,设备管理
作为用户和计算机硬件之间的接口
- 命令接口:允许用户直接使用
- 程序接口:允许用户通过程序间接使用
- GUI:现代操作系统最流行的图形用户接口
命令接口(允许用户直接使用)
联机命令接口:用户说一句,系统做一句,这种就是交互式的命令接口,比如cmd
脱机命令接口:用户说一堆,系统做一堆。
程序接口
- 比如调用一个user32.dll,用户只能间接使用。
- 由一组系统调用组成。也可以被称为广义指令。
GUI
- 可以通过图形界面进行操作,而不需要复杂的命令和参数
作为最接近硬件的层次
- 能够提供给裸机资源管理,方便用户服务功能。把裸机改造成更强大功能的机器。
- 把软件覆盖的机器称为扩充机器,也可以称为虚拟机
总结
- 这个小节主要讲解了操作系统的概念负责协调软硬件的计算机资源,为上层用户和应用提供服务的软件就是操作系统
- 操作系统的三个功能
- 资源的管理者(文件,处理机,存储器和设备)
- 向用户提供服务
- 联机命令接口:相当于类似cmd,交互式
- 脱机命令接口:这种就是预先写好一堆命令然后操作系统执行返回一堆结果
- 程序接口:就是一组系统调用,用户程序只能间接调用
- GUI用户图形界面
- 硬件机器的拓展.
操作系统的四个特征
并发
- 多个事件同一时间间隔内发生.实际上是交替发生,宏观上才是同时发生.
- 操作系统的并发性意思就是操作系统的程序交替执行
- 单核操作系统只能执行一个任务,但是可以交替执行
- 操作系统和程序并发是一起诞生的.
共享
- 资源共享,操作系统的资源能够提供给多个并发执行程序使用.
互斥共享
- 意思就是一个时间段只允许进程访问该资源
- 比如qq和微信同时需要视频,但是只能分配摄像头给其中一个
同时共享
- 允许同一个时间段,多个进程同时访问.(这里的同时也可以说是交替)
- qq和微信同时发送文件,这个时候是可以同时取访问内存或者磁盘的.
并发和共享互为存在条件
- 没有了并发相当于只能执行一个程序,共享失去了意义
- 如果没有共享,那么两个程序交替运行就无法同时访问磁盘。
虚拟
- 把物理实体变成若干个逻辑对应物。物理实体存在,逻辑对应物是抽象出来的。
如果一个程序所需要的内存远大于实际内存?
- 可以通过虚拟存储器技术来解决
cpu单核如何处理多个程序?
- 虚拟处理器技术,让用户看上去有多个cpu运行程序
有什么虚拟机技术?
- 空分复用技术(虚拟存储器技术)
- 时分复用技术(虚拟处理机技术,但是如果没有并发性,那么时分复用也是没有作用的。)
异步
- 多个程序不是一次性执行完的,而是走走停停的。比如两个进程,每个进程多个指令,那么这些执行不可能一次执行完,而是异步交替的执行的。
- 异步也是由于并发性导致的。
总结
- 并发和共享是最基本的特征,没有这两个特征就没有虚拟和异步了。
操作系统的发展与分类
手工操作阶段
- 输入输出很慢,因为需要手动写这些二进制数来让机器识别
- 但是机器处理速度非常快,性能被输入拖慢
缺点
- 用户占全机(意思就是只有一个用户在这个时间段使用计算机,下一个用户需要等待前一个用户·1执行完),人机速度矛盾导致资源利用率极低
批处理阶段-单道批处理系统
- 引入了磁带,也就是脱机输入和输出技术,并且通过监督程序负责控制作业输入和输出,相当于就是多个用户提前把纸带通过外围机交给磁带,磁带负责输入和输出,并且有一个程序控制输入输出。
- 这里的监控程序其实就是操作系统的雏形。
优点
- 缓解了人机速度的矛盾,资源利用率有所提升
缺点
- 计算机内存只能运行一个程序,程序是串行执行的。
- 所以CPU大量时间在等待IO。资源利用率不高。
多道批处理系统
- 操作系统引入中断,磁盘能够输出多道程序,并且程序可以通过操作系统来管理并发执行。
优点
- 多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其它资源保持忙碌(意思就是IO的时候可以切换程序执行,不需要让CPU等待该程序执行完IO),系统吞吐量大大提升。
缺点
- 用户响应长,没有人机交互功能。(提交作业后只能等待机器完成。)
多道批处理系统为什么能够让资源利用率大幅度提升?
- 原因可以看下面多个程序如果只能串行执行也就是单道批处理问题就是,系统资源未必能够好好利用,因为输入和CPU和输出设备都是只要使用一次就会空闲。所以多道批处理就可以解决这个问题,前一个程序解决完输入,那么下一个程序就可以开始输入。输入完多道程序之后能够通过操作系统来进行调度,最后输出结果。
分时操作系统
- 以时间片为单位的轮流为每个用户、作业服务。用户可以和计算机进行交互。
优点
- 用户请求可以立刻被响应,解决人机交互问题。允许多个用户同时使用一台计算机。并且用户使用计算机的时候操作独立,对方感知不到对方的存在
缺点
- 不能优先处理一些紧急任务。对于每个任务都是公平执行。
实时操作系统
优点
- 优先响应紧急任务,紧急任务不需要时间片排队
- 对于接收外部的信号之后,规定在一个时间段内处理完成,实时操作系统具有及时性和可靠性。
分类
- 硬实时系统:必须在绝对严格规定时间内完成处理(导弹发射系统)
- 软实时系统:能接受偶尔违反时间规定。(订票)
其它几种操作系统
- 网络操作系统:实现网络中各种资源共享,各台计算机通信
- 分布式操作系统:分布式和并行性,任何工作可以分配到不同的计算机。
- 个人操作系统:Windows XP,MAC OS
总结
- 这个阶段讲解从最简单的纸带->磁带(监控程序)->单道批处理(串行)->多道批处理(并发,但是有控制时间片,所以用户等待时间长,人机无法交互)->分时操作系统(分配时间片,发送请求能立刻执行)->实时操作系统(解决前面的无法处理紧急任务,能够处理绝对时间内完成的任务和偶尔违反时间规定的任务。)
操作系统的运行机制和体系结构
两种指令、两种处理器状态、两种程序
什么是指令?
- 指令就是CPU翻译编程语句为二进制数,机器可以识别的。
指令
- 特权指令:如内存清零,不允许用户程序使用
- 非特权指令:普通运算指令。
cpu如何判断当前是什么类型的指令?通过下面的两种状态。
两种处理器状态
- 用户态(目态):cpu只能执行非特权指令
- 内核态(管态):特权指令、非特权都可以执行
- 状态通过程序状态寄存器(PSW)中某个标志位来进行标识的。0是用户态,1是核心态。
两种程序
- 内核程序:操作系统内核程序就是系统的管理者,可以执行特权指令,运行在核心态
- 应用程序:为了保证系统安全,只能执行非特权指令。运行在用户态
操作系统的内核
操作系统哪些功能需要内核程序实现?
- 操作系统层还能细分
- 下面4种就是大内核,后面3种加起来就是微内核体系结构。
- 进程管理,存储器管理,设备管理(有的操作系统不会把这部分划分到内核功能。)
- 比如时钟管理:计时
- 中断处理
- 原语(设备驱动、CPU切换):最接近硬件的部分,程序运行具有原子性。
- 内核是计算机配置的底层软件,是操作系统最基本、最核心的部分。
操作系统的体系结构
大内核
- 操作系统主要功能都作为系统内核,运行在核心态。
- 负责了大部分事情
优点
- 高性能
缺点
- 内核代码太庞大。
微内核
- 内核不能缺少的部分。
- 负责更少的事情,更容易管理
优点
- 代码轻量,方便维护,内核功能少
缺点
- 需要经常在核心态和用户态之间切换。
总结
- 运行的两种指令,引出两种类型的处理器状态,核心态由引出了操作系统内核
- 操作系统内核包括了进程,存储器,设备管理,同时包括时钟,中断,原语等必须的功能。
- 根据内核由可以划分两种大内核和微内核。
- 大内核:操作系统的内核包含所有的主要功能
- 微内核:操作系统内核只有必须的功能。
中断和异常
中断的概念和作用
早期的计算机
- 串行执行导致计算机资源利用率很低。
引入中断机制
- 发生中断意思就是需要操作系统介入,开展管理功能。
- 当进程1时间片用完,计时部件发送中断信号说明时间片已经用完,然后cpu切换到核心态,cpu使用交给了核心态也就是操作系统使用。操作系统对中断信号进行处理。
- 中断结束,把cpu交还给用户。进程2就在用户态下执行。
- 如果进程2需要打印机(相当于IO操作),需要操作系统介入,那么可以系统调用,申请转换到内核态,对中断进行处理,中断进程2,让进程3先开始运行,进程2等待。如果打印设备执行结束,会向CPU发出中断信号。让操作系统介入。。。
总结
- 中断发生,cpu立刻进入核心态
- 中断发生,切换到内核,操作系统内核(内核其实就是操作系统的程序)对中断进行处理。
- 中断不同,处理不同
- 中断可以让系统从用户态转换到核心态。转换只需要修改PSW
中断的分类
内中断(异常、例外、陷入)
- 来源:cpu的内部与当前执行指令有关
- 自愿中断:指令中断,比如系统调用
- 强迫中断
- 硬件故障(缺页)
- 软件中断(比如除以0)
外中断
- 来源:cpu外部与当前执行指令无关
- 外设请求:IO设备发出的中断信号
另一种分类方式
主要是内中断
- 陷阱、陷入:比如系统调用,主动中断
- 故障:比如缺页可以自己修复的中断。错误条件引起的,可能被故障处理程序修复。
- 终止:不可修复的致命错误造成的结果,导致程序不再将控制返回引发终止的程序,比如整数/0
外中断的处理过程
- 每条指令执行完都需要检测是否有外设的中断信号
- 如果有那么就要保护当前进程状态并且中断(保存PSW,程序计数器,各种通用寄存器)
- 根据中断信号转入相应的中断处理程序。
总结
- 介绍了中断的概念,把cpu从用户态转换到核心态,把cpu交给操作系统来处理内核程序。主要就是各种调度,中断是唯一能够把用户态调整为核心态的操作
- 还有就是中断的分类。
- 内中断(陷阱、故障、终止)
- 外中断(IO外部设备。)
- 接着就是外中断的处理过程
- 每次执行指令都需要检测外部的中断信号
系统调用
什么是系统调用,有什么作用?
- 暂时可以简单理解为,这是为应用程序,编程人员提供的特殊函数,能够获取操作系统的一些服务。
操作系统为什么要提供系统调用功能?
- 防止用户随意使用系统资源,比如打印机,如果我在打印的时候,别人也来直接点击打印,可能就会造成文章混杂到一起。但是如果我和另一个人都是发送请求给打印机,那么打印机就会根据请求来处理打印机的打印资源和执行先后。
- 所以它可以解决用户随意使用系统共享资源,并且要求用户通过系统调用发送请求,让操作系统自己来协调系统资源。
- 只要是对共享资源进行操作都需要进行系统调用保证系统的稳定性和安全性。
- 系统调用相关处理要在核心态,因为有一些特权指令要执行。
系统调用和库函数的区别
- 操作系统提供系统调用,屏蔽对硬件操作的细节
- 库函数提供给上层,有些函数直接封装了系统调用,屏蔽掉系统调用的细节。
系统调用背后的过程
- 根据用户提供的参数执行系统调用。
- 然后系统调用之后转换成内核态就是操作系统开始执行内核的代码
- 不同系统调用就是通过参数来进行辨认的。通过int x指令来调用
- 最后执行完核心态代码就会返回到用户态。
- 陷入指令在用户态下执行。陷入指令执行一个内中断,cpu进入核心态。
- 发出系统调用请求是在用户态,系统调用处理是在核心态。
- 陷入指令是唯一一个能够在用户态执行,而不能够在核心态上面执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dlf5oMkf-1637588466485)(https://gitee.com/yueyingstar/image/raw/master/img/image-20211122120402757.png)]
总结
- 主要就是讲解了为什么要系统调用,为了防止用户随便调用共享资源,保证系统的安全性
- 系统调用和库函数的最主要区别就是所在的层不同,系统调用主要是操作系统提供给上层的屏蔽硬件操作的,库函数提供给用户使用,而且屏蔽系统调用的细节。
- 最后就是系统调用的过程
- 通过系统调用指令发送请求,并且转换CPU状态
- 操作系统执行之后就会转换回用户态。
进程的定义、组成、组织方式、特征
- 只有单道程序的时候,程序段和数据段能够直接通过特殊的定位方式定位内存的位置
- 但是多道程序之后出现的问题就是程序段和数据段变多,那么就需要定位每个程序的位置。这个时候就需要进程的来进行管理
进程的定义
-
为了方便管理各个程序执行,引入了进程和进程实体的概念。
-
还引入了PCB、数据段+程序段组成了进程实体,PCB就是进程结构,用于定位数据段和程序段的位置。
-
PCB是进程存在的唯一标志
-
进程是进程实体的运行过程,是系统进行资源分配和调度的独立单位。
-
进程实体是静态的,进程是动态的。
进程的组成
- PCB包含操作系统所需的各种信息。
- 程序段存放程序代码
- 数据段存放对应的全局、局部变量等。
进程的组织
进程的组织方式
- 链接方式
- 按照进程的状态把PCB划分为多个状态
- 操作系统持有各个队列的指针
- 执行指针:指向当前运行的进程
- 就绪队列指针:优先级别高的放在队头。
- 阻塞表队列指针
- 索引方式
- 根据进程状态不同,建立索引表
- 操作系统持有各个索引的指针。
进程的特征
- 动态性:程序执行是动态的
- 并发性:多个进程实体和各进程并发执行
- 独立性:进程独立运行,独立获取资源,独立接收调度的基本单位, 进程是资源分配,接收调度的基本单位
- 异步性:各个进程独立,不可预知的速度执行
- 结构性:PCB+程序段+数据段
总结
- 介绍了进程的组成,包括PCB+程序段+数据段
- 进程的组织,可以通过两个队列或者是两个索引表来进行定位和切换。
- 还有就是进程的5个特征
- 动态
- 并发
- 独立
- 异步
- 结构。
进程的状态和转换
进程的状态–三种状态
- 运行态:占用cpu,正在运行
- 就绪态:具备运行条件,但是没有抢到cpu。拥有了除了处理机之外的所有资源。
- 阻塞态:因为某个事件不能执行。等待打印机等外设的处理结果
进程另外两种状态
- 创建态(新建):系统为新的进程分配资源,比如PCB,程序段,数据段
- 终止态(结束):进程从系统内撤销。
进程的状态转换
- 创建态到就绪态,系统完成创建之后就会把程序转换为就绪态
- 进程被调度,这个时候就绪态就会转换为运行态
- 运行态,可以通过主动系统调用来变成阻塞态,比如请求打印机
- 对于阻塞态来说就是需要等待一个事件的信号来唤醒,它是一个被动的过程。
- 阻塞态唤醒之后就变成就绪态,但是就绪态是不能转换为阻塞态的,原因就是就绪态没有获取cpu无法执行系统调用。
总结
- 介绍了5种状态
- 以及状态转换需要的事件
- 就绪->运行:调度
- 运行->就绪:时间片结束,或者被优先级更高的进程抢占
- 运行->阻塞:等待资源分配或者是事件发生(主动行为)
- 阻塞->就绪:事件或者资源得到(被动)
- 创建->就绪:系统完成创建进程的相关工作
- 运行->终止:进程结束或者是遇到不可修复的错误。
进程控制
什么是进程控制?
- 进程控制的主要功能是对操作系统所有的进程实施有效的管理,可以创建进程,撤销进程,实现进程的状态装换。
如何实现进程控制?
- 创建->就绪:修改PCB内容,相应队列
- 就绪->运行:恢复进程运行,修改PCB和相应的队列。
- 运行->就绪:保存进程的运行环境,修改PCB内容和相应的队列。
- 运行->阻塞:保存进程运行环境,修改PCB内容和响应的队列。
- 阻塞->就绪:修改PCB内容,和相应的队列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HA5OJbNM-1637588543797)(https://gitee.com/yueyingstar/image/raw/master/img/image-20211122190117990.png)]
- 原语:执行期间不能被中断,这里的原语的意思就是原子操作,把原语代码通过关中断和开中断框住。关中断意思就是外设不能够在下面这段代码回应中断信号,必须要在开中断的时候才会去检测中断信号。
进程控制相关的原语
意思就是不能被中断的原子操作。
- 更新PCB中的信息
- 所有进程原语一定会修改进程状态标志。
- 切换进程的时候保存当前进程运行环境
- 进程开始前肯定需要恢复进程环境
- 将PCB插入合适的队列
- 分配/回收资源
- 创建原语(无->创建->就绪)
- 申请空白PCB,总不可能只申请一半
- 为新的进程分配所需的资源
- 初始化PCB
- 将PCB插入到就绪队列
- 撤销原语(阻塞/就绪/运行->终止)
- 从PCB集合中查找终止进程的PCB
- 进程如果在执行,立刻剥夺CPU分配给其它进程
- 终止其它所有进程
- 将该进程的所有资源归还给父进程和操作系统。
- 删除PCB
- 还有阻塞原语(运行->阻塞)和唤醒原语(阻塞->唤醒).
- 还有一个切换原语,主要用于进程切换的时候。
总结
- 介绍了什么是进程控制,进程控制的动作包括了好几部分,所以这些操作都不能够被分开,必须要一下子全部执行完的,这种就是原语操作。
- 原语实现依靠的就是关中断和开中断,防止原语代码被中断,影响了原子操作。
- 需要实现原子操作的通常是状态转换的时候,修改PCB和相应的队列,对于运行到就绪,或者是运行到阻塞还需要保存现场的情况,为了下一次再次运行的时候能够恢复。
- 原语类型
- 进程的创建
- 进程的终止
- 进程的阻塞
- 进程的唤醒
- 进程的切换
进程通信
什么是进程通信?
- 进程之间的信息交换
- 进程是分配系统资源的单位,各个进程内存空间是独立的。
- 但是防止两个进程之间的内存直接访问。
进程通信–共享存储
- 两个进程对于共享区的访问是互斥的。
- 共享存储
- 基于数据结构的共享
- 基于存储区的共享:存放的数据格式,内容都是进程决定的。
进程通信–管道通信
- 管道只能使用半双工,某个时间段只能实现单向传输。如果要双向,那么就需要两个管道。
- 各个进程对管道也是互斥的。
- 数据以字符流写入管道,写满之后写进程write系统调用就会被阻塞,读完之后read也会被阻塞。
- 没写满不允许读。没读空不允许写
- 最多只能有一个读进程。
进程通信–消息传递。
- 进程数据交换以格式化的消息为单位,操作系统通过发送消息和接收消息两个原语进行数据交换。
消息传递的方式
消息头
发送进程id+接收进行id+消息类型+消息长度等。
- 直接通信:相当于就是进程1给进程2发送消息,消息加入到进程2的消息缓冲队列,等待进程2取走并且执行任务。
- 间接通信:把信息发送到信箱,并且依靠消息头来进行接收。
总结
- 共享存储的作用就是为了让进程之间进行通信,两种方式
- 基于数据结构
- 基于存储区
- 管道通信
- 半双工
- 写满之前不能读
- 读空之前不能写。
- 消息传递的两个方式
- 直接通信
- 间接通信
线程概念和多线程模型
什么是线程,为什么要引入线程?
- 进程是程序的一次执行,而且对于qq来说,视频、文字聊天、传送文件,不可能是顺序执行,那么它是怎么实现的?传统进程是执行流的最小单位。
- 引入线程能够提高并发度。多个事件可以并发执行。
- 线程成为程序执行流的最小单位
- 线程是基本的cpu执行单位,程序执行流最小单位
- 进程内的各个线程可以并发执行。
- 进程只作为除cpu之外的系统资源的分配单位。
引入线程之后,有什么变化?
资源分配、调度
- 传统的是进程是资源分配和调度的基本单位
- 引入线程之后,进程只是资源分配的基本单位,线程才是调度的基本单位。
并发性
- 传统只能是进程并发
- 引入线程,线程间并发,提升并发度。
系统开销
- 传统进程的切换开销很大
- 线程间并发,同一进程线程切换,因为不需要切换进程环境,这个时候系统开销小
- 线程并发的系统开销减少。
线程属性
- 线程是处理机的调度单位】
- 各个线程可以占用不同cpu,在多核情况
- 每个线程有线程id和TCB
- 线程也有就绪阻塞,运行三种基本状态
- 线程几乎不拥有系统资源
- 同一个进程的不同线程共用同样的系统资源
- 同一进程的线程通信不需要系统调用,因为有同样的共享资源
线程实现方式
用户级线程
- 用户级线程由应用程序通过线程库实现。所有线程管理工作都是应用程序负责
- 在用户看来是多线程,但是对于操作系统内核是无法感知到的
内核级线程
- 内核级线程通过操作系统内核管理。
- 内核级线程才是处理机分配单位,对于下面的图来说,现在如果有4核的处理机,但是由于只有两个内核级的线程,所以只能被分配到两个核,每次只能有两个用户级线程在工作。
多线程模型
- 对于第一种多对一
优点:用户级线程切换在用户空间可以完成,不需要切换到核心态。开销小
缺点:如果一个用户级线程被阻塞,整个进程就会被阻塞。那么多个线程不能在多核处理机上执行。
- 一对一
优点:并发度高,一个线程被阻塞,其它线程还能够继续运行
缺点:一个进程占用多个内核级线程,线程切换交给了操作系统内核,需要切换到核心态,线程管理成本很大。
- 多对多
解决了上面的两个缺点。
总结
- 线程引入解决了一个进程的多个功能并发。
- 线程的属性
- 多线程模型
- 多对一:问题就是如果一个用户级线程被阻塞,导致整个进程都会被阻塞,因为一个进程只是对应着一个内核级的线程。内核级的线程才是分配处理机的基本单位。也就是说现在每个进程都有一个对应的内核级的线程。
- 一对一:用户级线程有多少个,那么内核级线程就有多少个,占用的内核级线程比较多,但是解决了阻塞的并发问题。问题是每次切换线程的时候都需要通过系统调用才能切换到另外一个线程。而不能通过应用来完成用户级线程的切换。
- 多对多:这个时候多个用户级线程对应多个内核级的线程,也就是进程有多个内核级线程,切换的时候是可以直接切换用户级的线程,而不需要转换到内核级线程的切换。但是他只是个折中方案,有的时候还是需要内核级线程切换调度的。
处理机调度的概念、层次
调度的基本概念
- 任务太多,但是资源有限,这个时候就需要指定规则决定处理任务的顺序,这个就是调度。
- 处理机调度,就是从就绪队列按照一定算法选择一个进程并将处理机分配给它运行。
调度的三个层次–高级调度
- 内存有限不能把所有进程加载进内存。
- 高级调度按照一定规则选择一个,并且分配内存,创建PCB
- 作业调入创建PCB,调出撤销PCB
- 从后备队列选择一个调入内存。
调度的三个层次–中级调度
- 引入虚拟存储技术,可以把暂时不能运行的进程调到外存,当又具备条件,并且有内存的时候才会调入内存执行。提高内存的利用率和系统吞吐量。
- 这个时候进程的状态就是挂起。但是PCB仍然是常驻在内存。只是程序段和数据段这些存入了外存。
- 中级调度就是把哪个挂起的进程重新调入内存。可能发生多次。
补充知识:进程的挂起与七状态模型
- 就绪如果发现内存不够就会把程序存到外存就绪挂起,内存空间空闲,那么就会转换回就绪态。
- 运行态可以在某种系统调用下进入就绪挂起。
- 创建如果发现内存不足,那么就会进入到就绪挂起。或者是阻塞到阻塞挂起。也是把内存的进程映像存入到外存。
- 阻塞挂起是不满足条件,而且内存不够的时候进程存入外存,PCB仍然在内存,所以当接收到阻塞IO完成的中断信号的时候就能够进入到激活到就绪挂起。
挂起和阻塞的区别
- 挂起和阻塞都是暂时无法使用cpu
- 挂起把进程的映像存到外存
- 但是阻塞状态的时候并没有把映像存入外存
映像就是程序段+数据段。但是PCB仍然存在内存。
调度的三个层次–低级调度
- 从就绪队列选择进程
- 进程调度是最基本的调度。调度频率非常高。
总结
- 高级调度就是把外存未执行的作业根据算法选择一个加载进内存。作业调度,面向作业,外存到内存,频率很低。无到创建到就绪。
- 中级调度就是把那些挂起队列的进程调度到内存。内存调度,面向进程,外村到内存,挂起到就绪。
- 低级调度就是把就绪队列的进程调度到内存。进程调度。内存到cpu,频率最高。就绪到运行。
进程调度的时机、切换与过程、方式
进程调度的时机
可以调度的情况
- 运行的进程主动放弃处理机
- 进程正常终止
- 发生异常
- 主动请求IO阻塞
- 被动放弃
- 分给进程的时间片用完
- 有更紧急的任务需要处理
- 有更高优先级的进程进入就绪队列
不能调度的情况
- 处理中断过程
- 进程在操作系统内核程序临界区。内核的程序临界区,通常是访问内核的数据结构就绪队列,如果这个时候发生进程调度,那么就绪队列被锁住是无法使用的。因为访问内核临界区是不能够切换和调度。
但是这里一定是操作系统内核,而普通的临界区是可以调度的。普通的临界区比如访问打印机,如果这个时候无法调度,那么并发度就会非常差,cpu处于空闲状态。
- 原子操作的过程中。原语,状态改变。
进程调度的方式
非剥夺调度方式
-
非抢占式
-
允许进程主动放弃处理机
-
虽然系统开销小,但是问题是无法处理紧急任务
剥夺调度方式
- 抢占式
- 可以被更紧急任务优先调用cpu
进程切换与过程
- 狭义的进程切换指的是从就绪队列选中一个要运行的进程
- 进程切换指的一个进程让出处理机,由另一个进程占用处理机的过程。
- 广义进程调度选择一个进程和进程切换
进程切换的过程
- 对原来运行的各种数据保存
- 对新进程恢复
总结
- 两种进程调度方式
- 抢占式:这种就是进程一直运行,直到结束或者出现异常
- 非抢占式:进程可以被紧急任务抢占CPU优先执行。
- 切换的过程,保存当前和恢复新的。
调度算法的评价指标
cpu利用率
- cpu处于忙碌时间的占比
系统吞吐量
- 单位时间完成任务的数量
周转时间
- 提交到完成花了多少时间
- 包含四个部分
- 在后备队列等待的时间
- 就绪队列等待的时间
- 进程在CPU执行
- 等待IO的时间。
- 作业周转时间=作业完成时间-作业提交时间。
带权周转时间
- 作业周转时间除以作业实际的运行时间。
- 带权周转时间之和/作业数就是平均带权周转时间
等待时间
- 希望自己的作业等待时间越少越好。
- 等待时间指的是处于等待处理机状态时间之和。
- 对于进程来说等待时间是进程建立之后等待被服务的时间之和。
- 对于作业等待时间来说,还要计算再后备队列等待的时间。
响应时间
- 响应时间,用户提交请求到首次响应的时间。
总结
- 等待时间和周转时间不同的地方就是一个面向进程,一个面向作业。对于作业来说还需要加上后备队列等待的时间。
- 接着就是cpu利用率,系统吞吐量(总共的作业/总共花费的时间 )等。