操作系统-学习笔记

功能

作为用户和计算机硬件之间的接口,协调底层硬件和软件之间的关系,最接近硬件的软件

并行VS并发

在这里插入图片描述

操作系统和程序并发是一起诞生的

同时

这个概念只在宏观上适用,从物理上分析,不存在绝对的同时,都是有误差的,在计算机中,由于计算机的高速计算,导致我们看许多事物是同时发生的,实际上是交替发生的

发展

1.手工操作:用纸带机,打孔是一,反之则零,但打点太慢,CPU会有大量等待时间

2.单道批处理:中间加入磁带,比纸带机快得多,但每次还是一个程序

3.多道批处理:一次读多个程序,操作系统的诞生

4.分时操作系统:以时间片单位,允许多个用户同时使用一台计算机,不足是不能优先处理一些紧急任务

5.实时操作系统:要在严格的时限里完成事件,及时性,可靠性,导弹系统,自动驾驶

运行机制

两种处理器状态:用户态,核心态,区别是CPU的执行权限不同,核心态的更高,用PSW(程序状态寄存器)的某标志位来管理,0为用户态,1核心态

内核:最底层软件,是操作系统的核心部分

中断机制

发生中断意味着操作系统介入,开展管理工作,这意味着操作系统要切换形态,切换到核心态,提高管理权限

内中断:异常,指令中断,硬件故障(缺页),软件中断(整数除零)

外中断:狭义的中断,人工干预,外设请求

系统调用

向上提供简易的服务,包括命令接口,程序接口,程序接口由一组系统调用组成,系统中各种的共享资源都由操作系统统一掌管,由操作系统代为完成。发生在用户态,执行在核心态

场景:去打印店打印,如果各个进程都可以随意使用打印机,那你打印一半,可能会被别人中断

按功能分类:设备,文件,进程控制,进程通信,内存管理

库函数:高级语言提供,隐藏一些细节,不必非要使用汇编语言来实现

进程(动态的)

定义:通过PCB进程控制块,描述进程的各种信息。PCB,数据段,程序段组成进程实体(进程映像),PCB是进程存在的唯一标志

组成:

​ PCB:PID,UID,状态,优先级,程序段指针,数据段指针,各种处理器信息(寄存器信息)

​ 程序段:存放代码

​ 数据段:存放数据

组织方式:对成千上万的PCB进行管理,链接方式(根据进程状态将PCB分为多个队列,操作系统持有各个队列的指针);索引方式(建立索引表,操作系统持有指针)

特征:动态,并发,独立,异步,结构,是有生命的

进程三(五)状态

运行态:占有CPU

就绪态:已具备条件,但由于没有空闲的CPU,暂时不能运行,万事具备,只欠CPU

阻塞态(等待态):等待某一事件而暂时不能运行


创建态:系统完成1创建过程

终止态:进程运行结束,遇到不可修复的错误

进程的控制:以PCB为载体,用原语(特殊的程序)实现,执行期间不能中断,具体有“关中断指令”和“开中断指令”,属于特权指令,必然在核心态

在这里插入图片描述

进程通信

各进程拥有的内存地址空间相互独立,一个进程不能直接访问另一个进程的地址空间

共享存储:既然空间相互独立,不能互相访问,那就用共享空间,基于互斥原则。基于数据结构的共享,速度慢,低级通信;基于存储区,快,高级通信

管道通信:用于连接读写进程的共享文件,半双工通信。当管道写满,写进程会被堵塞;管道变空,读进程被阻塞,读进程最多只有一个

消息传递:消息头,消息体。直接通信,间接通信,间接通讯是先发到信箱里

进程同步,异步

异步性:各并发进程各自独立,不可预知速度

进程同步:解决这种不可预知的弊端,比如,写进程在读进程前

互斥:进入区,临界区,退出区,剩余区;空闲让进,忙则等待,有限等待,让权等待

软件实现:

1.单标志法:每个进程进入临界区的权限只能被另一个进程赋予,违背“空闲让进”,满足条件就会陷入循环中

在这里插入图片描述

2.双标志先检查法:标记各进程想进入临界区的意愿,可能会同时进入临界区,也就是说进入区的检查,上锁操作无法一气呵成

在这里插入图片描述

3.双标志后检查法:为了解决上一个方法的弊端,人们想到先变值,后判断,但会导致都进不去,死锁

在这里插入图片描述

4.Peterson算法:尝试孔融让梨,这里的进入区做了三个判断,中国人算法

