408计算机考研-计算机操作系统笔记-王道
计算机操作系统笔记-王道
- 1.1.1+1.1.2操作系统的概念与功能
- 1.1.3 操作系统的特性
- 1.2_操作系统的发展和分类
- 1.3.1_操作系统的运行机制
- 1.3.2 中断和异常
- 系统调用
- 1.4 操作系统的体系结构
- 1.4 操作系统体系结构(新增)
- 1.5操作系统引导
- 1.6 虚拟机Hypervisor
- 2.1.1+2.1.2 进程的概念、组成、特征
- 2.1.4 进程控制
- 2.1.5_1 进程通信
- 2.1.5_2 信号
- 2.1.6_1 线程的概念与特点
- 2.1.6_2 线程的实现方式和多进程模型
- 2.1.6_3 线程的状态与转换
- 2.2.1调度的概念、层次
- 2.2.2_1+2.2.4 进程调度的时机、切换与过程调度的方式
- 2.2.2_2 调度和闲逛进程
- 2.2.3 调度的目标(调度算法的评价指标)
- 2.2.5_1 调度算法(先来先服务,短作业优先,高响应优先)
- 2.2.5_2调度算法:时间片轮转(RR),优先级调度,多级反馈队列
- 2.2.5_3 调度算法:多级队列调度算法
- 2.2.6 多处理机调度
- 2.3.1 同步和互斥基本概念
- 2.3.2_1 进程互斥的软件实现方法
- 2.3.2_2 进程互斥的硬件实现方法
- 2.3.3 互斥锁
- 2.3.4_1 信号量机制
- 2.3.4_2 用信号量机制实现进程互斥、同步、前驱关系
- 2.3.5_1_1 生产者-消费者问题
- 2.3.5_1_2 多生产者-多消费者问题
- 2.3.5_2 读者-写者问题
- 哲学家进餐问题
- 2.3.6 管程
- 2.4.1 死锁的概念
- 2.4.2 死锁的处理策略-预防死锁
- 2.4.3 死锁的处理策略-避免死锁
- 2.4.3 死锁的处理策略-检测和解除
- 3.1.1_1 内存的基础知识
- 3.1.1_2 内存管理的概念
- 3.1.1_3 进程的内存映像
- 3.1.1_4(选修)覆盖与交换
- 3.1.2_1 连续分配管理方式
- 3.1.2_2 动态分区分配算法
- 3.1.3_1 基本分页存储管理的概念(重点)
- 3.1.3_2 基本地址变换机构
- 3.1.3_3 具有快表的地址变换机构
- 3.1.3_4 两级页表
- 3.1.4 基本分段存储管理方式
- 3.1.5 段页式管理方式
- 3.2.1 虚拟内存的基本概念
- 3.2.2 请求分页管理方式
- 3.2.4 页面置换算法
- 3.2.5+3.2.3 页面分配策略
- 3.2.7 内存映射文件
- 4.1_1_1 初识文件管理
- 4.1_2 文件的逻辑结构
- 4.1_3文件目录
- 4.1_4 文件的物理结构(上)
- 4.1_4 文件的物理结构(下)
1.1.1+1.1.2操作系统的概念与功能
操作系统的概念(定义)

操作系统是指控制和管理整个计算机系统的硬件和软件资源,合理组织调度计算机的工作和资源分配;以提供给用户和其他软件方便的接口环境;他是计算机系统里最基本的系统软件。
作为系统的管理者,其目标是:安全与高效,其具备功能是:
处理机管理存储器管理文件管理设备管理
用打开QQ的过程举个例子:
通过复盘qq的执行过程可以记住这四个功能
操作系统的功能和目标–向上提供方便易用的服务

操作系统提供的交互服务:
-
GUI:图形化用户接口(Graphical User Interface)
用户可以使用的图形化界面进行操作,而不需要记忆命令参数等。 -
命令接口
- 联机式命令接口:联机命令接口=
交互式命令接口
比如win+R的cmd窗口就是联机命令接口,给一条命令执行一条 - 脱机命令接口 脱机命令接口=批处理命令接口
比如批处理文件*.bat文件,执行后,会一次性执行多条命令
- 程序接口
可以在程序中进行系统调用来使用程序接口。普通用户不能使用程序接口,只能通过程序代码间接使用。有的教材称 系统调用=广义指令
没有任何软件支持的计算机成为裸机,在裸机上安装操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、使用更加方便的机器。
通常覆盖了软件的机器叫做扩充机器,又称为虚拟机。
总结

