操作系统

\

操作系统

学习蒋炎岩《操作系统》课程的学习笔记
同时参考课程教科书《Operating Systems:Three Easy Pieces》的中文版 -- 《操作系统导论》

计算机的本质是状态机,一部分存储当前状态,一部分用于在每个时钟周期内计算并转移至下一状态
程序也可以看成一个状态机,并且是计算机状态机的一部分,程序在计算机上的运行即为计算机从某一初始状态开始计算下一状态并转移(执行指令)

为了能够多程序共用计算机中的硬件同时运行,产生了用于调度的操作系统

系统内核

内核是应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节

Kernel_Layout.png (1280×1011) (xiaolincoding.com)|600

现代操作系统的内核一般会提供 4 个基本能力:

Linux

特点:

微内核:内核只保留最基本的能力,比如进程调度、虚拟机内存、中断等,把一些应用放到了用户空间,比如驱动程序、文件系统等
这样服务与服务之间是隔离的,单个服务出现故障或者完全攻击,也不会导致整个操作系统挂掉,提高了操作系统的稳定性和可靠性

混合类型内核:内核里面有一个最小版本的内核,其他模块在这个基础上搭建,实现时跟宏内核类似,把整个内核做成一个完整的程序,大部分服务都在内核中,像是以宏内核的方式包裹着一个微内核

Windows

windowNT.png (1024×1313) (xiaolincoding.com)|575

特点:

用户态 & 内核态

根据进程访问资源的特点可以把进程在系统上的运行分为两个级别:

systemcall.png (1053×332) (xiaolincoding.com)

当应用程序需要执行某些需要特殊权限的操作,就需要向操作系统发起系统调用请求,进入内核态
应用程序使用系统调用时产生一个中断,CPU 中断当前在执行的用户程序,跳转到中断处理程序,也即内核程序开始执行,内核处理完后,主动触发中断,把 CPU 执行权限交回给用户程序,回到用户态继续工作

分级原因

部分 CPU 指令如内存分配,IO 处理等非常危险,如果错用将导致整个系统崩溃,因此 CPU 指令分为 特权指令非特权指令,特权指令只允许由操作系统内核态执行

基于安全的考虑,CPU 提供了特权分级机制,把区域分成了四个 Ring,越往里权限越高,越往外权限越低

操作系统根据 CPU 的特权分级机制,把进程的运行空间分为内核空间用户空间,分别对应着 CPU 特权等级的 Ring 0 和 Ring 3

进程既可以在用户空间运行,又可以在内核空间中运行

切换方式

用户态到内核态的常见切换方式包括系统调用中断异常

对于中断和异常,系统都是通过中断向量表来找到相应的处理程序进行处理
区别在于中断来自处理器外部,不是由任何一条专门的指令造成,而异常是执行当前指令的结果

系统调用

系统调用按功能大致分为四类

系统调用步骤

  1. 用户态的程序发起系统调用,因为系统调用中涉及一些特权指令(只能由操作系统内核态执行的指令),用户态程序权限不足,因此会引发 Trap(一种中断)
  2. 发生中断后,当前 CPU 执行的程序会中断,跳转到中断处理程序,内核程序开始执行,也就是开始处理系统调用
  3. 内核处理完成后,主动触发 Trap,再次发生中断,切换回用户态工作

中断

中断是系统用来响应硬件设备请求的一种异步的事件处理机制
操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求

中断避免了 CPU 轮询等待某条件成立,可以提高系统的并发处理能力

中断处理程序应尽可能快的执行完,以减少对正常进程运行调度的影响

硬中断 & 软中断

linux 将中断分为硬中断和软中断两部分,以避免中断处理程序执行过长和中断丢失的问题

中断处理程序在响应中断时,可能会「临时关闭中断」,这意味着,如果当前中断处理程序没有执行完之前,系统中其他的中断请求都无法被响应,也就是中断丢失

具体实现

软中断的作用就是承接原本硬中断处理程序比较复杂且耗时的工作,让硬中断的中断处理函数的逻辑尽可能的简单,从而提高系统的中断响应速度
linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型