声明:
本文基于平台点击量较高的几个笔记,王道考研课件以及本校老师的讲解与大黑书相结合而成。
本文将按照书上的结构分为:
1.导论 2.进程管理 3.内存管理 4.文件管理 5.I/O管理
在开始之前,先介绍如下概念:
文件:对 I/O 设备的抽象;
虚拟内存:程序存储器的抽象;
进程:一个正在运行的程序的抽象;
虚拟机:它提供对整个计算机的抽象,包括操作系统、处理器和程序。
多道程序:多道程序设计(Multiprogramming)是一种操作系统的特性,它允许多个程序同时存在于计算机系统中,并共享计算机的资源。
并发:在同一时间段内,有多个任务在交替执行
并行:在同一时间段内,有多个任务同时执行
1.导论
1.1概论
1.1.1操作系统是什么?
1.1.2操作系统的基本特征有哪些?
1.并发 2.共享 3.虚拟 4.异步
1.1.3操作系统的类型包括哪些?
手工操作操作系统 | 优点 没有优点 | 缺点 速度慢,CPU利用不充分 |
批处理操作系统 | 无优点 | 没有人机交互 |
分时操作系统 | 用户请求被及时响应,多个用户可以同时使用一台计算机 | 不能优先处理一些紧急任务 |
实时操作系统 | 能够极快的解决错误 |
1.1.4CPU有哪两种状态?
1.用户态 2.内核态
1.1.5中断是什么?有哪些类型?简述中断处理的过程?
中断:CPU对系统中发生的异步事件的响应
类型:按中断方式划分:1.强迫中断 2.自愿中断
按功能划分:1.机器故障中断 2.I/O中断 3.外部中断 4.程序性中断
5.访管中断
中断处理的过程:
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。在中断相关操作中,保存被中断的断点/PC里面的内容是由硬件自动完成的。
用户态→核心态”是通过中断实现的,并且中断是唯一途径。“核心态→用户态”的切换是通过执行一个特权指令,将程序状态字( PSW)的标志位设置为 “用户态”。
1.2操作系统的结构
1.2.1操作系统的结构
优点 | 缺点 | ||
---|---|---|---|
简单结构 | |||
分层结构(层次化结构) | 分层结构是一种将操作系统功能划分为多个层次的组织方式。每个层次负责特定的功能,层与层之间通过接口进行通信。 | 易于调试和验证 易扩充和易维护 | 仅可调用相邻层 效率低,不可跨层调用 |
模块化 | 可以将复杂的系统分解为独立的、可重用的模块。每个模块负责特定的功能,且模块之间通过定义好的接口进行通信, | 易于维护,逻辑清晰 各模块之间直接调用 | 难以调式和验证 |
大内核 | 内核是指将所有的核心操作系统功能集中在一个单一的内核中。 | 性能高,内核个功能直接调用 | 复杂,难以维护,一个功能坏全部瘫痪(可靠性低) |
微内核 | 微内核结构将操作系统的核心功能分为不同的模块,并通过最小化的内核提供基本的服务。 | 功能少,易于维护 某个出错不会导致整个崩溃 | 性能低,需要频繁切换状态 |
外核 | 外内核结构将操作系统内核的功能最小化,提供的服务仅限于硬件抽象,如内存管理和进程间通信。应用程序可直接访问底层硬件和资源 | 更灵活使用硬件资源 减少资源的映射层提升效率 | 使系统更加复杂 降低系统的一致性 |
混合系统 |
1.2.2虚拟机
2.进程管理
2.1进程
2.1.0并发并行的概念,特点及好处
并发:在同一时间段内,有多个任务在交替执行
并行:在同一时间段内,有多个任务同时执行
特点和带来的好处:
- 并发的特点是多个任务可以同时进行,通过时间片轮转或者优先级调度等方式实现任务的并发执行。它可以提高系统的资源利用率,充分利用计算机系统的处理能力,优化任务的执行顺序,减少用户等待时间,提高系统的并发性和响应性。
- 并行的特点是多个任务可以同时在多个处理器或计算单元上执行,同时进行计算和求解。它可以加速整体计算过程,提高计算的速度和效率,特别适用于需要大量计算和处理的任务,如科学计算、图像处理和数据分析等领域。
- 并发和并行的好处包括提高系统的性能和效率,加快任务的执行速度,解决高负载和密集计算需求,提高用户体验和响应性,实现资源的合理分配和利用,提高系统的可扩展性和可靠性。
需要注意的是,并发和并行并不完全等同,它们解决了不同的问题和需求。并发注重任务的协调和资源利用率,而并行注重任务的同时执行和计算速度。在实际应用中,可以根据任务的特性和系统的需求选择并发和并行的模型或策略,以获得最佳的性能和效果。
2.1.1进程的基本概念
1)顺序执行的特征:
1.顺序性 2.封闭性 3.可再现性
并发执行的特征:
1.间断性:
程序共享系统的资源,以及为完成同一个任务共同合作,并发执行的程序之间相互制约,(不是运行完一个在运行另一个)
2.非封闭性:
各程序共享系统资源,资源的状态由各程序所决定。
3.不可再现性:
为了提高效率于是采用间断执行的手段,但是间断执行就导致数据不能封闭,因为数据可能会被其他程序更改,于是结果不可再现。不可再现性是要避免的。
2)进程的构成:
PCB(进程控制块)PCB是进程存在的唯一标识 所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB. 与进程共存亡,用于记录进程的基本情况和活动过程,一般常驻内存 | 程 序段 | 数 据段 |
3) 进程的特性:
1.动态性 2.并发性 3.独立性 4.异步性
进程的创建和销毁:
进程创建的过程:
-
分配空间:操作系统为新进程分配必要的资源,包括内存空间、文件描述符、数据结构等。这些资源的分配通常在操作系统内部的进程表中进行记录。
-
设置上下文:操作系统为新进程设置执行环境,包括设置程序计数器、栈指针、寄存器和其他执行状态的属性。这些属性的设置可以使进程开始执行指定的程序代码。
-
加载代码:操作系统将新进程的执行代码从磁盘或其他存储介质加载到内存中。这可能涉及到读取可执行文件、动态链接库和其他相关资源。
-
初始化状态:操作系统对新进程进行初始化,设置进程的初始状态,如就绪态或阻塞态。进程初始化后,它可以等待操作系统的调度和开始执行。
-
用户空间初始化:在某些操作系统中,新进程还需要进行用户空间的初始化,包括创建堆和栈,初始化全局变量和数据结构等。
进程撤销的过程:
-
释放资源:当需要撤销一个进程时,操作系统首先释放该进程所占用的资源,包括内存空间、文件描述符、打开的文件、I/O缓冲区和其他系统资源。
-
终止执行:操作系统发送一个终止信号给被撤销的进程,通知它结束执行。进程可以处理这个信号,并进行一些清理和保存工作,然后正常地退出。
-
回收资源:操作系统回收被撤销进程所占用的资源,并更新对应的进程表和其他系统数据结构。这样,被撤销的进程所占用的资源可以被重新分配给其他进程使用。
2.1.2进程的控制及转换
另外还有两种状态,他们并不是最基本的状态:
创建态:进程正在创建,操作系统为进程分配资源,初始化PCB
终止态:进程正在被撤销,系统收回分配资源,撤销PCB
2.1.3进程通信
为什么进程通信需要有操作系统的支持?
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另一个进程的地址空间。
1)共享内存
设置一个共享内存区域,并映射到进程的虚拟地址空间,要互斥的访问共享空间,有基于数据结构(低级)的共享和基于存储区的共享(高级)
2)消息传递
传递结构化的消息,系统提供“发送/接受原语”
两种通信方式:直接通信,间接通信
直接通信方式:将消息直接挂到接受进程的消息队列里
间接通信方式:将消息先发送到中间体
3)管道通信
设置一个管道,其实就是一个内存缓冲区,一个管道只能实现半双工通信,实现双向同时通信要建立两个管道,各各进程之间要互斥访问。
一个管道只能有一个读进程,但能有多个写进程。当管道为空时,读进程阻塞;当管道不为空时,写进程阻塞。
共享内存 | 1.基于数据结构的共享 2.基于存储空间的共享 |
消息传递 | 1.直接通信的方式:消息直接挂到接收进程的消息缓冲队列上 2.间接通信的方式:消息要先发送到中间实体(信箱)当中 (所以也叫信箱通信方式) |
管道通信 | 本质是在内存中开辟一个大小固定的一个缓冲区 单向传输;没写满不允许读,没读空不允许写。 |
2.2线程
2.2.0线程和进程的区别
1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。
2.从属关系不同:进程中包含了线程,线程属于进程。
3.开销不同:进程的创建、销毁和切换的开销都远大于线程。
4.拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。
5.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。
6.CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。
7.操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。
2.2.1线程的概念
1)引入线程后,线程成为了程序执行流的最小单位
2.2.2线程的分类
1)用户级线程
1.线程的管理工作由准来完成?
2.线程切换是否需要CPU变态?
3.操作系统是否能意识到用户级线程的存在?
4.这种线程的实现方式有什么优点和缺点?
1.用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)。
2.用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
3.在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程”。
4.优缺点
优点:用户级线程的切换在用户空问即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
2)内核级线程
1.内核级线程的管理工作由操作系统内核完成。
2.线程调度、切换等工作都由内核负贵,因此内核级线程的切换必然需要在核心态下才能完成。
3.操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”。
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位
4.优缺点
优点:当个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
2.2.3多线程模型
2.3处理机调度
2.3.1调度的分类
1)高级调度(作业调度):从后备队列中调入一个作业进入就绪队列中。
2)中级调度(内存调度):中级调度实际上是外存与内存之间的调度。把进程从外存调入。
3)低级调度(进程调度):从就绪队列中选取一个进程,然后使其由就绪态变为执行态。
2.3.2调度算法:FCFS || SJF || HRRN || RR || priority
1)先来先服务 FCFS
2) 短作业优先 SJF
3)高响应比优先 HRRN
4)时间片轮转调度 RR
5)优先级调度算法
6.多级反馈队列调度算法
2.4同步和互斥
2.4.1同步与互斥的概念:
同步:直接制约 互斥:间接制约
1)同步:
同步:
进程间共同完成一项任务时直接发生相互作用的关系
进程同步的目的:
1)按照一定的规则共享系统资源;2)对多个相关进程在执行次序上进行协调,是程序具有可再现性。
2)互斥:
互斥:并发的多个进程由于竞争同一资源而产生的相互排斥的关系
3)两个进程同时进入临界区,同步机制应遵循以下准则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
- 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
- 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区。
- 让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待
2.5信号量机制
信号量被广泛用于同步,互斥和描述前驱关系
2.6死锁
2.6.1死锁产生的条件
互斥条件:资源是互斥使用的
不剥夺条件:进程只能由自己释放
请求和保持:已获得资源同时,还在请求另外一个资源
循环等待:存在一个循环等待链
2.6.2死锁的预防
2.6.3死锁预防的算法
3.内存管理
3.1概念
程序执行时会进行如下步骤:
1.编译:把你写的代码文件生成目标模块,也就是机器语言
2.连接:把你写的各种文件给连接起来,即由目标模块生成为装入模块,也就是为装入内存做准备
3.装入:这个很简单了,就是将装入模块装入内存,形成物理地址
接下来我们将详细介绍程序的连接和装入
3.1.1连接的方式
1.静态连接:把所有文件在装入前,一股脑先全部连接起来(造成内存资源的浪费)
2.装入时动态连接:采用边装入边连接。(优点:便于修改和更新,便于实现对目标模块的共享。 缺点:同上)
3.运行时动态连接:需要运行目标模块才连接装入。(优点:装入速度快,还可以节省大量的内存空间。)
3.1.2装入的方式
3.2内存管理策略
内部碎片:就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间
外部碎片:指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
3.2.1连续分配
1)单一连续分配
这种分配方式下,内存被分成系统区和用户区。内存中只能有一道用户程序,用户程序独占整个用户空间。
优点:
1.实现简单,没有外部碎片(因为每次就给一个程序分配空间,当他运行完成,把空间释放,又还是一个完整的没有被分配的空间)
2.不一定需要内存保护
缺点:
一道程序在内存中,内存浪费严重(因为每次就一个程序在里面运行,会导致分配给他的空间有很多一部分他根本就用不上,因此会导致大量的内部碎片)
2)固定分区分配
为了能让多个程序运行,并且让他们在运行的时候不会相互干扰,所以把用户空间分成多个固定大小的分区,每一个分区只存入一个作业。
优点:
实现简单,没有外部碎片
缺点:
当用户程序太大的时候,会降低性能,并且会产生内部碎片
3)动态分区分配
会根据进程的大小来进行动态的分区分配,不预先划分内存分区,只是在进程装入内存的时候再建立分区。
*动态分配算法:
3.2.2非连续分配
1)分页管理(普通表,快表,二级表)
普通表:
地址=页地址+偏移量
快表:
快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表(这个是局部性原理的应用!!!)
两级表:
两级页表的出现主要是为了解决单级页表的问题。那么单级页表有什么问题呢?
问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
解决方法:
1.
2.
2)分段管理
地址=段号+偏移量
3)段页式管理
访问一个逻辑地址需要访存三次:
第一次访问段,第二次访问页,第三次访问表。
3.3虚拟内存管理
思想:基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空问不够,由操作系统负责将内存中暂时用不到的信息换出到外存。在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。
3.3.1请求分页管理方式
一.页表机制
添加了:
- 状态位:是否已调入内存
- 访问字段:记录最近被访问的时间
- 修改位:页面调入内存后是否被修改
- 外存地址:页面在外存中存放的位置
二.页面置换算法
3.3.2页面分配策略
①驻留集:只请求分页存储管理中给进程分配的物理块的集合。在采用了虚拟存储技术的系统中,驻留集的大小一般小于进程的总大小。
太小,会导致缺页频繁,系统要花大量时间去处理缺页
太大,则会导致多道程序并发度下降(并发度下降CPU休息就多了)
②固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行过程中,物理块大小不变。
③可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。
④局部置换:发生缺页时准选进程自己的物理块进行置换。
⑤全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。
⑥抖动现象:刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动。主要原因就是分配的物理块太少。但给的多了,会降低并发度,所以给多少就要研究了。(这里涉及工作集,自行百度了解一下即可)
固定分配VS可变分配:区别在于进程运行期间驻留集大小是否可变。
局部置换VS全局置换:区别在于发生缺页时是否只能从进程自己的页面中选择一个换出。
①固定分配局部置换:物理块在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。这种策略的缺点是:很难在刚开始就确定应为每个进程分配多少个物理块才算合理。(采用这种策略的系统可以根据进程大小、优先级、或是根据程序员给出的参数来确定为一个进程分配的内存块数)
②可变分配全局置换:刚开始会为每个进程分配一定数量的物理块,操作系统会保持一个空闲物理块队列。岂某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。采用这种策略时,只要某进程发生缺页都将获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。(只要缺页就加新的物理块,壕!!但会影响其他进程)
③可变分配局部置换:刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程在运行中频繁地缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度:反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。(根据发生的缺页率来动态增加或减少进程的物理块,像屌丝,有多少用多少!)
4.文件管理
4.1磁盘
这里计算机组成原理学过加之内容也并不是很难,就讲几个算法。
先来先服务算法(FCFS)
算法思想:根据进程请求访问磁盘的先后顺序进行调度。
优点:公平;如果请求访问的磁道比较集中的话,算法性能还算可以。
缺点:如果大量进程竞争使用磁盘,请求访问的磁道很分散,FCFS在性能上很差,寻道时间长
最短寻找时间优先(SSTF)
算法思想:优先处理的磁道是与当前磁头最近的磁道。可以保证每次寻道时间最短,但是不能保证总的寻道时间最短。(其实是贪心算法的思想,只是选择眼前最优,但是总体未必最优)
优点:寻道时间很短。
缺点:可能产生饥饿现象。
扫描算法/电梯算法(SCAN)
算法思想:磁头扫描到最边上才能往回移动。
优点:性能较好,平均寻道时间较短,不会产生饥饿现象。
缺点:有时候请求到不了磁盘两边,但是磁头要扫描到两边。对各磁道的响应不平均
LOOK调度算法(边移动边观察)
算法思想:如果移动方向上已经没有别的请求,就可以立即改变磁头的移动方向。
优点:比起SCAN算法来说,不需要每次都移动到最外侧或最内侧才改变磁头方向,使得寻道时间进一步缩短。
-LOOK调度算法
算法思想:解决C-SCAN问题,如果磁头移动方向上没有访问请求,则立即返回,并且磁头只需返回到有磁道访问请求的位置即可。
优点:进一步改进C-SCAN算法,使得寻道时间进一步缩短。
5.输入输出(I/O)管理
5.1概念
5.1.1组成及作用
5.2控制方式
5.3设备独立性软件
一、高速缓存和缓冲区
Ⅰ、目的:缓解CPU与设备的速度矛盾、减少对CPU的中断频率、解决数据粒度不匹配的问题、提高CPU与/IO设备之间的并行性。
引入缓冲的目的:
1.缓和CPU与I/O设备间的速度不匹配的矛盾
2.减少对CPU的中断频率,放宽对CPU中断相对应时间的限制
3.解决基本数据单元大小(即数据粒度)不匹配的问题
4.提高CPU和I/O设备间的并行性
提高I/O性能的方案:
1.异步I/O方式
2.DMA方式
3.缓冲技术
Ⅱ、实现方法
①单缓冲
假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
处理一块数据平均使用的时间(常考)
①T>C(输入时间大于处理时间)
②T<C(输入时间小于处理时间)
结论:采用单缓冲策略,处理一块数据平均耗时Max(C,T)+M
②双缓冲
操作系统为其分配两个缓冲区
处理一块数据平均使用时间
双缓冲题目巾,假设初始状态为:工作区空,其中·个缓冲区满,另·个缓冲区空。
结论:采用双缓冲策略,处理一个数据块的平均耗时为Max(T,C+M)
③循环缓冲
④缓冲池
缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状沉可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)
另外,根据一·个缓冲区在实际运算巾扮演的功能不同,又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin)、用于提取输入数据的工作缓冲区(si)、用于收容输出数据的工作缓冲区(hout)、用于提取输出数据的工作缓冲区(sout)
三、高速缓冲和缓冲区的对比
四、SPOOLing技术(假脱机技术)
SPOOLING 技术是一种虚拟设备技术,它可以把一台独占设备改造成为虚拟设备,在进程所需的
物理设备不存在或被占用的情况下,使用该设备。 SPOOLING 技术是对脱机输入,输出系统的模拟,又称为假脱机操作。
SPOOLING 系统主要由三部分组成输入井和输出井、输入缓冲区和输出缓冲区、输入进程和输出进程。
五、静态分配和动态分配
对独占型设备一般采用静态分配,即在作业级进行的分配,当一个作业运行之前由系统一次分配满足需要的全部设备,这些设备一直为该作业占用,直到作业撤消。这种分配不会出现死锁,但设备的利用效率较低。而共享设备一般采用的事动态分配。