1.1.3 操作系统的特性
并发 共享 虚拟 异步
并发与共享
并发和共享二者互存,没有并发,就没有共享,没有共享并发就失去了意义。并发:指两个或多个事件同一时间间隔内发生。宏观上是同时发生的,微观上是交替发生的。并行:宏观和微观都是同一时间发生。
操作系统是伴随“多道程序技术”而出现的。因此,操作系统和程序并发是一起但是的。
注意:单核cpu同一时刻只能执行一个程序,各个程序只能并发的执行。
多核cpu单一时刻可以同时执行多个程序,多个程序可以并发的执行。共享指资源共享,指系统中的资源可供内存中多个并发执行的进程共同使用。
-----互斥共享方式:可以提供给多个进程使用,但是一个时间段里只有一个进程访问
|
资源共享包含----
|
-----同时共享方式:可以提供给多个进程使用,可以一个时间段里同时多个进程访问然而同时共享里的同时依旧不是微观上的同时,而是异步状态的同时,即交替共享。
互斥共享举例:摄像头同一个时间段只能服务一个进程,比如QQ和微信不可以同时视频聊天。
同时共享方式:使用QQ,微信可以同时发送文件,宏观上是同时读取发送的,微观上,两个进程是交替访问硬盘的。
并发与共享的关系
虚拟
虚拟是指将一个物理上的实体变为若干个逻辑的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
在操作系统中,“虚拟(Virtualization)”是一种核心设计思想,其本质是通过软件或硬件技术将有限的物理资源(如CPU、内存、存储、设备等)抽象为多个逻辑上的独立资源,从而让多个进程或用户“感觉”自己独占完整的资源,实现资源的高效利用、隔离性和安全性。
虚拟的核心目的
- 资源复用:让多个进程共享同一物理资源,避免闲置浪费。
- 隔离性:防止进程间相互干扰(如一个进程崩溃不影响其他进程)。
- 安全性:限制进程对资源的访问权限(如用户程序不能直接操作硬件)。
- 简化编程:提供统一的资源视图(如虚拟内存地址空间),隐藏物理细节。
-----空分复用(如虚拟存储器技术)
|
虚拟技术 --------
|
-----时分复用技术(如虚拟处理器)
- 显然如果失去了并发性,则一个时间段内系统只能运行一道程序,则虚拟性失去了意义。因此,
没有并发性,就谈不上虚拟性
异步
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度进行,这就是进程的异步性。
如果失去了并发性,即系统只能一贯到达允许一个程序,就没有异步的可能。所以,只有系统有并发性,才有可能导致异步性。
总结
理解并发和并行的区别
并发和共享互为存在条件
根据上面例子,可以看出,没有并发和共享,就谈不上虚拟和异步,因此并发和共享是操作系统的两个最基本特征。
1.2_操作系统的发展和分类

手工阶段
手工阶段每执行一段程序都要装/取纸带
可以看出手工阶段的计算机缺点:用户独占全机,人机速度矛盾导致资源利用率极低。
批处理阶段–单道批处理系统
引入脱机输入/输出技术(外围机+磁带完成),并由监督程序负责控制作业的输入、输出,磁带的读写速度比纸带快很多,并且监督程序读取程序要比手动输入纸带快得多。
优点:缓解了一定程度的人机速度矛盾,资源利用率提升。
缺点:内存中只能有一道程序运行,只有该程序运行结束后才可以调入下一道程序,cpu有大量时间是在空闲等待I/O完成。资源利用率很低。
多道批处理系统
操作系统正式诞生,用于多道程序并发运行。
主要优点:多道程序可以并发执行,共享资源。资源利用率提升,cpu和其他资源更能保持“忙碌”状态,系统吞吐量增大。
主要缺点:用户响应时间长,没有人机交互功能(用户提交作业后只能等待计算机处理完成,中间不可以控制自己提交的作业,无法调试程序)。
分时操作系统
分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可以通过计终端与计算机交互。
主要优点:用户请求可以被及时响应,解决了人机交互问题。允许一个用户同时使用一台计数机,并且用户对于计算机的使用是相互独立,感觉不到别人的存在。
主要缺点:不能优先处理一些紧急任务。操作系统对于各个用户/作业都是完全公平的,循环的为每个用户/作业服务一个时间片,不区分任务的紧急性。
实时操作系统
实时操作系统
主要优点:能优先响应一些紧急任务,某些紧急任务不需要时间片的排队。
在实时操作系统下,计算机的系统接收到外部信号后及时处理,并且在严格的时间内处理完事件。实时操作系统的主要特点是技术性和可靠性。
----硬实时系统:必须在绝对严格的规定时间内完成处理,如导弹系统,自动驾驶系统
|
实时操作系统 —
|
-----软实时系统:能接收偶尔违反时间规定,如12306
总结

1.3.1_操作系统的运行机制