在这里插入图片描述

硬件实现:

1.中断屏蔽方法:简单,只适用于内核进程,才有权限执行中断指令

2.TestAndSet指令:硬件实现,不能被中断,一气呵成

在这里插入图片描述

3.Swap指令:交换指令

在这里插入图片描述

线程

轻量级进程,增加并发度。引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。切换进程运行环境,开销大,而线程相对小很多。

用户级线程,内核级线程:操作系统只看得见内核级线程,因此,只有内核级线程才是处理机分配的单位

在这里插入图片描述

多线程模型:多对一(并发弱,一个阻塞了会影响其他的),一对一(各不影响),多对多(组合模式)

处理机调度

概念:银行(vip优先),上厕所(时间短的优先),按照某种规则来决定处理这些任务的顺序

三个层次:
高级调度【作业调度,外存与内存,从外存队列挑选一个作业,建立PCB,获得竞争处理机的权利,作业调出时撤销PCB】。
中级调度【内存调度,引入虚拟存储技术,可将暂时不能运行的进程调至外存等待,称为挂起状态,但PCB会常驻内存。中级调度就是决定哪个挂起状态的进程重新调入内存,发生的频率比高级调度更高】。
低级调度【进程调度,按照某种策略,从就绪队列选取一个进程放入CPU】。

图解:
在这里插入图片描述

进程调度

低级调度:就绪队列 -> CPU

非抢占方式:运行过程中,即便有紧迫的任务,当前进程依然会继续使用,直到进程终止或主动要求进入阻塞态

抢占方式:可优先处理

进程切换的过程主要完成了:对原有数据的保存,对新的进程数据的恢复

指标

CPU利用率:cpu利用时间/总时间

系统吞吐量:单位时间完成作业的数量

周转时间:作业提交给系统到作业完成

周转时间=等待时间+运行时间+(I/O操作时间)

平均周转时间:各作业周转时间之和/作业数


带权周转时间:周转时间/运行时间

平均带权周转时间:各作业带权周转时间/作业数

等待时间,平均等待时间,响应时间

调度算法

FCFS(先来先服务):用于作业调度,考虑谁先到后备队列(外存);用于进程调度,考虑谁先到就绪队列

例题:

在这里插入图片描述

SJF(短作业优先):会导致饥饿现象,如果一直有短作业插入的话

抢占式SJF:最短剩余时间优先

HRRN(高响应比优先Highest response ratio next):先计算响应比,选择响应比最高的,响应比=(等待时间+要求服务时间)/要求服务时间,不会导致饥饿

例题:

在这里插入图片描述

时间片轮转(RR,Round-Robin):根据到达就绪队列的顺序,轮流让各进程执行一个时间片(100ms),一个时间片内若未执行完,将进程重新放到就绪队列队尾。如果时间片分配的太长,就会退化为先来先服务,太小的话,切换太频繁会消耗系统资源

优先级:优先级高的先运行,看清题目中优先数与优先级的关系。就绪队列未必只有一个,可按不同的优先级来组织,也可把优先级更高的排在靠近队头的位置。系统的,前台的进程的优先级高于用户的,后台的,且操作系统更偏好I/O型进程

多级反馈队列:综合以上的优点,很骚气,折中权衡,抢占式,你等的时间多,那我就给你补偿,下次给你更多的时间片,UNIX就是这个算法

例题:

在这里插入图片描述

对比:
在这里插入图片描述

信号量机制(重点)

信号量:表示系统中某种资源的数量,是一种变量,但只能做三种操作即初始化,P操作,V操作

wait,signal原语简称为PV(检测,增量)操作,java里也有相应的语句可以实现

整型信号量:

在这里插入图片描述

记录型信号量:多一个队列来记录

在这里插入图片描述

进程同步:保证“一前一后”执行的两个操作,通过PV拆开两个进程,即使P2先执行也会被堵塞,等待V操作的加一。前操作后进行V操作,后操作前执行P操作

在这里插入图片描述

生产者,消费者(PV实现)

生产者进程生产进程到缓冲区,只要不满就可以继续放,类似管道

这两者看起来像一个环状的结构,我生产你才能消费,我消费你才能生产

在这里插入图片描述

多生产者,多消费者

在这里插入图片描述

实现:不加mutex互斥也可以,原因是只有一个盘子(plate)
在这里插入图片描述

吸烟者问题

问题描述:

在这里插入图片描述

代码实现:offer1是第一种组合的数量

在这里插入图片描述

读者写者问题

