操作系统——第一章: 系统概述
1.1 基本概念(定义)
- 操作系统(operating system,os)是系统资源的管理者,管理软件、硬件资源,给用户和其他软件方便的接口和环境,是一个系统软件。
1.2 操作系统特征
1. 并发(concurrence)
微观上交替进行,宏观上同时执行。(操作系统和程序并发是一起诞生的)
- 重点:
- 单核CPU:同一时刻只能执行一个程序,各个程序只能并发执行。
- 多核CPU:同一时刻可以同时执行多个程序,多个程序可以并行执行。
2. 共享(sharing)
系统中的资源可供内存中多个并发执行的进程共同使用。
互斥:系统中某些资源,虽然可以给多进程使用,但一个时间段内只允许一个进程访问该资源。
同时:系统中某些资源,允许一个时间段内由多个进程 “同时” 对他们进行访问。(微观上可能是交替的)
graph LR A(两种资源共享方式) -->B(互斥共享方式) B -->C(一个时间段内只允许一个进程访问该资源) A -->D(同时共享模式) D -->E(一个时间段内由多个进程 同时 对他们进行访问) F[sharing]
注意:并发和共享是操作系统两个最基本特征,两者互为存在条件:
- 资源共享是一程序并发为条件的。(若系统不允许程序并发执行,自然不存在资源共享问题)
- 若系统不能对资源共享进行有效管理,一定影响到程序的并发执行。
3. 虚拟(virtual)
- 可归纳为:
- 时分复用技术:如处理器的分时共享(微观:处理机在微小时间段为各个进程服务,大时间分成小时间)
- 空分复用技术:如虚拟存储器
详见第三章
4. 异步(asynchronism)
并发的程序不是从头走到底的,是“走走停停”,如果进程正在占用资源,其他进程需要先被阻塞,等待资源释放。
1.3 操作系统运行机制
-
实现操作系统,需要写内核程序,很多个内核程序组成操作系统内核(kernel),简称内核,是整个操作系统最核心的部分。
- 操作系统有个内核就足够了 (eg. Docker容器 -> 仅需linux内核)
- 操作系统的功能未必都在内核中,如GUI图形化界面
-
CPU设计的时候就划分了特权指令和非特权指令
- 应用程序只能运行非特权指令(如加法减法)
- 内核程序可以运行特权指令(如内存清0指令,这条指令影响重大,只允许“管理者”——即操作系统内核来使用)。
-
但是CPU运行的时候,只会把一条一条指令(二进制指令)送进去运行,怎么判断运行的程序是应用程序指令还是内核程序的指令?
此时我们把CPU划分成为两种状态,”内核态“,“用户态”
-
内核态:说明此时运行的是
内核程序
,可以执行特权指令 -
用户态:说明此时运行的是
应用程序
,只能执行非特权指令 -
CPU中的寄存器程序状态字寄存器(PSW),其中有一个二进制位,1表示内核态,0表示用户态
当需要交换状态,修改PSW值即可
-
1.4 中断和异常
- 中断的作用:如果应用程序运行的时候,发生了中断,就会让cpu立即停止此时运行的应用程序,转而执行相应的内核程序。中断是让管理者(操作系统内核)夺回使用权的唯一途径,而中断,会使CPU由用户态转变为内核态
graph LR A(内核态 -> 用户态) -->B(用特权指令 修改PSW的值) C(用户态 -> 内核态) -->D(引发 中断 硬件自动完成 CPU状态转换过程 强行夺回CPU使用权)
-
中断的类型:
-
内中断(也叫做 异常):与当前执行指令有关,中断信号来源于CPU内部
有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令。该指令会引发一个内部中断信号。应用程序主动吧使用权归还给操作系统,希望操作系统提供某项服务。(先传入所需的参数,再调用陷入指令)
- 而系统调用就是利用陷入指令来完成
- 陷入指令并不是特权指令,陷入指令在用户态执行,执行后立刻引发一个内中断,使CPU进入内核态。
异常分三个种类:
-
陷阱、陷入(trap):
由陷入指令引发,是应用程序故意引发的
-
故障(fault):
由错误条件引起,可能被内核程序修复。内核程序修复后会把CPU使用权还给应用程序,让他继续执行下去。如:缺页故障
-
终止(abort):
由致命错误引起,内核程序无法修复,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0,非法使用特权指令
-
外中断(狭义上统称 中断):与当前执行指令无关,中断信号来源于CPU外部
例子:时钟中断。由时钟部件(在cpu的外部)发来中断信号,实现程序并发的重要前提。
io设备提供中断信号。这些中断信号让操作系统可以很好的调度各个进程。
外部中断又分可屏蔽中断INTR和不可屏蔽中断NMI
-
-
中断机制的基本原理:
不同类型的中断信号,需要用不同的中断处理程序来处理。查询中断向量表,以此来找到相应的中断处理程序在内存中存放的位置。
显然,中断处理程序一定是在内核态的,需要运行在内核态(涉及计算机组成原理)
1.5 系统调用
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单好用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。应用程序可以通过系统调用来请求获得操作系统内核的服务。
graph TD A[应用程序] --> system(系统调用) A --> |高级语言| C(c库函数) C --> system(系统调用) system(系统调用) --> operating[操作系统] F[系统调用与库函数的区别]
graph LR A(系统调用 按功能分类) -->B(设备管理 完成对设备的 请求/释放/启动 等功能) A -->C(文件管理 完成对文件的 读/写/创建/删除 等功能) A -->D(进程控制 完成进程的 创建/撤销/阻塞/唤醒 等功能) A -->E(进程通信 完成进程之间的 消息传送/信号传递 等功能) A -->F(内存管理 完成内存的 分配/回收 等功能)
*拓展链接:linux提供了哪些系统调用
-
凡是与共享资源有关的操作(如存储分配、IO操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求。由内核代为完成,保证系统的稳定性与安全性。(也防止用户非法操作)
-
总结:
-
陷入指令是在用户态执行,执行陷入指令后立即引发一个内中断,使CPU进入内核态。
-
发出系统调用的请求是在用户态,而对系统调用的相应处理是在内核态下进行。
-
-
别名:
-
内核态=核心态=管态
-
用户态=目态
-
陷入指令=trap指令=访管指令
-
-
访管指令的基本功能是让程序拥有 “自愿进管” 的手段。从而引起访管中断。访管中断处理程序将按照系统调用的操作数和参数转到相应的例行子程序[1]。完成服务功能后,退出中断,返回到用户程序断点继续执行。
1.6 操作系统的体系结构
1 分层法
将操作系统分为若干层,最底层(层0)为硬件,最高层(层N)为用户接口。每层只能调用紧邻它的低层的功能与服务(单向依赖)
- 优点:
- 便于系统的调试和验证,简化了系统设计与实现。
- 易扩充、易维护:增加、修改或替换其中一层,只要不改变接口,就不会影响其它层。
- 缺点:
- 各层合理定义较难,依赖关系稳定之后,往往不够灵活。
- 效率较差,通常调用的时候需要自上而下地穿越多层,增加开销。
2 模块化
是将操作系统按功能分为若干个功能模块。每个模块具有某种功能,并规定好接口,使各个模块之间可以通信。然后细分下各个子模块,这种设计方法叫做模块-接口法。
划分模块的时候,如果分的太小,虽然可以降低模块本身的复杂性,但会使得模块之间的联系过多,造成系统比较混乱。如果模块分的过大,会增加模块内部复杂性。
而且,划分模块的时候,要充分考虑模块的独立性,独立性越高,各个模块之间交互就变少,系统结构也就越清晰。衡量模块的独立性主要有两个标准:
-
内聚性:模块内部各个部分联系的紧密程度。内聚性越高,模块独立性越好。
-
耦合度:模块间相互联系和相互影响的程度。耦合性越高,模块独立性越好。
-
优点:
- 提高了操作系统设计的正确性、可理解性、可维护性
- 增强了操作系统的课适应性
- 加速了操作系统的开发过程
-
缺点:
- 模块间的接口规定很难满足对接口的实际需求
- 各个模块规格的设计没有一个统一的好答案,没找到可靠的决定顺序
3 内核架构
而操作系统从内核上分大致分为两点:
-
大内核/单内核/宏内核
- 操作系统的主要功能模块都作为系统内核,运行在核心态
- 优点:高性能
- 缺点:内核代码量庞大,结构混乱,难以维护
- 典型的大内核操作系统:Linux、Unix
-
微内核
-
只把最基本的功能留在内核
-
微内核基本功能:
-
进程/线程管理
-
低级存储器管理
在微内核中,只配置了最基本的低级存储器管理机制。如用于实现将逻辑地址变换为物理地址等的页表机制和地址变换机制,这一部分需要依赖于硬件,因此放入微内核。
而实现虚拟存储器管理的策略,则包含应采取何种页面置换算法,采用何种内存分配与回收的策略,应将这部分放在微内核外的存储器管理服务器中。
-
中断和陷入处理
-
-
优点:内核功能少,结构清晰,方便维护
-
缺点:需要频繁地在内核态和用户态切换,容易降低CPU性能
-
典型的微内核操作系统:Windows NT
-
定义微内核结构OS的四个方面:
-
足够小的内核
-
基于客户/服务器模式
-
应用机制与策略分离原理
-
机制是指实现某一功能的具体执行机构
-
策略是指在机制的基础上借助于某些参数和算法来实现该功能的优化,或者达到不同的功能目标。
传统OS中,将机制放在OS内核的较低层中,把策略放在内核的较高层。而微内核OS中,通常将机制放在微内核里,才能把内核做的很小
-
-
采用面向对象技术
基于面向对象技术中的抽象与隐蔽原则,能控制系统的复杂性。进一步利用对象、封装、继承等概念还能确保系统运行的正确、可靠、易扩展性。也是因为如此,面向对象技术被广泛应用在操作系统的设计中。
-
-
操作系统主要分两个板块:
-
非内核功能:如GUI
-
内核功能:
-
与硬件管理较紧密的模块
- 时钟管理(利用时钟中断实现计时功能)
- 中断处理
- 原语(设备驱动、CPU切换等)
- 是一种特殊程序
- 处于操作系统最底层,是最接近硬件的部分
- 这种程序具有原子性,运行必须一气呵成,不可被中断。
- 运行时间短,调用频繁
-
这些管理工作更多是对数据结构的操作,不会直接涉及硬件。
-
把这部分功能也写进内核的内核叫大内核。反之,只有时钟,中断,原语的内核称之为微内核,其进程管理等等内容将运行在用户态,对性能有一定的影响。
-
进程管理、存储器管理、设备管理等功能
-
-
这些内核功能,必须运行在内核态
-
微内核相比大内核,CPU运行状态的转换(psw)的次数会变多。CPU运行状态的转换是有成本的,消耗不少时间。频繁转换运行状态会降低系统性能
-
-
Ubuntu、centos的开发团队主要是实现了非内核功能,而内核功能都是用了Linux内核。
1.7 操作系统的发展与分类
1 手工操作阶段
-
纸带机打孔
-
缺点:用户独占全集,”人机速度矛盾“ 导致资源利用率低。
-
人机速度矛盾:人需要很长时间写纸带代码,且一次只能由一名程序员使用计算机,不允许多人使用;而计算机很快就可以运行完纸带代码
2 单道批处理系统
-
引入脱机输入/输出技术(用外围机+磁带完成),并由**监督程序(操作系统的雏形)**负责控制作业的输入输出,磁带读取熟读比纸带快很多
-
主要优点:缓解一定程度的人及速度矛盾,资源利用率有一定的提升
-
主要缺点:内存中仅能有一道程序运行,运行结束才能进行下一道(串行执行)。而CPU有大量的时间在空闲等待IO完成,资源利用率还是不高
3 多道批处理系统
-
每次往内存中读取多道程序
-
操作系统正式诞生,支持多道程序并发运行
-
主要优点:多道程序并发执行,共享计算机资源,资源利用率大幅度提升,CPU和其他组员更能保持 “忙碌” 状态,系统吞吐量增大
-
主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业指挥就只能等待计算机处理完毕,中间不能控制自己的作业执行
如:无法调试程序,无法在程序运行中输入参数)
4 分时操作系统
-
计算机以时间片为单位轮流为各个用户/作业服务,各个用户可以通过终端与计算机进行交互
-
主要优点:用户请求可以被即时响应,解决人机交互的问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在
-
主要缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是公平的,循环地为每个用户/作业服务一个时间片,不区分任务优先级/紧急性。
5 实时操作系统
-
计算机接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性。
-
硬实时系统:必须在绝对严格的时间内完成任务
- 如:自动驾驶系统
-
软实时系统:能够接受偶尔的违反时间规定
- 如:订票系统(实时更新票数)
-
-
主要优点:能够及时响应一些紧急任务,某些优先级高的任务不需要时间片排队。
*6 其他操作系统
-
网络操作系统:实现网络中各种资源的共享(文件共享)和各个计算机之间的通信
-
分布式操作系统:特点是分布性、并行性,任何任务都可以分布在这些计算机上,并行协同地完成任务
-
个人操作系统:Windows、macOS等等
1.8 操作系统引导
常见的操作系统引导流程如下
-
激活CPU:
激活的CPU读取[ROM][1]中的boot程序,将指令寄存器置为BIOS[2]的第一条指令,即开始执行BIOS的指令。
-
硬件自检:
启动BIOS程序之后,先进行硬件自检,检测是否故障。如有故障,用蜂鸣器发出不同含义的蜂鸣;如无故障,屏幕会开始显示cpu,内存,硬盘等等信息。
-
加载带有操作系统的硬盘:
BIOS在自检结束后,开始读取Boot Sequence(通过CMOS里存的启动顺序,或者通过与用户交互的方式),把控制权交给排序第一位的设备。然后CPU将该存储设备的引导扇区的内容存至内存中。
-
加载主引导记录MBR:
硬盘以特定的标识符区分引导硬盘和非引导硬盘。如果发现该盘不是可引导盘,就换下一个。若没有课引导盘,会导致死机。主引导记录MBR的作用就是告诉CPU去硬盘的哪个分区去寻找操作系统。
-
扫描硬盘分区表,并加载硬盘活动分区:
MBR包含硬盘分区表,硬盘分区表以特定的标识符区分活动分区和非活动分区。主引导记录扫描硬盘分区表,进而识别含有操作系统的硬盘分区(活动分区)。找到硬盘的活动分区之后,开始加载硬盘的活动分区,将控制权交给活动分区。
-
加载分区引导记录PBR:
读取活动分区的第一个扇区,这个扇区称为分区引导记录(PBR),其作用是寻找并激活分区根目录下,用于引导操作系统的程序(启动管理器)。
-
加载启动管理器:
分区引导记录搜索活动分区中的启动管理器,并加载它。
-
加载操作系统
1.9 虚拟机
虚拟机是一台逻辑计算机。通过隐藏特点计算平台的实际物理特性,为用户提供抽象、统一、模拟的计算环境。有两种虚拟方法。
1 第一类虚拟管理程序
该虚拟机作为用户态执行,不允许使用特权指令。而虚拟机上的操作系统认为自己是在内核态(实际上不是),成为虚拟内核态。
在支持虚拟化的CPU上,执行特权指令时,,虚拟机管理程序会检测是虚拟机中的操作系统执行的还是虚拟机中的用户程序执行的。前者,会安排正常执行;否则,虚拟机管理程序会模拟真实硬件,面对用户,模拟执行特权指令时的行为。
2 第二类虚拟管理程序
是一类与操作系统分配和调度资源的程序,很像一个普通的进程。。这一类仍然伪装成具有CPU和各种资源的完备计算机。VMware是首个在x86上的第二类虚拟管理程序。
刚开始启动的时候,这一类虚拟管理程序像一台刚启动的计算机那样运转,期望找到的驱动器可以是虚拟设备。然后将操作系统安装到虚拟磁盘上(宿主操作系统中的一个文件)。安装完成后即可运行。
有的说法,把第一类成为裸金属架构,第二类称为寄居架构。