程序是如何运行的?
c语言代码通过编译器变成机器指令,cpu一条一条的执行这些指令。这里讲的指令是底层的指令,而不是控制台里的那些指令。
内核程序与应用程序
内核程序用来实现操作系统的程序,很多内核程序组成了“操作系统的内核”,或简称内核(Kernel),内核是操作系统最重要最核心的部分,也是最接近硬件的部分。
实际上一个操作系统只要有内核就够了,操作系统的功能未必都在内核里,如GUI图形化界面。
特权指令和非特权指令
操作系统的内核作为“管理者”,有时会让cpu执行一些“特权指令”,如内存清零指令。这些指令影响巨大,只允许”管理者“———即操作系统的内核来使用。
普通程序员写的程序就是”应用程序”,应用程序只能使用“非特权指令”,如:加法指令,减法指令等。在cpu设计和产生的时候就划分了特权指令和非特权指令,因此cpu执行一条指令前就可以判断其类型。
为了区分运行的是内核程序还是应用程序,划分了”内核态“和”用户态“,处于内核态的可以执行特权指令。处于用户态,说明此时正在运行的是应用程序,此时只能执行非特权指令。
拓展:cpu有一个寄存器叫做程序状态字寄存器(PSW),其中有个二进制位,1表示”内核态“,0表示”用户态“。别名:内核态=核心态=管态;用户态=目态
内核态、用户态的切换
① 刚开机时,CPU为“内核态”,操作系统内核程序先上CPU运行
②)开机完成后,用户可以启动某个应用程序
③操作系统内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行,会用一条特权指令将PSW的标志位设置为”用户态“。
④ 应用程序运行在“用户态”
⑤此时,一位猥琐黑客在应用程序中植入了一条特权指令,企图破坏系统…
⑥ CPU发现接下来要执行的这条指令是特权指令,但是自己又处于“用户态“
⑦这个非法事件会引发一个中断信号,cpu检测到中断信号后,会立即变成核心态,并停止当前运行的应用程序,转而去处理中断信号的内核程序。
⑧“中断”使操作系统再次夺回CPU的控制权
⑨操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序
内核态→用户态:执行一条特权指令–修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权用户态→内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权
除了非法使用特权指令之外,还有很多事件会触发中断信号。一个共性是,但凡需要操作系统介入的地方,都会触发中断信号
总结

1.3.2 中断和异常

中断的作用

“中断”是让操作系统内核夺回CPU使用权的唯一途径
中断类型
1.内中断
与当前执行的指令有关,中断信号来源于cpu内部。
可能由除法÷0异常、用户态执行特权指令、或主动触发。
有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令--陷入指令,该指令会引发一个内部中断信号,系统调用就是利用陷入指令将cpu控制权交给操作系统然后执行特权指令的。陷入指令不是特权指令,可以在用户态下执行,陷入指令可以将cpu控制权交给系统
2.外中断
与当前执行指令无关,中断信号来源于cpu外部,一般是外设中断,如键盘中断,时钟中断。时钟中断可以将cpu的使用时间分为多个时间片,实现并发性。
中断的分类
内中断一般被称为异常,考试一般指狭义的中断,也就是外中断,也称中断。注意下图错误,整数÷0是故障中断不是终止中断
中断机制基本原理&中断向量表
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。中断处理程序一定是在内核态运行的
总结

- 题外话,内/外中断的分别检测时机是什么时候?
- 内中断由CPU执行
指令时或执行后直接触发,与当前指令的执行流程同步。检测由CPU内部的逻辑单元(如算术逻辑单元ALU、控制单元)在指令执行的不同阶段完成。 - 外中断由CPU外部设备触发,与当前指令的执行异步。检测由外部设备通过中断控制器向CPU发送信号,CPU在
指令执行间隙或特定周期检查中断请求。
系统调用
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务
系统调用与库函数
不涉及系统调用的库函数:如“取绝对值”的函数
涉及系统调用的库函数:如“创建一个新文件”的函数
应用程序通过系统调用请求操作系统的服务统一掌管,因此凡是而系统中的各种共享资源都由操作系统内核与共享资源有关的操作(如存储分配、I/0:桑作、文件管理等),都必须通过系统调用的式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用进行非法操作。
系统调用过程
涉及汇编,看个大概,不必死磕
系统调用的基本流程
系统调用的完整过程可分为用户态准备、触发中断、内核态处理和返回用户态四个阶段,具体步骤如下:
- 用户态准备
参数传递
用户程序将系统调用所需的参数(如文件路径、缓冲区地址、操作类型)通过寄存器或栈传递给内核。 - 触发中断(用户态 → 内核态)
专用指令触发
用户程序通过执行系统调用专用指令(如x86的syscall/sysenter,ARM的SVC)主动请求内核服务。 - 内核态处理
参数验证与安全检查
内核首先验证用户传递的参数是否合法(如指针是否指向用户空间、文件描述符是否有效)。 - 返回用户态
恢复上下文
内核通过sysret(x86)或ERET(ARM)指令恢复用户态的寄存器状态(如PC、EFLAGS)。
切换回用户态的代码段和数据段,继续执行被中断的用户程序。
大致流程
传递系统调用参数>执行陷入指令(用户态)>执行相应的内请求核程序处理系统调用(核心态)→返回应用程序
注意:
1.陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
2.发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
总结
陷入指令又可以被称作trap指令、访管指令
1.4 操作系统的体系结构


