1.并发:宏观上是同时发生的,微观上是交替发生的。
操作系统的并发性:计算机系统“同时”运行着多个程序,宏观上看是同时运行着的,微观上看是交替运行的。
考点:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行;而多核CPU中,多个程序可以并行的执行。
2.并行:同一时刻同时发生
3.共享:指系统中的资源供内存中多个并发执行的进程共同使用。
4. 虚拟:将一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑上的对应物是用户感受到的。
5.虚拟存储器技术:比如,我的电脑只有4GB内存,而GTA5需要4GB的运行内存、QQ需要256MB内存,网易云需要256MB的内存.......但是他们还可以在电脑上同时运行,这就是虚拟存储器技术,实际上只有4GB内存,在用户看来远远大于4GB。
6.虚拟处理器技术:比如,在某单核CPU中,用户打开了QQ、网易云、微信等软件,实际上只有一个单核CPU,在用户看来,有多个CPU在同时为自己服务。
内中断:陷入(trap),故障(fault),终止(abort)
外中断:时钟中断、I/O中断请求
ps :CPU状态的转换是需要消耗不少的时间,
1.大内核:除了硬件关系最紧密的:原语、时钟管理、中断处理 ,还将进程管理、存储管理、设备管理放在内核中
优点
缺点
2.微内核:只将与硬件关系最紧密的:原语、时钟管理、中断处理 放在内核。
优点
缺点
3.分层结构:一层一层的结构,最底层是硬件,最高层是用户接口,每层只可以调用更低一层。(如:层1只能调用层0,也就是硬件层;层3只能调用层2)
优点
缺点
4.模块化:将内核分为多个模块,各模块之间相互协作
优点
缺点
5.外核
磁盘分为几个分区:主引导记录(MBR)、C盘、D盘、E盘。
主存分为:RAM、ROM(BIOS:Basic Input/Output System)。平时我们所说的手机内存、电脑内存就是RAM
操作系统引导(开机过程):
有两类用户管理程序(VMM--Virtual Machine Monitor)
第一类VMM
第二类VMM
进程的状态:创建态(又称:新建态)、就绪态、运行态、阻塞态(又称:等待态)、终止态(又称:结束态)
进程的转换:
王道考研
其中,
进程的组织:
1.共享存储
需要互斥的访问共享控件(由通信进程自己负责实现互斥)
2.消息传递
3.管道通信:在内存中开辟一个大小固定的内存缓冲区,数据只能单向的(像水流一样)从一个进程通过管道流向另一个进程
CPU不可能空闲下来,如果没有进程执行的话,就执行闲逛进程。因此,闲逛进程就是进程调度的备胎。
单队列
维护一个全局就绪队列,为所有CPU共享。注意:CPU在挑选进程的时候,需要上锁,以防各个CPU调度了相同的进程
多队列
每个CPU都有自己单独的调度队列,
一个时间段只允许一个进程访问的资源叫做临界资源;而对临界资源的访问,必须互斥地进行
锁:其实可以理解为一个bool型变量
一对原语:wait(S)原语和signal(S)原语,做题时候通常把这两个操作简称为P(S)、V(S)
存在的问题:不满足“让权等待”,会出现“忙等”
信号量机制----记录型信号量:为了解决整型信号量的“忙等”问题。
- /*记录型信号量的定义*/
- typedef struct{
- int value;//剩余资源数
- struct process* L;//等待队列
- }semaphore;
-
- void wait(semaphore S){//wait 原语
- S.value--;
- if(S.value < 0){//说明此时没有可用资源,将该进程从运行态变为阻塞态
- block(S.L);//让他进入等待队列
- }
- }
-
- void signal(semaphore S){//signal原语
- S.value++;
- if(S.value <= 0){//说明此时还有进程在等待该资源
- wakeup(S.L);//唤醒等待队列中的一个进程,将该进程从阻塞态变为就绪态
- }
- }
1.信号量实现进程的互斥:通过semaphore 一个变量 mutex(互斥信号量,初始值为1),然后通过P、V操作完成
2.信号量实现 进程的同步:让各并发的进程按照要求有序地推进。(比如,进程2的代码需要在进程1代码的基础上实现)
信号量机制实现进程同步:前V后P、且同步信号量需要初始化为0
3.信号量机制实现进程前驱:设置多个同步信号量
总结:
注意:
系统一共有四种进程,三个抽烟者进程和一个供应者进程。
我们将桌子抽象为容量为1 的缓冲区,需要互斥访问。
但是上图,如果 有源源不断的 读进程来访问,那么count会一直++++++,从而造成信号量rw一直没有被解锁,进而造成写进程的“饿死”。 此时可以再增加一个信号量,来实现“写优先”
定义:多个进程在执行过程中,因为争夺同类资源且资源分配不当而造成的相互等待的现象,若无外力作用,它们都将永远无法继续执行,这种现象叫死锁。
ps:循环等待 未必 会死锁 ,死锁 必定 循环等待3
破坏互斥条件
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
上图中,如何决定对谁动手呢?
1.进程优先级
2.进程已进行了多长时间
3.进程还要多久完成
4.进程已经使用了多少资源
5.进程是交互式的还是批处理式的。
内存可存放数据。程序 原本存放在外存(磁盘)中,但是磁盘的读写速度很慢,而CPU的处理速度很快,因此程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾
内存地址从0开始,每个地址对应一个存储单元,如果计算机是“按字节编制”,则每个存储单元大小为1字节,即1B,即8个二进制位
装入的三种方式:
绝对装入:知道装入模块在内存中的实际起始地址100,再加上逻辑地址79,就成为了绝对装入(直接将地址为179的数据读入寄存器)
可重定位装入(静态重定位):编译、链接后的装入模块的地址都是从0开始,将装入模块装入的内存的合适位置时候,装入时,对里面的所有地址“重定位” ,将逻辑地址全部变成物理地址(地址变换是在装入时一次完成的)。 注意:在静态重定位中,作业一旦进入内存中,在运行期间是不可以移动的,也不能够再申请空间
动态重定位(动态运行时装入):需要借助一个重定位寄存器(存放装入模块存放的起始位置),在读取其中的指令时,每次会将读取到的逻辑地址 加上 重定位寄存器里面存放的起始地址,从而形成绝对地址
从写程序到程序运行:
①每个源文件(.c) 经过编译 成为目标文件(.o)(编译就是把高级语言翻译为机器语言)
②将所有目标文件 经过链接 形成一个大的 准入模块(.exe)
人们引入覆盖技术,用来解决“程序大小超过计算机物理内存总和”的问题。
覆盖技术的原理:将一个程序分为多个程序段,然后一些常用的段放在固定区,不常用的段放在覆盖区。有一个固定区,及若干个覆盖区。(不可能同时访问的程序段可以共享一个覆盖区)
操作系统不知道哪些是可以覆盖、哪些是常用,因此需要程序员声明覆盖结构。
缺点:对用户不透明,增加了用户的编程负担,
内存紧张时,换出某些进程到外存上,以腾出内存空间,再换入某些进程;磁盘分为对换区和文件区,换出的进程放在对换区(对换区的I/O速度相对来说更快)
被暂时换出外存(磁盘)等待的进程为挂起状态(挂起态,suspend)
注意:PCB是常驻内存的,不会被换出外存。
问:为什么不把PCB也换出外存呢? 因为进程被换出外存,需要记录存放到外存的哪块地址上,这些信息可以存放到进程自己的PCB中,因此PCB常驻内存。
覆盖是在同一个进程中的,而交换是在不同进程(作业)之间的
考点:采用可变分区分配管理主存时,无法实现虚拟存储器。
内部碎片:分配给进程的内存区域中,有些部分没有用上
外部碎片:内存中,某些空闲分区太小了,进而难以将其分配给进程
当多个休闲分区都能满足需求时,选择哪一个分区呢?
算法思想:每次从低地址开始查找第一个能够满足要求的空闲分区。
算法思想:优先使用更小的空闲分区
如何实现:空闲分区按照容量递增次序链接,每次分配内存时,顺序查找空闲分区链,找到第一个能够满足要求的分区
缺点:会留下越来越多的难以利用的小的分区,因此这种算法会产生很多外部碎片
算法思想:优先使用更大的空闲分区
如何实现:空闲分区按照容量 递减次序链接,每次分配内存时,顺序查找空闲分区链,找到第一个能否满足要求的分区
缺点:会不断地将大分区划分成小分区,最后突然来一个内存需求大的进程,可能没有能够满足这个进程的空闲分区存在了
算法思想:首次适应算法每次都要从链头开始查找,增加了查找的开销。如果每次从上次结束查找的位置开始检索,就可以解决上述问题。
如何实现:空闲分区以地址递增的顺序排列,每次分配内存的时候,从上次结束的位置开始查找空闲分区链(或者空闲分区表),找到第一个能够满足要求的分区
注意:a.因为首次适应算法和邻近适应算法中,空闲分区是按照低地址到高地址的顺序排列,当空闲分区的大小发生变化的时候,无需对整个链表重新排序,因此这两种算法比最佳适应算法和最坏适应算法开销要小 b.综合来看,首次适应算法是最优的
快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓存(不是内存),用来存放最近访问的页表项的副本。与之对应的,就是内存中的页表,也称为慢表。
注意:快表是一个硬件,当进程切换的时候,快表中的数据也要对应的清空
两级页表的逻辑地址的结构:(一级页号、二级页号、页内偏移量)
为离散分配的页表再建立一张页表,成为页目录表、外层页表、顶层页表。
1.分段存储和分页存储的一大差异:分页是每页大小固定,分段是每段的大小不固定,
2.分段存储管理中,每段都有一个段名,每段从0开始编址。每个段在内存中占用连续空间,但是各段之间可以不相邻
3. 段号的位数决定了每个进程最多可以分几个段;段内地址的位数决定了每个段的最大长度是多少
4.各个段在内存中是离散存储的,因此也需要“段表”:段表项中包含 段号、段长、基址
一个进程先按照逻辑模块分段,再将各段分页。
在此管理方式中,一个进程对应一个段表,段页表中存放段号、页表长度、页表存放快号。即一个进程对应一个段表,也意味着对应多个页表
虚拟内存技术的提出是 基于 局部性原理
虚拟内存的由来:
基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的留在外存,就可以让程序执行。
在程序执行过程,当所访问的信息不在内存的时候,操作系统就从外存上调入内存。
若内存空间不够用时,就将内存上暂时用不到的信息换出到外存上。
在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。
虚拟内存的三个主要特征:
多次性:无需在作业运行时一次性装入内存
对换性:在作业运行时,无需一直常驻内存,而是允许作业在运行过程中,将作业换入、换出
虚拟性:在逻辑上扩充了内存大小,让用户看起来内存比实际上大很多
虚拟内存的实现:
拿到逻辑地址,找到对应页表项后,发现对应页面未调入内存,则产生缺页中断,引发一个内中断,如若此时内存不够,则需要根据页面置换算法,选择页面换出到外存;页面调入内存后,需要修改相应的页表项
注意:缺页中断是内中断,属于内中断中的“故障”
每次选择淘汰的页面是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
但是操作系统无法预知页面访问序列,因此,最佳置换算法是无法实现的。
每次选择淘汰最早进入内存的页面。
这种算法实现起来很简单,但是会出现Belady现象:即分配的内存块更多,然而缺页次数不减反增。
算法性能差。
每次淘汰的页面是最近最久未使用的页面。
虽然算法性能好,但是实现困难,开销大
简单的CLOCK算法实现方法:
改进型的CLOCK算法
指在请求分页存储管理中,给进程分配的物理块的集合。在采用了虚拟存储技术的系统中,驻留集的大小一般小于进程的总大小
驻留集有两种分配策略:
刚刚换出的页面马上又要换入内存,或者 刚刚换入的页面马上又要换出到外存,这种频繁的页面调度现象称为抖动、或颠簸。
产生这一现象的主要原因:分配给进程的物理块不够
驻留集的大小一般不能小于工作集的大小
文件的分配方式-----连续分配
在逻辑地址上连续的逻辑块,存放在物理地址上时,也应该保持原有顺序,连续存放
文件的分配方式-----链接分配
采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显示链接。
显示链接::将用于链接文件各物理块的指针显示地存放在一张表中,即,文件分配表(FAT,File Allocation Table)。FAT是一个磁盘对应一张。
隐式链接:只支持顺序访问,不支持随机访问
文件的分配方式-----索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表是一个文件对应一张。
成组链接法
硬链接:各个用户的目录项指向同一个索引结点
软链接:其实就是快捷方式,原理是重定向,当打开它的文件时,自动就跳到了另一个文件。
硬链接的优点:某用户想要删除文件时,知识删除该用户的目录项,且count - -,只有count==0时候,才能真正的删除文件数据和索引节点;一个硬链接占用的空间很小
缺点:只能对已经存在的文件进行创建
软链接的优点:可以对不存在的文件或目录进行创建。
缺点:如果指向的原文件被删除了,则相关的软链接称为死链接;占用空间比较大
优点:空间开销不大,验证口令所需时间也不大
缺点:正确的口令 存放在系统内部,不够安全
优点:保密性强,不需要在系统中存储密码
缺点:加密/解密 需要耗费一定的时间
在每个文件的FCB或者索引结点中增加一个访问控制表,该表中记录各个用户可以对该文件执行哪些操作
静态分配:进程运行之前,为其分配所有需要的资源,运行结束后返还资源
动态分配:进程在运行过程中,动态申请设备资源
磁盘属于一种I/O设备
根据请求到达的顺序,磁头依次移动到相应的磁道
优点:公平;如果请求访问的磁道比较集中的话,算法性能还能过得去
缺点:如果请求访问的磁道很分散,那么性能太差,寻道时间太长
优先处理的请求 是与磁头靠得最近的那个磁道
优点:性能较好,平均寻道时间短
缺点:会产生‘饥饿’现象
为了解决最短寻找时间优先算法中 ,产生的“饥饿”现象。
只有磁头移动到最内侧的磁道时,才可以往外移动;只有磁头移动到最外侧的磁道时,才可以往内移动
为了解决扫描算法中,磁头必须移动到最顶端的缺点
如果磁头移动方向上,已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫LOOK)
为了解决SCAN算法对于各个位置磁道的响应频率不均。
只有磁头向某个特定方向移动时,才处理磁道访问请求,而返回时直接快速移动到起始段而不处理任何请求
如果移动的方向上没有磁道访问请求了,就可以立即让磁头返回到最前面(这个时候的移动不处理任何磁道请求),并且磁头返回到有磁道访问请求的位置即可