两类进程:写进程,读进程

互斥关系:写与写,写与读。读与读不存在互斥,也就是可以多个读者一起读,我写书的时候,别人不能写,也不能读

实现:

在这里插入图片描述

总结:设置count计数器,判断是否是第一个,还是最后一个读进程,从而做出不同的处理(第一个读加锁,最后一个解锁);要解决一气呵成,要用mutex互斥信号量;最后加一层,解决写进程饥饿

哲学家问题

问题描述:

在这里插入图片描述

管程

信号量机制编程难,易出错

管程是一种特殊的软件模块,对数据结构的一组函数,其实就是java的封装,你直接调接口就行

在这里插入图片描述

死锁🔒

在并发环境下,各进程竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象

必要条件:互斥,不剥夺,请求和保持

饥饿:例如之前的短进程优先算法,有源源不断的短进程到来,长进程一直得不到处理,从而引发饥饿

预防死锁:破坏死锁的其中一个条件即可

在这里插入图片描述

在这里插入图片描述

避免死锁:银行家算法(预先判断此次分配是否会导致不安全状态,产生安全序列),我的剩余资源比你还需要的资源大,你到时就要把你的已分配资源还给我

在这里插入图片描述

死锁的检测:化简资源分配图,最后还连着边的进程就是死锁进程

死锁的解除:挂起某些死锁进程,但应防止饥饿现象;终止进程法;进程回退法

如何决定对谁动手:1.进程优先级;2.执行时间少的;3.还要多久;4.已经使用了多少资源;5.是交互式还是批处理

内存

运行前都要放到内存里,内存和酒店类似,也是用编号的方式,每个小单元就是“存储单元”

装入模块装入内存:绝对装入(灵活性低,适用于单道程序环境,编译器完成);静态重定位(装入的起始物理地址为100,则所有地址参数都+100);动态重定位(运行时,在段寄存器的基础上加上逻辑地址)

链接方式:静态链接;装入时动态链接;运行时动态链接

内存的扩充

覆盖技术:一个固定区,多个覆盖区,需要用到时调入内存,用不到时调出内存,必须由程序员声明覆盖,对用户不透明(单进程)

交换技术:内存与外存的交互,分为对换区,文件区,对换区的I/O速度比文件区的更快(多进程间)

连续分配

单一连续分配:整个用户程序独占用户区,无外部碎片,有内部碎片(分配给进程的内存区域,有些部分没有用上)

固定分区分配:每个分区只能装入一个作业,分为分区大小相等,大小不等

动态分区分配:根据实际大小再建立分区,两种常用的数据结构:空闲分区表,空闲分区链(双向链表),可通过紧凑(Compaction)技术解决外部碎片

动态分区分配算法:

1.首次适应(First Fit):从低地址开始查找,找到第一个满足大小的空闲分区

2.最佳:按容量递增排列,刚好满足即可。这样会导致留下越来越多的小内存块,会产生很多的外部碎片

3.最坏:按容量递减,优先使用最大的

4.邻近适应:首次适应会导致低地址部分出现很多小的空闲分区,若能从上次查找结束的位置开始检索,就是该算法的目的。此外,该算法的开销小,不需要排序

非连续分配

1.基本分页:将内存细化,将进程也细化,利用微分思想,将内部碎片降低到尽可能地小。下图,左为页面,右为页框。一个进程对应一张页表,一个页面有多个页表项

在这里插入图片描述

例题:

在这里插入图片描述

局部性原理:时间局部性(某个数据被访问,不久之后很可能会被再次访问),空间局部性(一旦访问某个存储单元,不久之后其附近的存储单元很可能会被再次访问)

快表:相当于一个高速缓存,查询时先查快表,若是快表没有,再去慢表(内存中),之后向快表加一条记录

单级页表问题:由局部性原理可知,进程在一段时间内只需要访问某几个页面就可以正常运行了,没有必要让整个页表都常驻内存

两级页表:做个分组,整出二级页表,这样页表就变小了

在这里插入图片描述

2.基本分段:类似于分页,有段表。每个段的大小不一致,是按逻辑功能划分的。编程更方便,可读性强

在这里插入图片描述

3.段页式:结合以上两种优点,先分段再分页。段号的位数决定每个进程分为多少段,页号位数决定每段最大多少页,页内偏移量决定页面大小,内存块大小

虚拟内存

传统存储管理方式:作业必须一次性全部装入内存才能开始运行,大作业无法运行;驻留性,一旦作业进入内存,会一直驻留在内存