原语是一种特殊的程序:具有原子性。也就是说,这段程序的运行必须一气呵成,不可被“中断”
时钟管理:利用时钟中断实现计时功能
*Ubuntu、Centos 的开发团队,其主要工作是实现非内核功能,而内核都是用了 Linux 内核
操作系统的内核
时钟管理,中断处理,原语这些与硬件紧密相连的模块必须放在内核里,而对系统资源进行管理的功能如进程管理,存储器管理、设备管理功能可以放在内核外,因为他们不会直接涉及到硬件。
将进程管理,存储器管理、设备管理等功能放在内核里的是大内核架构,另外一种则是微内核。内核必须运行在内核态,非内核功能运行在用户态。

因此,大内核和微内核的性能有一点差异,微内核在处理内核模块功能时,需要更频繁的内核态与用户态转换,需要更多时间开销,注意:状态切换过程需要时间消耗大内核也有缺点:内核代码庞大,结构混乱,难以维护
总结
典型的大内核/宏内核/单内核 操作系统:Linux、UNIX
典型的微内核操作系统:Windows NT
1.4 操作系统体系结构(新增)
分层结构 模块化 与 外核
分层结构
内核分为多层,每层可单向调用更底层的接口。
优点
1.便于调试和验证,自底向上逐层调试验证
2.易扩充和易维护,各层之间调用接口清晰固定缺点
1.仅可调用相邻低层,难以合理定义各层的边界
2.效率低,不可跨层调用,系统调用执行时间长
模块化
模块化是将操作系统按功能划分为若干个具有一定独立性的模块。每个模块具有某方面的管理功能,并规定好各模块间的接口,使各模块之间能通过接口进行通信。还可以进一步将各模块细分为若干个具有一定功能的子模块,同样也规定好各子模块之间的接口。把这种设计方法称为模块-接口法。
内核 =主模块+可加载内核模块主模块:只负责核心功能,如进程调度、内存管可加载内核模块:可以动态加载新模块到内核而无需重新编译整个内核
优点
1.模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发
2.支持动态加载新的内核模块(如:安装设备驱内动程序、安装新的文件系统模块到内核),增强OS适应性
3.任何模块都可以直接调用其他模块,无需采用大消息传递进行通信,效率高
可扩展性和高效性
缺点
1.模块间的接口定义未必合理、实用
2.模块间相互依赖,更难调试和验证
外核
内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全优点
1.外核可直接给用户进程分配"不虚拟、不抽象的硬件资源,使用户进程可以更灵活的使用硬件资源
2.减少了虚拟硬件资源的“映射层",提升效率
缺点
1.降低了系统的一致性
2. 使系统变得更复杂
宏内核(大内核)
所有的系统功能都放在内核里(大内核结构的OS通常也采用了"模块化"的设计思想)优点
1.性能高,内核内部各种功能都可以直接相互调用
缺点
1.内核庞大功能复杂,难以维护
2.依赖关系复杂,大内核中某个功能模块出错,就可能导致整个系统崩溃
微内核
只把中断、原语、进程通信等最核心的功能放入内核。进程管理、文件管理、设备管理等功能以用户进程的形式运行在用户态优点
1.内核小功能少、易于维护,内核可靠性高
2.内核外的某个功能模块出错不会导致整个系统崩溃
缺点
1.性能低,需要频繁的切换 用户态/核心态。用户态下的各功能模块不可以直接相互调用,只能通过内核的"消息传递“来间接通信
2.用户态下的各功能模块不可以直接相互调用,只能通过内核的"消息传递“来间接通信
1.5操作系统引导

