操作系统概述:概念、发展、运行机制与结构
本篇对应王道第一章(原 7 篇合并:概念 / 发展历程 / 运行环境 / 结构 / 引导 / 虚拟机)。先建立"操作系统是什么、怎么来的、怎么跑起来的"整体认识,后面的进程、内存、文件、IO 全挂在这条主线上。
一、操作系统是什么
计算机系统自下而上:硬件 → 操作系统 → 应用程序 → 用户。
硬件(CPU、内存、IO 设备)提供基本计算资源;应用程序(浏览器、编译器、制表软件)规定怎么用这些资源解决问题。操作系统卡在中间,承上启下:向下管理硬件,向上提供服务。
一句话定义:
操作系统指控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便的接口与环境的程序集合。是最基本的系统软件。
直观理解——奴隶主、奴隶和机器:
用户是奴隶主;操作系统是奴隶,有熟练技能;计算机是机器,由处理机、存储器、设备、文件几个部件构成。
- 奴隶必须接收奴隶主的命令 → 这就是"接口"
- 奴隶有技能、能控制协调各部件 → 这就是"四大管理"
- 有了奴隶,机器发挥更大作用 → 这就是"扩充机器"(裸机 + OS = 功能更强的虚拟机)
四大管理(资源管理者视角)
| 管理 | 又名 | 干什么 | 主要功能 |
|---|---|---|---|
| 处理机管理 | CPU 管理 / 进程管理 | 分配 CPU | 进程控制、进程通信、死锁处理、调度 |
| 存储器管理 | 内存管理 | 分配内存 | 分配回收、地址映射、保护共享、扩充 |
| 文件管理 | 文件系统 | 管理文件 | 存储空间管理、目录管理、读写保护 |
| 设备管理 | IO 管理 | 管理设备 | 缓冲管理、设备分配、设备处理、虚拟设备 |
💡 处理机分配和运行以进程为基本单位,所以处理机管理又可以归结为进程管理——这就是它有三个名字的原因。
盲点:操作系统只管文件的"位置",不管文件的"内容"。就好比给你 10 个杯子管理,你只关心杯子放哪合适,不用关心杯里是水还是饮料。所以什么源程序管理、编译器管理,统统是"杯子里的水",不归 OS 管。
两类接口(用户视角)
命令接口(说给人用):
- 联机命令接口(交互式):输入一条命令 → 命令解释程序执行 → 结果返回控制台 → 等下一条。就像正在用的 cmd,说一句做一句,强调交互性,适合分时/实时系统。
- 脱机命令接口(批处理):事先把一串作业控制命令写成作业说明书,连同作业一起提交,系统逐条执行,中途无法干预。相当于列一张待办清单交给操作系统,适合批处理系统。
程序接口(给程序员用):由一组系统调用(又称广义指令)组成,在程序里请求 OS 服务(申请内存、用外设等)。日常见的 GUI 严格说不属于 OS 本体,本质也是在调程序接口。
二、四大特征:并发、共享、虚拟、异步
并发 共享 虚拟 异步——前两个最基本,互为存在条件。
并发:同一时间间隔内交替发生
注意是时间间隔不是时间点(时段 vs 时刻)。洗衣做饭和边做饭边听歌的区别:
- 并发:11:00-11:30 洗衣服,11:30-12:00 做饭——微观上交替
- 并行:洗衣服的同时放着歌做饭——真·同时
OS 引入进程概念,就是为了让系统具备处理和调度多个程序同时执行的能力。微观上程序交替执行,并发靠分时实现,也需要硬件支持(多流水线、多处理机)。(CPU 与 IO 设备之间、IO 设备相互之间能实现真正并行。)
共享:资源供多个并发进程共同使用
- 互斥共享:我在用你就不能用,得等我用完。这类资源叫临界资源——打印机就是典型:虽然能给多个进程用,但不同步的话第一行打文档 A 第二行打文档 B,全乱套。多数物理设备、栈、变量、表格都是临界资源。
- 同时共享:允许同一时段多个进程"同时"访问,但微观上可能还是交替。典型是磁盘设备、可重入码编写的文件。
两者的区别就一句话:是否允许在同一时段访问同一资源。互斥要求哪怕极小时间片内也只能满足一个请求;同时共享允许一个请求分成几个时间片段完成,效果等同连续完成。
💡 这部分内容其实在研究共享文件夹、git 同步冲突的时候已经有体感了。
并发和共享互为存在条件:不允许并发,就谈不上资源共享;资源管不好,并发也进行不下去。
虚拟:把一个物理实体变成若干逻辑对应物
程序 A 要打印机,程序 B 也要,打印机只有一台——但俩程序都正常用上了,好像人人配了一台。这就是虚拟。三类虚拟技术:
- 虚拟处理器:多道程序分时使用一个 CPU,每个终端用户感觉独享 CPU(时分复用)
- 虚拟内存:程序太大装不进内存?先放一部分,用完再换,逻辑上扩充了容量(空分复用)
- 虚拟设备(IO):一台物理设备虚拟成多台逻辑设备——打印请求先进缓冲区排队,程序发完请求就去干别的,不用干等(SPOOLing 的思想)
归纳:时分复用(处理机)+ 空分复用(内存)。
异步:走走停停,以不可预知的速度推进
多道并发、资源有限,进程必然走走停停。OS 运行在随机环境下,可能产生与时间相关的错误(就像全局变量访问顺序不当会出错)。但只要运行环境相同,多次运行必须得到相同结果。
为什么说并发和共享是"必须的",后两个不是? 不能并发就没必要共享,共享不合理一定并发不成功——缺一就无法实现多道程序系统。而虚拟内存不过是让能同时跑的程序更多,没有它我完全可以把两个程序整个装进内存,照样多道。异步是并发的自然结果,也不是前提。
三、发展历程:一步步逼出来的
手工操作阶段(无 OS)
程序装入、运行、输出全靠人工。两大痛点:用户独占全机(资源利用率低)、CPU 等手工操作(利用不充分)。
单道批处理:中间加个管理员
我写好程序交给机房管理员,他等机器空了帮我排队执行,我回去等结果。内存中始终只有一道作业。特征:自动性、顺序性、单道性。
问题依旧明显——同时只干一件事,CPU 利用率低。就像煮饭:米下电饭煲,你就闲着,非得等跳闸才能下一步,这段时间全浪费了。
多道批处理:让各部分都忙起来
多个程序同时进内存,在 CPU 上交替运行。一道程序因 IO 暂停时,CPU 立刻去跑另一道。
特征:多道、宏观并行、微观串行。还是洗衣做饭的例子——11 点整先把衣服泡上,浸泡的空档去洗菜、淘米下锅,等饭的空档把衣服搓洗干净……到 12 点两件事都完成。11:00-12:00 这个时间段里两件事是"一起"在做的(宏观并行);但任取一个时刻比如 11:40,我要么在洗衣服要么在做饭,不可能同时(微观串行)。
需要解决的问题:CPU 怎么分配?内存怎么分?IO 设备怎么分?大量数据程序怎么组织存放?——这不就是操作系统四大管理的雏形。
| 优点 | 缺点 | |
|---|---|---|
| 单道批处理 | 实现简单 | CPU 大量空转 |
| 多道批处理 | 资源利用率高、吞吐量大 | 单作业响应变慢(11:30 能洗完的衣服得等到 12 点)、无人机交互 |
分时系统:加回人机交互
把处理器时间切成很短的时间片,轮流分配给各联机作业。轮转太快,每个用户感觉独占整台机器(哦吼,这不也是一种时分复用虚拟)。
和多道批处理的本质区别就是人机交互回来了:可以随时干预、管理程序,调度也不再只靠 IO 中断切换,还加了固定时间片轮转。
💡 时间片轮转解决了一个公平性问题:如果我一个 2 秒的程序,你一个要跑 1 分钟的程序——没有时间片的话,我得等你 1 分钟 IO 中断才轮到我,2 秒的活干成 1 分 02 秒。有了时间片:你跑 3 秒让给我,我跑完还你——单个任务和整体效率都上去了。
特征:同时性(多路性)、交互性、独立性(互不干扰,感觉独占)、及时性。
盲点:时间片固定时,用户数越多,每人分到的越少,响应时间越长——T = Q × N(响应时间 = 时间片 × 用户数)。
实时系统:紧急的事不能排队
分时系统再快也是"轮流",但有些场景必须在规定时间内响应(导弹制导、机票预订)。实时系统分两档:
- 硬实时:绝对不能迟。飞行器自动控制,慢一点都不行
- 软实时:偶尔超时无所谓。机票系统、银行系统
盲点:实时系统不是"来一个执行一个",它靠高优先级 + 可抢占保证紧急事件被及时处理。
之后
网络操作系统(资源共享 + 通信)、分布式系统(多台计算机协同完成同一任务,无主无从、可重构——与网络 OS 的区别就在"协同")、个人计算机 OS(Windows / Linux / macOS)、嵌入式、服务器、手机 OS。
四、运行机制:用户态与核心态
两种指令,两种状态
程序分两种:内核程序(管理者)和用户程序。管理者要执行特权指令(IO 指令、置中断、改内存保护寄存器),用户程序出于安全绝不能碰,只能通过系统接口调用。
那 CPU 怎么区分?本来它只负责无脑执行,要是每条指令都停下来判断"这条允不允许",岂不浪费效率——
解决办法:给 CPU 装一个小开关。
- 开关 = 0 → 核心态(管态):能执行特权指令。注意,"切换到用户态"的指令本身也是特权指令
- 开关 = 1 → 用户态(目态):只能执行非特权指令
那怎么从用户态切回核心态? 用户态不能执行特权指令,但可以主动"按门铃"——执行访管指令(trap/陷入指令),产生中断事件,由硬件把状态切到核心态。
⚠️ 方向不同,执行者不同:核心态→用户态由操作系统程序执行完成;用户态→核心态由硬件完成。这是高频考点。
中断和异常:进入核心态的唯一入口
CPU 跑上层程序时,进核心态的"门"只有一条路——中断或异常(硬件实现:寄存器里一位,置 0 即核心态)。
| 中断(外中断) | 异常(内中断) | |
|---|---|---|
| 来源 | CPU 指令外部:IO 完成信号、时钟中断 | CPU 指令内部:非法操作码、地址越界、除 0、缺页、陷入指令 |
| 分类 | 可屏蔽(INTR 线)、不可屏蔽(NMI 线,如掉电) | 故障(缺页、除 0)、自陷(事先安排的 trap)、终止(硬件致命错误) |
异常不可屏蔽,一旦出现必须立即处理。故障/自陷属软件中断,终止/外中断属硬件中断。
处理过程:CPU 执行第 i 条指令时检测到异常(或执行后发现中断请求)→ 打断用户程序 → 转中断/异常处理程序 → 可解决则执行返回指令回到第 i 或 i+1 条 → 不可恢复则终止程序。
硬件和操作系统各干什么?
- 硬件:保存断点(PC)和程序状态字(PSW)、找中断向量、置核心态——中断处理流程的前三步(隐指令)由硬件直接完成
- 操作系统:保存通用寄存器、执行中断服务程序
💡 对比子程序调用:子程序调用只保存断点;中断处理连 PSW 一起保存。中断处理中最重要的两个寄存器是 PC 和 PSWR。
"现代操作系统是靠中断驱动的软件"——键盘鼠标输入、进程调度、系统调用、设备驱动、文件访问,全依赖中断机制。
系统调用:用户程序请 OS 代劳
凡是涉及资源的操作(存储分配、IO 传输、文件管理),用户程序必须通过系统调用请求 OS 代为完成。按功能分:设备管理、文件管理、进程控制、进程通信、内存管理。
流程:用户程序执行陷入指令 → CPU 从用户态转核心态 → 内核程序处理请求 → 处理完把 CPU 使用权还给用户程序 → 转回用户态。
为什么非得这么绕?——这类操作对系统影响太大,必须用特权指令、必须内核代劳,才能保证系统稳定和安全,防止用户程序乱来影响别的进程。
盲点集:
- 系统调用在用户态调用,核心态执行——注意"调用(发生)"和"执行"的区别
- 用户程序无法形成屏蔽中断指令;编译系统调用命令后形成若干参数 + trap 指令
- 通道是一种特殊处理器(硬件技术),能执行 IO 指令控制 IO 操作
- 需要硬件支持的:中断系统(隐指令)、地址映射(基址/页表寄存器)、时钟管理(硬件计数器);进程调度不需要,算法是 OS 软件实现的
- 核心态不是"只能执行特权指令",它能执行除访管指令外的全部指令
- 时钟中断:处理时间相关信息(系统时间、时间片、延时、定时器),并决定是否执行调度程序
五、内核与体系结构
内核的四样东西
操作系统分层思想(复杂问题分而治之):与硬件紧密相关的模块(时钟、中断、驱动)在最底层,高频程序(进程/存储器/设备管理)在其上——这两部分构成内核,工作在核心态。
- 时钟管理:计时 + 时钟中断(时间片轮转、实时截止时间、作业计时都靠它)。系统运转的命脉
- 中断机制:只把保护/恢复现场、转移控制权这一小部分放内核,缩短中断处理时间
- 原语:要么全做要么全不做的程序。最底层、最接近硬件、原子性、短小高频。实现方法就是关中断——所有动作一气呵成后再开中断。(理解成封装好的底层小函数即可)
- 系统控制的数据结构:PCB、设备控制块、各类链表、消息队列、缓冲区、内存分配表等登记状态信息的结构
四种体系结构
分层法:OS 分成若干层,第 0 层硬件,第 N 层用户接口,单向依赖(类似计网分层)。优点:调试验证方便(第 1 层出错就只查第 1 层,因为低层都验证过了)、易扩充维护。缺点:层间依赖固定后不灵活;每执行一个功能要穿多层,通信开销大,效率差。
模块化:按功能划分模块 + 规定接口(模块-接口法)。分太小→模块间联系过多太乱;分太大→模块内部太复杂,要权衡。衡量独立性的老朋友(软件工程那套):内聚(模块内联系,越高越好)、耦合(模块间联系,越低越好)。
宏内核 vs 微内核:
| 宏内核(单内核/大内核) | 微内核 | |
|---|---|---|
| 思路 | 主要功能模块都是内核,整体运行在核心态 | 只留最基本功能在内核,其余移到用户态的服务器进程 |
| 性能 | 无可比拟的优势(模块间直接调用) | 频繁用户态/核心态切换,开销大 |
| 可靠性 | 一处崩溃全家崩溃(文件服务在内核态,出问题系统直接崩) | 一个模块崩了只崩自己,强制停掉重启即可,系统不崩 |
| 扩展性 | 改功能得动内核 | 加新服务 = 加个用户态服务器,内核不动 |
| 代表 | Windows、Linux、Android、iOS、macOS | Fuchsia、鸿蒙瞄准的方向;实时/工业/航空/军事领域流行 |
宏内核就像一个人,越胖活动越困难——"软件危机"催生了微内核。但从发展看宏内核在桌面端取得绝对胜利,主流系统早已是糅合微内核优点的混合内核。
微内核的核心设计原理是机制与策略分离:机制(怎么做的执行机构)放内核——如进程优先级队列、页表机制、地址变换;策略(用什么参数/算法优化)放外层服务器——如优先级怎么定、页面置换算法选哪个。正因如此,内核才能做小。
外核(exokernel):另一条路——对机器分区,每个虚拟机分到真实资源的一个子集(这台分磁盘 0~1023 盘块,那台分 1024~2047)。外核程序在内核态运行,负责分配资源、检查越界企图。优点:免去"虚拟盘块号→真实盘块号"的重映射层;多道程序(外核内)与用户 OS 代码(用户空间)天然分离。
六、操作系统引导:从按下电源到桌面
OS 也是程序,以数据形式躺在硬盘上。引导 = 计算机利用 CPU 运行特定程序,识别硬盘 → 识别分区 → 识别 OS → 启动它,一环扣一环:
- 激活 CPU:读取 ROM 中的 boot 程序,指令寄存器指向 BIOS 第一条指令
- 硬件自检(POST):检查硬件故障,有故障主板蜂鸣报警终止;无故障显示 CPU、内存、硬盘信息
- 加载带 OS 的硬盘:读 CMOS 里的启动顺序(boot sequence),把控制权交给第一位的存储设备
- 加载主引导记录 MBR:MBR 告诉 CPU 去哪个主分区找操作系统
- 扫描分区表,加载活动分区
- 加载分区引导记录 PBR:寻找并激活分区根目录下的启动管理器
- 加载启动管理器
- 加载操作系统
盲点:
- 两种"引导程序"别混:ROM 里的自举程序(BIOS 的一部分,启动设备)vs 硬盘活动分区引导扇区里的操作系统引导程序(启动管理器,引导 OS)
- OS 并非全部载入内存,常驻内存的只有内核,其余按需调入
- CPU 激活后从最高地址 FFFF0H 取第一条指令——那里只有 16 字节,放不下程序,所以是一条 jmp,跳去执行 BIOS;BIOS 先在内存开头构建中断向量表(POST 要用),再做通电自检
- CMOS 记录硬件配置,电脑太老 CMOS 电池没电,就无法驱动硬件启动
七、虚拟机:在一台机器里再装一台
虚拟机 = 利用虚拟化技术,隐藏真实物理特性,提供抽象、统一、模拟的计算环境。两类管理程序:
第一类(裸金属架构):管理程序直接跑在裸机上,本身就是最高特权的"操作系统",具备多道程序功能,向上提供若干台裸机的精确复制品。
- 虚拟机里的 OS 以为自己跑在内核态(实际不是,叫虚拟内核态),用户进程倒真在用户态
- 客户 OS 执行敏感指令时陷入管理程序:是 OS 执行的→安排正确执行;是用户程序执行的→模拟真实硬件在用户态执行该指令的行为
第二类(寄居架构):管理程序依赖 Windows/Linux 等宿主 OS 分配调度资源,像普通进程。VMware 是首个 x86 平台的第二类实现。系统装到"虚拟磁盘"上——其实只是宿主 OS 里的一个文件。底层 OS 叫宿主操作系统,跑在虚拟机上的都叫客户操作系统。
应用场景:Web 托管。没有虚拟化时只有共享托管(不能控制服务器软件)和独占托管(贵);虚拟化让一台物理机跑多台虚拟机,每台看起来都是完整服务器,客户装自己的系统和软件,只付低价——这就是云主机。
💡 Windows To Go 不是虚拟化(曾疑惑过这个):WTG 把 OS 装在移动硬盘上,启动时直接在真实硬件上运行,替换了原启动盘,不经过任何虚拟层——它是"便携操作系统",不是虚拟机。虚拟机是共享同一套物理硬件、切出多个隔离环境;两者都让你"到哪都是自己的电脑",但路径完全不同。同理,"本机异地使用"还有云虚拟桌面(AWS WorkSpaces、Azure VDI)、虚拟机镜像随存随取、远程桌面三条路,各自取舍。
八、盲点总复习
- OS 的特征里并发和共享是最基本的、互为存在条件;虚拟和异步不是多道程序的必要条件
- 多重程序设计的基本特征:制约性、间断性、共享性——无封闭性和顺序性(顺序性是单道的特征)
- 分时系统响应时间 T = Q × N;实时系统靠高优先级 + 可抢占
- 用户态→核心态靠硬件(中断机制),核心态→用户态靠 OS 执行特权指令
- 中断/异常是用户态进核心态的唯一途径
- 硬件保存 PC 和 PSW,OS 保存通用寄存器
- 核心态可执行除访管指令外的全部指令;系统调用用户态调用、核心态执行
- 常驻内存的只有 OS 内核;引导程序有两种(ROM 自举 vs 硬盘引导扇区)
- 微内核 = 机制在内核、策略在服务器;性能是它的主要问题(频繁切换)
- WTG、云桌面、远程桌面都不是虚拟机,区别在有无虚拟化层
主线已经立起来了:OS 靠中断驱动、围绕进程/内存/文件/IO 四大管理展开。下一站进入进程的世界 → 02-进程与线程
💬 评论