在这里插入图片描述

在操作系统的管理下,用户看起来有一个比实际内存大得多的内存,这就是虚拟内存。多次行,对换性(允许作业的换入换出),虚拟性

请求分页方式:在基本分页的基础上加了几个表项,状态位(是否在内存),访问字段,修改位(修改过的页面才能置换到外存),外存地址

页面置换算法:内存不够时,将暂时不用的信息换到外存,追求更少的缺页率,(频繁的换入换出会导致缺页)

最佳置换算法:最理想的算法,所以无法实现

在这里插入图片描述

先进先出:这个黄兄在黑板上讲过,谁在内存块的时间长,谁淘汰。会产生Belady异常(当为进程分配的物理块数增大时,缺页次数不减反增),实现简单,性能差

最近最久未使用(LRU):最近最久未使用的先淘汰,需要专门的硬件支持,算法开销大

在这里插入图片描述

时钟置换算法(CLOCK):设置访问位,连接成循环队列,是零,就将该页面换出

改进版时钟置换算法:优先淘汰没有修改过的页面,新加一位修改位,最多四轮扫描(00,01,10,11),条件依次放宽

文件管理

一组有意义的信息/数据的集合

逻辑结构:无结构文件(流式文件);有结构文件(记录式文件)

FCB:文件控制块,文件的基本信息

空间管理:

1.空闲表法:起始位置,空闲块长度,适用于连续分配

2.空闲链表法:盘块链,盘区链

3.位示图法:

在这里插入图片描述

4.成组链接法:UNIX采用的策略,适合大型文件系统

文件基本操作

新建:调用create系统调用,大小,路径,文件名

打开:查询系统里的打开文件表,打开计数器来记录有多少文件打开了该文件

共享:基于索引节点(硬链接)各用户指向同一个索引节点,索引节点需要有链接计数count,某用户删除文件时,只是删除该用户的目录项,且count–,只有当count==0时,才能真正删除文件数据和索引节点;基于符号链(软链接)类似快捷方式,当双击快捷方式时,系统判断是LINK类型的快捷方式文件时,会根据其中的路径信息检索目录,最终找到exe文件

文件保护:口令保护,口令一般存放在FCB,索引节点中;加密保护,异或加密,对文件原始数据的加密 ,用户自己记住密码即可

访问控制列表:分组,不同人有不同权限

磁盘的结构

磁盘:表面是由磁性物质组成,可以记录二进制数据

磁道:磁盘上一圈一圈的,成千上万

扇区:磁道被分为一个个扇区,各扇区存放的数据量相同

在这里插入图片描述

磁盘调度算法:

1.先来先服务(磁道:“我好累”,磁臂:“我举着你你累个屁”);

2.最短寻找时间优先(SSTF)优先处理最近的磁道,只是选择眼前最优,但总体未必最优,可能会产生饥饿现象;

3.扫描算法(SCAN,电梯算法)只有磁头移动到最外侧才能往内移动,移动到最内层才能往外移动,电风扇摇头;

4.LOOK调度算法,改善扫描算法,如果在磁头方向上已经没有别的请求,就可以立即改变磁头方向;

5.C-SCAN循环算法,到最边上的磁道才改变磁头移动方向,快速返回到起始端,期间不做任何请求处理

减少延迟时间的方法:交替编号(物理上有间隔,有处理时间)

磁盘初始化:1.物理格式化 ,划分扇区2.分盘3.逻辑格式化,创建文件系统,初始化管理空间所用的数据结构

引导块:开机需要一系列初始化工作,通过初始化程序完成,ROM中的数据无法更改,集成在主板上,完整的自举程序放在启动块,启动块在固定位置

IO设备

外部的输入输出设备,鼠标键盘,显示器,移动硬盘

在这里插入图片描述

控制器:机械部件,电子部件,是CPU和设备的中介,控制寄存器,状态寄存器,数据寄存器

控制方式:

在这里插入图片描述

DMA方式:direct memory access,直接存储器存取,数据的传送单位是“块”,直接存入内存,不需要CPU作为快递小哥,降低cpu干预,哈哈

通道控制:硬件,弱鸡版cpu,有通道指令,每次处理一组快

软件层次:设备被看成特殊的文件

在这里插入图片描述

假脱机技术:用软件的方式模拟脱机,脱机就是用磁盘来进行数据的读和写

在这里插入图片描述

缓冲区

成本高,容量小

单缓冲,双缓冲,缓冲池

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值