在使用传统BIOS启动模式,初始化每个磁盘开头有主引导程序(MBR),其中包括磁盘引导程序和分区表,分区表记录了该磁盘的盘符位置和大小,磁盘引导程序相当于一种特殊的初始化程序,负责在计算机启动时加载操作系统,该程序包含硬件自检与初始化、定位与加载操作系统、分区表管理与活动分区定位等功能。
操作系统启动流程(BIOS)
计算机通电后,BIOS(基本输入输出系统)首先运行·,进行硬件自检(POST)。
BIOS 根据用户设置的启动顺序(Boot Order),定位到启动设备(如硬盘)。读取硬盘的第一个扇区(MBR),MBR负责定位活动分区并加载其 PBR,分区引导记录(Partition Boot Record,简称PBR)位于每个分区的第一个扇区(通常是512字节,与MBR扇区大小相同),PBR负责加载该分区内的操作系统程序,加载操作系统的核心文件(如内核、初始RAM磁盘),最终完成操作系统启动。
PBR的强大功能(题外话)
PBR使得支持多系统共存:每个分区可拥有独立的PBR,允许同一硬盘上安装多个操作系统(如Windows+Linux双系统),也就是说一个分区不可以存在两个系统,但是硬盘可以有多个分区盘符。
启动时,用户可通过引导菜单选择进入哪个分区对应的操作系统。
文件系统兼容性:PBR中的代码需与分区文件系统类型匹配。例如,FAT32分区的PBR会加载FAT32文件系统的引导程序,而NTFS分区的PBR则加载NTFS兼容的代码。
MBR位于硬盘第一个扇区,PBR位于每个分区第一个扇区MBR的主要功能是定位活动分区并加载其PBR PBR主要功能是加载操作系统引导文件
1.6 虚拟机Hypervisor

第一类虚拟机直接运行在物理硬件上,不依赖宿主操作系统,性能接近原生硬件,安全性高,适合企业级应用;在处理内核态指令时,直接运行在硬件上,作为最高特权级程序管理硬件资源,虚拟机中的操作系统若执行特权指令会陷入VMM,由VMM模拟执行
第二类虚拟机运行在宿主操作系统之上,依赖宿主系统分配资源,性能较低但部署灵活,依赖宿主系统分配资源,虚拟机中的特权指令需通过宿主系统间接处理,性能损耗较大且隔离性较弱,适合个人开发和测试场景。以下是具体分析:

2.1.1+2.1.2 进程的概念、组成、特征
程序是静态的,存储在磁盘里的可执行文件或代码,是一系列指令的集合。进程(process)是动态的,是程序的一次执行。
当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”–PID(Process lD,进程ID).
PCB-记录进程的相关信息-进程存在的唯一标志PCB(Process Control Block,进程控制块)是操作系统用于管理进程的核心数据结构,它记录了进程运行所需的关键信息,确保操作系统能够正确调度、控制和协调进程的执行。
一个进程实体(进程映像)由PCB、程序段、数据段组成。进程是动态的,进程实体是静态的。进程实体反应了某一时刻进程的状态。
进程是进程实体的运行过程,是系统资源分配和调度的一个独立单位。
进程特性
2.1.4 进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
进程的状态转换需要原语实现,原语是一种特殊的程序,执行具有原子性,运行必须一气呵成,不可中断。
如果不能“一气呵成”,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作
原子性是靠关中断和开中断两个特权指令实现。关中断后,cpu不会检测中断信号,而是执行开中断后才恢复检查。
原语介绍:



cpu在切换进程,需要将当前部分寄存器的值存储到PCB,恢复进程时,读取PCB,恢复寄存器的值,这样就保持了进程上下文(运行环境)不变。进程控制原语的流程:1.更新PCB信息2.将PCB插入合适队列3.分配/回收资源
2.1.5_1 进程通信
进程间通信(Inter-ProcessCommunication,IPC)是指两个进程之间产生数据交互。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
进程之间的通信包括共享存储,消息传递,管道通信。
共享存储
在操作系统中,进程的共享存储(Shared Memory)是一种高效的进程间通信(IPC, Inter-Process Communication)机制,它允许多个独立进程直接访问同一块物理内存区域,从而无需通过内核中介或数据拷贝即可交换信息。这种机制的核心是绕过传统的进程隔离边界,实现数据的直接共享。
但是对于进程来说,共享空间是互斥的,不可以同时访问共享空间。
共享存储的方式
基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式。
基于数据结构的共享:日比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
消息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
直接通信:消息发送进程指明接收进程的ID;
间接通信:通过“信箱”间接的通信,因此又称为“信箱通信方式“
消息传递-直接通信方式
直接通信方式的消息包含消息头和消息体;
消息发送进程指明接收进程的ID;
消息传递-间接通信方式

进程通信-管道通信
“管道”是一个特殊的共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区,信息流是队列的方式,先进先出FIFO的方式.
- 管道只能采用
半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。 - 各进程要
互斥地访问管道(由操作系统实现) - 当
管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。 - 当
管道读空时,读进程将阻塞,直到写进程往管道中写入数据,即可唤醒读进程。 - 管道中的数据一旦被读出,就彻底消失。因此,当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案:①
一个管道允许多个写进程,一个读进程(2014年408真题高教社官方答案);②允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据(Linux的方案)。
总结

