负责协调软硬件等计算机资源的工作
为上层用户,应用程序提供简单易用的接口
是一种系统软件
资源的管理者
处理机管理,存储器管理,文件管理,设备管理
对于普通用户:GUI图形界面(手机),命令接口:分别为联机命令接口(说一句做一句),脱机命令接口(说一堆做一堆)
对于程序员:程序接口:即为系统调用
分别为共享,并发,虚拟和异步
其中共享和并发为最基本两个特征,二者互为存在条件
易混淆-并发与并行
并行指的是多个程序(线程)在同一时刻同时允许
并发指的是多个程序在同一时间间隔内发生,宏观同时,微观上交替运行(看cpu是否多核,多核cpu可以在同一时刻执行多个任务,若为单核器cpu在只能是并行)
分为互斥共享和同时共享
互斥共享:在一个时间段内只允许一个进程访问该资源
同时共享:在同一时间段内允许多个进程访问该资源
指的是把物理上的一个实体变为逻辑上的多个对应物
技术层面分为时分和空分
时分可以想到虚拟处理器
空分则可以类比于虚拟存储器
在多道程序环境下多个程序总是以未知的速度前进
手工操作阶段-批处理阶段(单-》多)-分时操作系统-实时操作系统-网络操作系统,分布式操作系统,个人pc操作系统
c语言代码-》编译-》机器所能识别的二进制机器指令—》cpu一条条执行这些二进制指令就是运行程序的过程
应用程序:我们现在在桌面所看到的app就是应用程序
内核程序:微软苹果一帮人所实现的操作系统,写的就是内核程序,内核作为管理者,会让cpu执行一些特权指令这些指令影响重大只允许管理者即内核使用,自此要分为内核态(管态)和用户态(目态)
内核态:可以选择执行特权指令
用户态:只能执行非特权指令
如何区分:psw(一般1是内核态,0为用户态)
内-》用:通过特权指令讲psw中的1-》0
用-》内:一般是通过中断
cpu会运行两种程序,一个是操作系统的内核程序另一个则为应用程序
“中断”是让os内核夺回cpu使用权的唯一途径(因为如果没有中断机制一旦某个应该程序上处理机运行这个应用程序就是会在cpu上一直运行)
内中断:也成为异常或者例外其类型由:陷入,故障和中止,其与当前执行的指令有关,中断信号来自于cpu内部
外中断:也称为中断,其分有时钟中断和IO请求中断,与当前执行指令无关中断信号来自cpu外部
其外中断也可以称为侠义上的“中断”,而此时外中断更偏向于称之为“异常”
陷入:程序故意引起
故障:错误条件所造成的可能被内核程序修复(修复后还给cpu继续执行当前指令(缺页))也可能寄
终止:致命错误引起,无法修复,一般不再将cpu使用权还给该程序(除于零运算)
将操作系统的主要功能模块都作为系统内核,运行在内核态
优点:高性能
缺点:内核代码庞大,系统混乱,难以维护
只把最基本的功能保留在内核
优点:内核功能少,结构清晰,方便维护
缺点:需要频繁的在内核态和核心态之间切换
将内核分为多层,每层单向调用更低一层的功能
优点:便于验证和调试,自底向上逐层验证;易扩充和易维护,各层之间调用接口清晰
缺点:仅可调用相邻低一层,难以合理规定各层的定义;效率低,不可跨层调用,系统调用时间长
将内核划分为多个模块,各模块之间相互协作
内核=主模块+可加载内核模块
主模块:只负责核心功能,如进程调度,内存管理
可加载内核模块:可动态加载新模块到内核而无需重新编译整个内核
优点:模块之间清晰已于维护,确定模块之间接口后多模块并发开发,支持动态加载新的内核模块,任何模块可以直接调用其他模块,无需采取消息传递进行通信,已于维护
缺点:接口定义未必合理,实用;相互依赖,更难调试
内核负责进程调度,进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且用外核负责保证资源的使用安全
优点:外核可以直接给用户进程分配“不虚拟,不抽象”的硬件资源,且有外核负责保证资源使用安全;减少虚拟映射
缺点:降低系统的一致性,是系统变得更加复杂
1.cpu从一个特定的主存地址开始取指令,执行rom中的引导程序(先进行硬件自检,再开机)
2.将磁盘的第一块-主引导记录读入内存,执行磁盘引导程序,扫描分区表
3.从活动分区(又称主分区,即安装了os的分区),读入分区引导记录执行其中的程序
4.从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成开机等一系列动作
进程的进程实体的运行过程, 是系统资源分配和调度的一个独立单位
1.PCB:进程描述信息,进程控制和管理信息,资源分配清单,处理机相关信息
2.程序段:程序的代码(指令序列)
3.数据段:运行过程中产生的各种数据
动态性,并发性,独立性,异步性,结构性
进程控制就是要实现进程状态的转换
进程控制需要是用原语去实现
原语所需要做的无非是
更行pcb的内容,将PCB插入道合适的队列,分配和回收资源
创建,终止,阻塞,唤醒,切换
什么是线程?和进程的区别是啥?
1.线程是一个基本的cpu执行单元也是程序执行流的最小单位。
2.引入了线程之后,进程只作为除cpu之外的系统资源的分配单元
为什么要引入线程?
因为引入线程之后,不仅是进程之间可以并发,进程之内的各线程之间也可以并发,从而提高了系统的并发度,使得一个进程内也可以并发处理各种任务
引入线程之后,有什么变化呢?
从资源分配的角度看,传统进程机制中,进程是资源分配,调度的基本单位,然而引入线程知乎进程只是资源分配的基本单位,线程成了调度的基本单位
从并发度角度看,引入线程之后,各个线程间可以进行并发,提升了并发度
从系统开销来看,传统进程间的并发需要切换的运行环境,系统开销大,线程之间并发,若是同一进程内的线程切换,则不需要切换进程环境,系统开销小,引入线程后并发所带来的系统开销减小
线程的实现方式有哪些
用户级线程,内核级线程,组合模式
用户级线程相关
用户级线程是由应用程序通过线程库实现,所有的线程管理工作都是由应用程序负责(包括线程切换);
用户级线程,线程切换在用户态下即可完成,无需os干预
在用户角度看,有多个线程。但是在操作系统内核看并意识不到线程的存在,“用户级线程”就是“从用户视角看能看到的线程”
优点:变态在用户空间即可完成无需切换到核心态,系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个线程都可能被阻塞,并发度不高。多个线程无法再多核处理机并行运行
多线程模型有几种
一对一模型,多对一模型,多对多模型
什么是一对一模型
即一个用户级线程映射到一个内核级线程
优点:各个线程可分配到多核处理机并行执行,并发度高
缺点:线程管理需要os支持,开销大
什么是多对一模型
即多个用户级线程映射到一个内核级线程
优点:线程管理开销小效率高
缺点:一个线程阻塞会导致整个进程都被阻塞(并发度低)
什么是多对多模型
即n个用户级线程映射到m个内核级线程(n>=m)
即以上二者之长
线程的转换
与进程转换相似随便说说
处理机调度的作用是什么
按某种算法选择一个进程将处理机分配给他
处理机调度的三个层次是什么?简述每个调度的作用?
三个层次分别是高级调度(作业调度),中级调度(内存调度)和低级调度(进程调度)
高级调度:按某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程
中级调度:按照某种规则,从挂起队列中选择合适的进程将其数据调回内存
低级调度:按照某种规则,从就绪队列中选择一个进程为其分配处理机
三种调度的联系对比?
高级调度面向作业,也即是从外存调入内存,发生频率低
中级调度是面向进程,也是从外存调入内存,发生频率比高级调度高但比低级调度低
低级调度面向进程,但是是从内存按某种规则取一个进程放入cpu,发生频率最高
七状态模型比五状态模型多了什么状态
“就绪挂起”和"阻塞挂起"
什么是挂起态?
为减轻系统负载,提高资源利用率,暂时不执行的进程会被调到外存从而变成“挂起态”
什么时候需要进程调度?
一种是进程主动放弃处理机,有三种情况,第一种是进程正常终止,第二种是运行过程中发生异常而终止,第三种是主动阻塞
第二种是进程被动放弃处理机,也有三种情况,第一种是分给进程的时间片用完,第二种是有更紧急的事情要处理(io),第三种是有更高优先级的进程进入了就绪队列
什么时候不能进程调度?
第一种是在处理中断的过程中,第二种是进程位于操作系统内核程序,第三种是原子操作的过程中
进程调度的方式由?
非抢占式和抢占式,简述其操作即可
简述进程切换的过程?
首先是对于原来进行进程各种数据的保存
其次是对新的进程数据恢复(最好联系一个寄存器啊栈啊随便扯一扯)
进程调度和切换是由代价的,并不是调度越频繁并发度越高
闲逛进程
调度进程永远的备胎没有其他就绪进程的时候运行闲逛进程
特性:优先级最低,可以是0地址指令且占一个完整的指令周期(指令周期末尾例行检查中断),能耗低
调度程序决定什么?
让谁运行?运行多长事件
什么事件会触发调度程序?
创建新进程,进程退出,运行进程阻塞,i/o中断发生(可能唤醒某些阻塞进程)
调度算法的评价指标
什么调度算法适用于早期的批处理系统(不关心响应事件)
分别是FCFS,SJF,HRRN(相应比优先)
相应比计算公式?
优先级调度算法
如何设置优先级
系统进程》用户进程
前台进程》后台进程
操作系统更加偏向于io繁忙型进程(相对cpu繁忙型进程)
多级反馈队列调度算法
多级队列调度算法
由读者和写者两组并发进程,共享一个文件,其具有以下几点要求:1.允许多个读者同时对文件执行读操作;2.只允许一个写者往文件中写信息;3.任一写者完成写操作之前不允许其他读者或者写者工作;4.写者执行写操作前,应让已有的读者和写者全部退出当前共享访问区
为了解决什么问题?
研究如何解决进程死锁的问题
如何防止死锁的发生?
1,对哲学家进程施加一些限制条件,入最多允许n个哲学家同时进餐
2,要求奇数号哲学家先拿左边的筷子再去拿右边的筷子
为啥要引入管程?
为了解决信号量存在的问题:编写程序困难,易出错
管程由哪些部分组成?
1,局部与管程的共享数据结构说明;
2,对该数据结构进行操作的一组过程
3,对局部于管程的共享数据设置初始值的语句
4,管程有一个名字
其有什么特征?
1,局部于管程的数据只能被局部于管程的过程所访问
2,一个进程只有通过调用管程内的过程才能进入管程访问共享数据
3,每次仅允许一个进程在管程内执行某个内部过程
联想到java中的类,构造方法和成员方法会好理解一点
补充:
各个进程必须互斥访问管程的特性是由编译器实现的
可在管程中设置条件变量及等待/唤醒操作以解决同步问题
在进入区只做检查,不上锁
在退出区吧临界区的使用权转交给另一个进程(相当于在推出去即给另外一个进程解锁又给自己上锁)
问题:不遵循“空闲让进原则”
在进入区先检查后上锁,退出区解锁
主要问题:不遵循“忙则等待”原则
先加锁后检查,退出区“解锁”
主要问题:不遵循“空闲让进,有限等待”原则,可能导致饥饿
在进入区“主动争取-主动谦让-检查对方是否想进,己方是否谦让“
主要问题:不遵循”让权等待“原则,会发生忙等
有几个点必须会的就是什么时内存,存储单元和内存地址的联系什么是时按字编制按字节编制这些很基础的点必须知道
指令的工作原理?
操作码+若干参数(有可能时地址有可能时立即数主要看操作码指的时什么样的操作)
简述一下写程序道程序运行的过程和其作用?
编辑源代码文件
编译:由源代码文件生成目标模块(高级语言翻译成机器语言)
链接:由目标模块生成装入模块,链接后形成完整的逻辑模块
装入:将装入模块装入内存形成物理地址
简述三种链接方式和其具体作用?
静态链接:装入前链接成一个完整装入模块
装入时动态链接:运行前便装入边链接
运行时动态链接:运行时需要目标模块才装入并连接
三种装入方式分别是什么?作用是什么?
绝对装入:编译时产生绝对地址
可重定位装入:装入时将逻辑地址转换为物理地址
动态运行时装入:运行时将逻辑地址转换为物理地址,需设置重定位寄存器
内存管理需要做的事情是什么?
内存空间的分配和回收
内存空间的扩充(实现虚拟性)
地址转换-三种方式(绝可动态)
存储保护:保证各个进程在自己的内存空间内运行不会越界访问
存储保护的两种方式分别是什么?
设置上下限寄存器
重定位寄存器(EA)+界地址寄存器(最大VA)
覆盖技术
覆盖技术是将内存中的空间分为一个固定区(存放最活跃的程序段(main函数)且固定区中的程序段在运行过程中不会调入和调出),若干个覆盖区(不可能同时被访问程序段可共享一个覆盖区且覆盖区中的程序段可在运行过程中根据需要调入和调出),且其覆盖结构必须由程序员自己声明,操作系统完成自动覆盖,缺点是对用户并不透明,增加了用户编程负担
交换技术?
挂起~内存紧张时候,换出某些进程以腾出内存空间再换入某些进程,换出到外存(会将磁盘分为文件区和交换区,换出的进程(挂起态)位于对换区)
覆盖与交换的区别
覆盖是同一个程序或进程中
交换是在不同进程(作业)之间的
为用户进程分配的必须是一个连续的内存空间
其分为单一连续分配,固定分区分配,动态分区分配
只支持单道程序,内存分为系统区和用户区,用户程序放在用户区
有两种分区方式:
分区大小相等,
分区大小不等(分区表or分区链进行管理)
支持多道程序,在进程装入内存时根据进程的大小动态的建立分区
无内部碎片
外部碎片可以用“紧凑”技术来解决
其中所含有的算法
首次适应算法:从头到为找打适合的分区,空闲分区以地址递增次序排列,算法开销小性能表现最好
最佳适应算法:优先使用更小的分区,分区以容量递增的次序排列,会产生很多太小,难以利用的碎片使得算法开销大
最坏适用算法:优先使用更大的分区,以防止产生太小的不可用的碎片,以容量递减的次序进行排列,这使得大分区很快被用完,算法开销大
邻近适应算法:每次从上次查找结束的位置开始查找,按地址递增排序,这会使得高地址的大分区也被用完
基本分页存储的思想?
讲进程分页,各个页面可离散地放到各个内存块中
页表的作用?
页表记录了页面和实际存放的内存块之间的映射关系
一个进程对应一张页表,进程的每一页对应一个页表项,故每个页表项有“页号”和“块号组成”
页号在物理上的隐含的
简述一下页表寄存器的作用?
存放页表起始地址,存放页表长度
简述下地址变化的过程?
首先我们知道进程pcb放在操作系统的,要调用程序要将该进程pcb中保存的页表起始地址和其长度放入页表寄存器,这时候由于要将进程某页某块的信息放入内存,故有一下进程:
1.根据逻辑地址算出页号和页内偏移量
2.页号的合法性检查(与页表长度对比)
3.若页号合法则根据页表的起始地址,页号找到对应的页表项
4.根据页表项中记录的内存块号拼接上一开始就知道的页内偏移量得到最终额物理地址
5.访问物理内存对应的内存单元
----------------------------------------------------------------------------引入快表后----------------------------------------------------------------------------------
什么是快表(TLB)?
快表,又称联想寄存器,是一种访问速度比内存快很多的高速缓存,用来存放 访问的页表项的副本,也可以加速地质变化的速度。
简述下加入快表的地址变换机构?
1.算页号页内偏移量
2.检查页号合法性
3.查快表若命中可以直接知道页面存放的内存块号
4.根据内存块号和页内偏移量得到物理地址
5.访问目标内存地址
简述一下单级页表存在的问题?
所有页表项必须连续存放,页表过大时需要很大的连续空间
在一段时间内并非所有页面都用得到,因此没必要让整个页表常驻内存
两级页表相关
逻辑地址结构(一级页号,二级页号,页内偏移量)
注意:页目录表,外层页表,顶级页表,一个意思
如何实现地址变换?
1.按地址结构将逻辑地址拆成三部分
2.从pcb中读出页目录表始址,根据一级页号查页目录表,找到下一级页表在内存中的存放位置
3.根据二级页号查表,找到最终想访问的内存块号
4.结合页内偏移量得到EA
注意点
各级页表大小不能超过一个页面
访问次数(无TLB)-n级页表-访问n+1次### 连续分配管理
为用户进程分配的必须是一个连续的内存空间
其分为单一连续分配,固定分区分配,动态分区分配
只支持单道程序,内存分为系统区和用户区,用户程序放在用户区
有两种分区方式:
分区大小相等,
分区大小不等(分区表or分区链进行管理)
支持多道程序,在进程装入内存时根据进程的大小动态的建立分区
无内部碎片
外部碎片可以用“紧凑”技术来解决
其中所含有的算法
首次适应算法:从头到为找打适合的分区,空闲分区以地址递增次序排列,算法开销小性能表现最好
最佳适应算法:优先使用更小的分区,分区以容量递增的次序排列,会产生很多太小,难以利用的碎片使得算法开销大
最坏适用算法:优先使用更大的分区,以防止产生太小的不可用的碎片,以容量递减的次序进行排列,这使得大分区很快被用完,算法开销大
邻近适应算法:每次从上次查找结束的位置开始查找,按地址递增排序,这会使得高地址的大分区也被用完
基本分页存储的思想?
讲进程分页,各个页面可离散地放到各个内存块中
页表的作用?
页表记录了页面和实际存放的内存块之间的映射关系
一个进程对应一张页表,进程的每一页对应一个页表项,故每个页表项有“页号”和“块号组成”
页号在物理上的隐含的
简述一下页表寄存器的作用?
存放页表起始地址,存放页表长度
简述下地址变化的过程?
首先我们知道进程pcb放在操作系统的,要调用程序要将该进程pcb中保存的页表起始地址和其长度放入页表寄存器,这时候由于要将进程某页某块的信息放入内存,故有一下进程:
1.根据逻辑地址算出页号和页内偏移量
2.页号的合法性检查(与页表长度对比)
3.若页号合法则根据页表的起始地址,页号找到对应的页表项
4.根据页表项中记录的内存块号拼接上一开始就知道的页内偏移量得到最终额物理地址
5.访问物理内存对应的内存单元
----------------------------------------------------------------------------引入快表后----------------------------------------------------------------------------------
什么是快表(TLB)?
快表,又称联想寄存器,是一种访问速度比内存快很多的高速缓存,用来存放 访问的页表项的副本,也可以加速地质变化的速度。
简述下加入快表的地址变换机构?
1.算页号页内偏移量
2.检查页号合法性
3.查快表若命中可以直接知道页面存放的内存块号
4.根据内存块号和页内偏移量得到物理地址
5.访问目标内存地址
简述一下单级页表存在的问题?
所有页表项必须连续存放,页表过大时需要很大的连续空间
在一段时间内并非所有页面都用得到,因此没必要让整个页表常驻内存
两级页表相关
逻辑地址结构(一级页号,二级页号,页内偏移量)
注意:页目录表,外层页表,顶级页表,一个意思
如何实现地址变换?
1.按地址结构将逻辑地址拆成三部分
2.从pcb中读出页目录表始址,根据一级页号查页目录表,找到下一级页表在内存中的存放位置
3.根据二级页号查表,找到最终想访问的内存块号
4.结合页内偏移量得到EA
注意点
各级页表大小不能超过一个页面
访问次数(无TLB)-n级页表-访问n+1次
传统存储方式具有什么缺点?
一次性:作业数据必须一次全部调入内存
驻留性:作业数据在整个运行期间会常驻内存
局部性原理分为什么?
时间局部性:现在访问的指令,数据在不久后很可能会被再次访问
空间局部性:现在访问的内存大院周围的内存空间,很可能在不久后会被访问
高速缓存技术:使用频繁的数据放在更高速的存储器中
虚拟内存的定义和特征是什么?
定义:程序不需要一次全部装入即可运行,运行时根据需要动态调入数据,如果内存不够,还需要换出一些数据
特征:
多次性:无需在作业运行时一次性全部装入内存,而是允许被分为多次调入内存
对换性:无需在作业运行时一直常驻内存,而是允许在作业运行过程中将作业换入换出
虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量
如何实现虚拟内存技术?
访问的信息不在内存时,由操作系统负责将所需的信息从外存调入内存(请求调页)
内存空间不够时,将内存中暂时用不到的信息换出道外存(页面置换技术)
虚拟内存实现了什么?
请求分页存储管理
请求分段存储管理
请求段页式存储管理
与基本分页管理相比,其页表中加了什么表项?
状态位:标识页面是否已经在内存中
访问字段:记录最近被访问过几次,或记录上次访问时间,供置换算法选择换出页面时参考
修改位:表示页面调入内存后是否被修改过,只由修改过的页面才需在置换时写回外存
外存地址:页面在外存中存放的位置
简述缺页中断机构的工作方式?
找到页表项后检查页面是否已在内存中,若没在内存,产生缺页中断
缺页中断处理中,需要将目标页面调入内存,有必要时还要换出页面
缺页中断属于内中断,属于内中断中的”故障“,可能被系统修复的异常
一条指令执行过程中可能产生多次缺页中断
其地址变换机构的工作方式?
找到页表项时需要检查页面是否在内存中
若页面不在内存中,需要请求调页
若内存空间不够,还需换出页面
页面调入内存后,需要修改对应页表项
在虚拟内存中页面置换算法有哪些?
OPT(最佳置换算法):优先淘汰 最长时间内不会被访问的页面,
优点:缺页率最小,性能最好;
缺点:无法实现;
FIFO:优先淘汰 最先进入内存的页面
优点:实现简单
缺点:性能很差,容易出现Belady异常
LRU:优先淘汰 最近最久未访问的页面
优点:性能很好
缺点:需要硬件支持,算法开销大
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sodAVV06-1677917485861)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230304154200879.png)]
什么是驻留集?
指请求分页存储管理中给进程分配的内存块的集合
什么是固定分配?什么是可变分配?
区别在于前者进程运行期间驻留集大小不变后者可变
什么是局部置换什么是全局置换?
区别在于发生缺页时是否只能从进程自己的页面中选出一块换出
三个置换策略及其作用?
何时调入页面?
预调页策略:一般用于进程运行前
请求调页策略:进程运行时,发现缺页再调页
从外存调页的相关机制?
对换区-采用连续存储方式,速度更快
文件区-采用离散存储方式,速度更慢
对换区足够大:运行将数据从文件区复制道对换区,之后所有页面调入调出都是内存额对换区之间进行
对换区不够大:不会修改的数据每次从文件区调入;会修改的数据调出道对换区,需要时再从对换区调入
UNIX方式:第一次使用的页面都从文件区调入;调出的页面都写回对换区,再次使用时从对换区调入
什么是工作集?
在某段时间间隔里。进程实际访问页面的集合。驻留集大小一般不能小于工作集大小。
什么是内存映射文件?