操作系统的结构
操作系统主要是四种结构:单体结构、分层系统、微内核、客户-服务端系统
单体结构
整个操作系统作为一个大型、单一的二进制程序在内核态运行。
优点是整个系统在一个文件中,上下文开销小;缺点是如果某一个内容出现问题,整个系统崩溃。初期的Linux就是这种结构。
为了增强系统的模块性和可扩展性,现代操作系统引入了模块化和动态加载的机制。
分层结构
将系统分为多层,类似于网络分层,每层通过接口通信。
这种系统增加了模块化程度与可维护性和拓展性,但是维护起来也非常麻烦。
微内核
现代众多操作系统的选择。传统上,所有的层都被置于内核中,但这并非必要,且可能不是最佳实践。实际上,减少内核中的功能以达到最小化内核的目标可能是更优的选择。因为内核中的错误难以处理,一旦出现错误,可能导致整个系统的崩溃。
所以就将操作系统划分为微小且功能明确的模块,这些模块中只有微内核在内核模式下运行,其他都在用户态下运行。
客户-服务器模式
微内核思想的策略是把进程划分为两类: 服务器 ,每个服务器用来提供服务; 客户端 ,使用这些服务。这个模式就是所谓的 客户-服务器 模式。
许多网吧采用这种模式,只有I/O设备没有主机,统一由中央服务器调度。
计算机启动过程
- CPU上电,会触发硬件reset异常,这个异常会被CPU厂家固化到某一固定位置去执行启动程序。
- 这个启动程序叫
bootloader
,这个程序干两件事:boot(启动)
:初始化硬件。- 也有一些可能的用户交互,最终目的还是将OS内核的镜像文件加载到ram上。
loader(加载)
:加载OS内核。- 将OS内核从存储介质中加载到内存中。
- 内核加载需要 启动参数(要这个系统干什么活),不同系统有不同做法。
- 加载好内核之后并不能直接使用,因为内核只提供 机制(能干什么活),还需要 策略 (怎么去做)。
- 策略 由应用程序来做,但是如何找到并运行他们呢?
- 程序需要 载体:磁盘、内存、NFS…
- 操作系统先加载载体,这个载体就是 根文件系统。再由根文件系统加载对应程序。
- 最后用户跟应用程序交互来完成对操作系统的调用。
操作系统发展史
- 手动操作阶段
- 这个阶段由人工进行多数操作,分配任务等。
- 批处理阶段
- 单道批处理
- 内存中只能有一个作业。
- 还有另一个监督程序进行管理。
- 单道批处理就像银行窗口,每个任务都需要排队处理,一个人没结束下一个人就不能处理。
- 由于只能放一个作业,所以系统资源利用率很低。
- 多道批处理
- 内存中允许放多道作业。
- 正在运行的程序因I/O等原因而暂停时,可以放弃CPU资源让其处理另一个程序。
- 这个放弃是程序中写死的主动放弃,由程序主管CPU。
- 批处理的问题是系统资源利用率不高,且人机交互困难。
- 单道批处理
- 分时操作阶段
- 将计算机资源以时间片为单位均分,保证多任务的执行。
- 解决了人机交互困难的问题。
- 实时操作阶段
- 这个系统特别关注两个个问题:抢占调度、endline(截止时间)。
- 支持紧急任务不需要时间片排队,确保系统接收外部信号时及时处理。
- 是否能在规定时间内做完,有些不能完成的任务甚至调都不调。
并行与并发
- 并行
- 同一时刻,多个人干多件事。
- 并发
- 同一时间间隔内,一个人干多个事。
-
若文件数据不在内存中,则会调用驱动访问磁盘,这个属于I/O操作了,所以进程会进入休眠。
-
中断与异常的处理
- 中断会直接执行 trap指令(专门用于处理中断和异常的指令)。
- 异常会先传参数,再执行trap。