写进程往管道写数据,即便管道没被写满,只要管道没空,读进程就可以从管道读数据
读进程从管道读数据,自即便管道没被读空,只要管道没满,写进程就可以往管道写数据
2.1.5_2 信号
信号的作用
信号:用于通知某个特定的事件已经发生。进程接到信号后,对该信号进行处理。
信号分为待处理(pending)信号和被阻塞信号(blocked),阻塞信号会屏蔽pending信号,具体表现为被阻塞的信号在产生时会进入未决(Pending)状态,但不会递达给进程,直到进程解除对该信号的阻塞,信号才会递达并处理。处理信号时,pending信号会与block信号按位与,为1才处理。
在PCB进程块里记录了位信号,每一位对应一种信号处理,当接收到信号时,对应的位信号会置1,当时如过上一个信号还没处理掉,那么新来的相同位信号会被丢弃。PCB里记录的位信号只能记录接收到了哪一种信号,无法确认是哪个进程发来的。
进程之间运行发送的进程有限制。比如父进程可以对子进程发生9号进程(杀死进程信号),对子进程终止。而其他进程不可以。
处理完进程后,通常会返回到进程的下一条指令继续执行。
什么时候处理信号
- 当进程从内核态转为用户态(如:系统调用返回,或中断处理返回),例行检查是否有待处理信号,如果有就处理信号。
How 怎么处理信号?
- 执行操作系统为此类信号设置的
缺省(默认)信号处理程序某些信号默认忽略,不作处理 - 执行进程为此类信号设置用
户自定义信号处理程序(自定义信号处理程序将覆盖①)
- 信号处理程序运行结束后,通常会返回进程的下一条指令继续执行(除非信号处理程序将进程阻塞或终止)
- 一旦处理了某个信号,就将pending位重置为0重复收到的同类信号,将被简单地丢弃(因为仅有 1bit 记录一类待处理信号)
- 当同时收到多个不同类信号时,通常先处理序号更小的信号。
进程自定义的中断程序,只能改变自己的中断逻辑程序,而不可以改变其他进程的中断信号处理逻辑。
信号与异常的关系“信号”可以作为“异常”的配套机制,让进程对操作系统的异常处理进行补充。
在进程运行过程中,某些特殊事件可能引发,操作系统内核负责捕获并处理异常.
有些异常可以由内核完成全部处理(如:页异常),此时就不必再使用信号机制。
有些异常无法由内核完成全部处理,需要用户进程配合,此时就可以用“信号机制”与“异常机制“相互配合。
总结

2.1.6_1 线程的概念与特点
有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”,来增加并发度。
传统的进程是程序执行流的最小单位,引入线程后,线程成为了程序执行流的最小单位
可以把线程理解为“轻量级进程”线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件).
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)
线程属性
线程是处理机调度的单位多CPU计算机中,各个线程可占用不同的CPU- 每个线程都有一个线程ID、线程控制块(TCE)
线程也有就绪、阻塞、运行三种基本状态线程几乎不拥有系统资源同一进程的不同线程间共享进程的资源- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预同一进程中的线程切换,不会引起进程切换
不同进程中的线程切换,会引起进程切换切换同进程内的线程,系统开销很小- 切换进程,系统开销较大
2.1.6_2 线程的实现方式和多进程模型
线程实现方式-用户级线程
早期操作系统不支持线程,只有进程,当时的”线程“由进程实现,由程序员在一个进程里实现线程切换逻辑,实际对于cpu来说只有一个进程,这是用户级线程。

很多编程语言实现了强大的线程库,可以实现线程的创建、销毁、调度功能等。这是用户级的线程,由用户程序来管理线程,线程切换不需要用户态与内核态切换。
优缺点优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
线程实现方式-内核级线程
内核级线程的管理由操作系统管理,线程切换需要cpu的用户态和内核态转换,操作系统可以意思到内核级线程的存在。
内核级线程的管理工作由操作系统内核完成。- 线程调度、切换等工作都由内核负责,因此
内核级线程的切换必然需要在核心态下才能完成。 - 操作系统会为每个内核级线程建立相应的TCB(Thread ControlBlock,线程控制块),通过TCB对线程进行管理。“
内核级线程”就是“从操作系统内核视角看能看到的线程 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。缺点:一个用户进程会占用多个内核级线程线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多线程模型
一对一模型
一对一模型:一个用户级线程映射到一个内核级线程。每个用户线程与用户线程同数量的内核级线程。优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。多对一模型

操作系统只能”看得见“内核级线程,因此只有内核级线程才是处理机分配的单位,这样多对一模型就退化到了原始的多用户级线程。多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只能被分配到一个内核基级线程。优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
多对多模型
多对多模型:n用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点.
可以这么理解:用户级线程是“代码逻辑”的载体,内核级线程是“运行机会”的载体
内核级线程才是处理机分配的单位。例如:多核CPU环境下,左边这个进程最多能被分配两个核。
内核级线程中可以运行任意一个有映射关系的用户级线程代码,如果进程有两个内核级线程,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞
总结

2.1.6_3 线程的状态与转换
线程的转换和进程转化基本一致。
线程控制块
2.2.1调度的概念、层次

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
调度的三个层次–高级调度

作业: 一个具体的任务
用户向系统提交一个作业=用户让操作系统启动一个程序(来处理一个具体的任务)
高级调度(作业调度)。按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。
调度的三个层次–低级调度

低级调度(进程调度/处理机调度)–按照某种策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。
进程调度的频率很高,一般几十毫秒一次。
调度的三个层次–中级调度

内存不够时,可将某些进程的数据调外存。等内存空闲或者进程需要运行时再重新调入内存。
暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列 略决定将哪个处于挂起状态的进程重新调入内存。中级调度(内存调度)–按照某种一个进程可能会被多次调出、调入内,因此中级调度发生的频率要比高级调度更高。
进程的挂起状态和七状态模型
暂时调到外存等待的进程状态为挂起状态(挂起态,suspend)
挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态
五状态模型 —》七状态模型
注意:注意“挂起”和“阻塞”的区别,两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。 有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因不同再把阻塞挂起进程进一步细分为多个队列。。
三层调度的联系和对比

总结

注意:高级调度-》作业调 中级调度-》内存调度 低级调度-》进程调度
2.2.2_1+2.2.4 进程调度的时机、切换与过程调度的方式

进程调度时机

进程在操作系统内核程序临界区中不能进行调度与切换.
(2012年联考真题)进程处于临界区时不能进行处理机调度,这个是错的。
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。临界区:访问临界资源的那段代码。内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成).
进程调度的方式

进程的切换与过程

总结

2.2.2_2 调度和闲逛进程


闲逛进程、调度器
如果就绪队列没有其他进程,运行闲逛进程(idle),所以cpu永远不会空闲,他会一直运行,哪怕是空程序。
2.2.3 调度的目标(调度算法的评价指标)

cpu利用率
利用率:忙碌时间/总时间
系统吞吐量

周转时间



响应时间

总结

2.2.5_1 调度算法(先来先服务,短作业优先,高响应优先)

先来先服务(FCFS)


短作业优先算法(SJF)
注意:一般来说都是非抢占式的SJF算法,也有可能是抢占式的题目,看清题目要求!
下面是抢占式
对比非抢占式的短作业优先算法,显然抢占式的这几个指标又要更低tips

高响应比优先(HRRN)


总结 (重要)

2.2.5_2调度算法:时间片轮转(RR),优先级调度,多级反馈队列

时间片轮转(RR)



优先级调度算法
非抢占式调度算法
抢占式调度算法



多级反馈队列调度算法

高级队列新任务来了 → 会抢占低级的;低级任务被打断后,一般不会直接进下一级队列,而是留在原队列或被放回队尾。
总结

2.2.5_3 调度算法:多级队列调度算法

2.2.6 多处理机调度
多处理机就是多cpu调度,每一个cpu都可以独立运行一个进程

负载均衡、处理机亲和性

方案一:公共就绪队列

私有就绪队列
- 推迁移

- 拉迁移

私有就绪队列天然实现了处理机亲和性,根据推迁移和拉迁移算法一定程度上实现了负载均衡
总结


2.3.1 同步和互斥基本概念
同步的概念

互斥的概念




总结

2.3.2_1 进程互斥的软件实现方法

如果没有进程互斥?
单标志法


双标志先检查法

peterson算法

让权等待的意思是在没有资源就立刻送出处理机,而不是循环检查
总结

2.3.2_2 进程互斥的硬件实现方法

中断屏蔽方法

每个CPU核心通常都有自己独立的程序状态字寄存器(PSW),所以关中断只适用于单核,而且只适用于系统内核进程
TestAndSet指令

Swap指令

总结

2.3.3 互斥锁


2.3.4_1 信号量机制


整型信号量

记录型信号量


总结

2.3.4_2 用信号量机制实现进程互斥、同步、前驱关系

信号量机制实现进程互斥

信号量机制实现进程同步

信号量机制实现前驱关系

总结

2.3.5_1_1 生产者-消费者问题



下面导致死锁。
总结
2.3.5_1_2 多生产者-多消费者问题

实现互斥的p操作一定要在实现同步的p操作之后,否则会死锁。







对于多容量的话,没有互斥信号的话就可能导致二者同时进入临界区!
回顾

2.3.5_2 读者-写者问题


解决读进程无法并发的问题
关键点1:使用p操作对rw加锁,v操作解锁,但是会导致无法同时读取文件(因为没有原语,导致同时读取count为0,然后都对rw进行p操作加锁)
关键点2:使用互斥信号量对count互斥访问,这样可以实现对于count变量的互斥访问,但是还有一个问题,就是如果源源不断的对文件读取,会导致写进程无法对文件修改。写进程饿死。
如何解决写进程饿死的情况?
他是怎样的—》又设计一个互斥信号量w,用于写优先的互斥信号量,代码如下,相信你能理解:
而且由于w的互斥,可以实现w信号量队列的排队,这样就可以实现先来后到排序读写。
总结(重要)

哲学家进餐问题
对于下面问题,如果每个人都拿一只筷子,就可能导致死锁。
防止意外同时拿同一只筷子,可以对筷子访问进行互斥。
回顾

2.3.6 管程

引入管程的原因。
管程的定义和基本特性

管程解决生产者消费者问题

java中类似于管程的机制


2.4.1 死锁的概念

什么是死锁



可能发生死锁的原因

关于第三条,在前面信号量有讲到。

2.4.2 死锁的处理策略-预防死锁



下面这种解决方案是可能导致饥饿
顺序资源分配法
回顾

2.4.3 死锁的处理策略-避免死锁



银行家算法




回顾

2.4.3 死锁的处理策略-检测和解除



这是拓扑排序,哈哈哈


3.1.1_1 内存的基础知识
首先自己要了解什么是内存和外存。
内存的作用(重要)


指令工作原理

需要知道的是程序编译后里面的地址一般是逻辑地址,这个是相对地址。

- 绝对装入

- 可重定位装入

- 动态运行时装入(动态重定位)
这个其实就是基址寄存器

编译原理

链接方式

总结

3.1.1_2 内存管理的概念






3.1.1_3 进程的内存映像

3.1.1_4(选修)覆盖与交换







3.1.2_1 连续分配管理方式

单一连续分配

固定分区分配


动态分区分配

- 采用的数据结构

空闲分区表分配内存

空闲分区表分配内存的第一种情况
第二种
回收内存
回收前:
回收后:
空闲分区后的回收和这个类似,就不截图了;
下面是回收的空间前后都有空闲内存的情况,相邻的内存回收后会合并:
回收前:
回收后:
下一种情况,前后都没有相邻的空闲分区

上面这个空闲分区表可以看到内存地址小的分区号小,实际上不一定,根据不同算法结果不一样,下一节会讲解
通过紧凑转移内存地址的进程的pcd里存储的重定位寄存器或基址寄存器应该需要修改。

3.1.2_2 动态分区分配算法

首次适应算法
下图进程5是后加入的。

这个算法的空闲内存是按照地址排序的。
最佳适应算法

分配后需要对链表排序

最坏适应算法

每次链表按照大到小内存排序
临近适应算法

总结

3.1.3_1 基本分页存储管理的概念(重点)

分页存储





如何实现地址的转换



页面大小设置为2的整数幂,可以更加方便,这是取余原理,可以看看循环队列用数组实现的原理。

实际上这和计算机组成原理的cache映射很类似。


3.1.3_2 基本地址变换机构








下面有点绕,需要知道页表和页面都存放在内存的内存块(即物理页框)中。

总结

3.1.3_3 具有快表的地址变换机构






和计算机组成原理类似计算


3.1.3_4 两级页表

单级页表存在的问题


解决单级页表问题



实现地址转换

n级页表需要访存n+1次

3.1.4 基本分段存储管理方式











3.1.5 段页式管理方式





一个进程对应一个段表,一个段表对应一个页表,一个进程可能对应多个页表!

3.2.1 虚拟内存的基本概念






总结

3.2.2 请求分页管理方式








总结

3.2.4 页面置换算法







时钟置换算法和LRU(最近最久未使用算法)算法效果不一样,但非常接近。可以一句话概括:时钟算法(Clock)是 LRU 的近似实现 ,效果接近但略差一点,开销远小于真正的 LRU。

3.2.5+3.2.3 页面分配策略



未锁定:系统会锁定一些页面,这些页面中的内容不可以换出内存(如:重要的内核数据可以设为“锁定”)






3.2.7 内存映射文件






4.1_1_1 初识文件管理












4.1_2 文件的逻辑结构













4.1_3文件目录












4.1_4 文件的物理结构(上)




连续分配

优点:
缺点:


链接分配

链接分配-隐式链接



链接分配-显式链接
有一点像链式前向星

快速定位物理块:当用户访问文件的某个逻辑块时,操作系统通过查询内存中的FAT,直接获取该逻辑块对应的物理块号。例如,访问逻辑块号i时,操作系统从文件起始块开始,通过FAT中的指针链遍历i次即可找到物理块号,整个过程在内存中完成,避免了磁盘I/O操作。
4.1_4 文件的物理结构(下)
索引分配
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)