第一章 操作系统概论
操作系统是系统软件,管理计算机系统软硬件资源,并方便用户。
功能:
(1)资源管理:处理器、存储、设备(统一应用程序访问外围设备的方式)、文件管理
存储管理
分配回收:操作系统决定哪个进程获得多少内存,并在进程结束时收回空间。
地址映射:将程序使用的“逻辑地址”转换为硬件实际识别的“物理地址”。
内存保护:确保每个进程只能访问分配给它的内存区域,防止进程互相干扰。
虚拟内存:物理内存不足时,将部分不常用数据暂时移到硬盘(交换空间),让程序以为拥有比实际物理内存大得多的空间。
缺失后问题:
内存冲突:程序会互相覆盖彼此的数据,导致系统频繁崩溃(“蓝屏”)。
效率低下:无法实现多任务运行(无法安全地在内存中同时放置多个程序)。
程序受限:无法运行比物理内存容量更大的程序。
处理器管理
进程调度:在多任务环境下,决定哪个进程在什么时候占用 CPU,占用多久(通过时间片轮转、优先级等算法)。
进程同步与互斥: 协调多个进程同时访问共享资源时的顺序,防止死锁或数据错误。
状态转换: 管理进程的生命周期,包括创建、就绪、运行、阻塞和撤销。
缺失后的问题: 无法并发: 计算机一次只能运行一个程序。如果该程序进入死循环,整个计算机将永久卡死。
资源争抢: 两个程序可能同时尝试修改同一个变量,导致计算结果完全不可预测。
响应迟钝: 用户无法在后台下载文件的同时在前台编辑文档。
设备管理
设备分配: 统一分配键盘、鼠标、显卡、打印机等硬件,防止多个程序同时占用独占设备(如打印机)。
驱动程序接口: 为上层软件提供统一的接口(如 read()/write()),屏蔽不同硬件厂商的复杂细节。
缓冲区管理: 解决 CPU 高速运算与外设(如硬盘)慢速读写之间的速度矛盾。
SPOOLing 技术: 实现虚拟设备,例如让多个用户看起来是在“同时”使用一台打印机。
缺失后的问题: 硬件不通用: 程序员需要为每一种型号的打印机或显卡编写专门的代码,开发成本剧增。
硬件冲突: 两个程序同时向打印机发送指令,打出来的可能是一堆乱码字符。
效率极低: CPU 必须停下来等待慢速外设完成工作,造成严重的计算资源浪费。
文件管理
存储空间管理: 管理硬盘上的扇区,决定文件存放在哪,并跟踪哪些空间是空闲的。
目录管理: 建立文件夹结构,方便用户通过文件名查找数据。
访问权限控制: 决定谁可以读取、写入或删除某个文件,保障数据安全。
文件操作接口: 提供创建、打开、关闭、读写等标准操作。
缺失后的问题:
数据管理混乱: 用户必须记住数据在硬盘上的具体物理位置(如“第1024个扇区”),而不是通过文件名查找。
数据丢失风险: 缺乏组织,新保存的数据极易覆盖掉旧数据。
隐私泄露: 任何用户和程序都可以随意读取、修改或删除系统中的任何文件,完全没有安全性可言。
(2)控制执行(并发控制与协调)
(3)提供接口(作业管理等)
操作系统核心技术:
资源复用(解决资源不足问题)
资源虚拟化(在虚拟资源上应用程序独占,解决资源不足问题,向用户屏蔽系统复杂性)
单个物理地址在逻辑地址上有多个对应(OS翻译),造成进程独占资源的假象,由OS完成对底层物理资源的复用(进行适当错位与排布,即相同虚拟地址映射到不同的物理地址)。
程序之间进行通信时可以交叉(数据共享)
资源抽象(向用户屏蔽系统复杂性,维持易用性)
创建软件向用户屏蔽资源的物理特性与资源细节,简化对硬件的访问与操作。只提供应用接口
(内存分配函数)
操作系统的基础抽象
进程:已进入主存正在运行的处理器上操作状态集的抽象
通过时间片计时,在各运行程序之间切换以保证公平性,切换/中断时需保存各应用程序执行状态,抽象此为进程以便于保存。
虚存:物理主存的抽象(使用虚拟地址引用物理主存单元)(一般是物理主存与外存可支持的大小)
文件:存储设备的抽象
操作系统的主要特性
并发性
多个事件、活动在同一时间间隔内发生
并发不等同于并行(并发只在仅一个CPU情况下不同事件分别占用CPU运行,并非同时运行)
异步性(随机性)
程序执行存在随机性:事件请求的随机性(所需资源与请求随机),作业到达时间、应用中断事件随机。
可能导致与时间有关的错误。
保证:同一个程序,相同环境,相同输入,多次运行得到相同结果。
共享性
资源有限时,并发导致资源共享
透明资源共享:无需应用程序参与,操作系统实现资源隔离、授权访问
显示资源共享:应用程序参与
系统调用(System Call)(重点)
1.准备阶段(用户态)
当用户程序调用一个库函数(如 C 语言的 printf() 或 open())时:
参数传递:程序将系统调用所需的参数(如文件路径、标志位等)放入指定的寄存器中(在某些架构中也可能压入栈)。
系统调用号:程序将对应的系统调用号(每个系统服务都有唯一的数字 ID,如 Linux 中 read 是 0,write 是 1)放入特定的寄存器(如 x86 架构的 eax)。
2.陷阱指令/中断(切换点)
程序执行一条特殊的硬件指令,触发从用户态到内核态的跳转:
触发指令:在现代 x86 架构中通常是 syscall 或 sysenter 指令(旧版 Linux 使用 int 0x80 软中断)。
硬件响应:CPU 接收到指令后,立即暂停当前用户程序,保存当前的运行状态(程序计数器 PC、栈指针 SP 等),并将 CPU 的运行级别从 Ring 3(用户态) 提升到 Ring 0(内核态)。
3.系统调用处理程序(内核态)
CPU 跳转到内核中预先定义好的中断向量表或系统调用入口点:
保护现场:内核首先将用户态的寄存器值保存到内核栈中,防止被后续操作覆盖。
查表跳转:内核读取之前放入寄存器的“系统调用号”,查阅系统调用表(System Call Table),找到对应内核函数的入口地址(例如找到内核中处理 write 的函数 sys_write)。
执行服务:内核执行具体的业务逻辑(如操作磁盘、访问内存)。
4.返回阶段(切换回用户态)
任务完成后,内核开始收尾工作:
设置返回值:将操作结果(成功或错误码)放入指定的寄存器(如 eax 或 rax)。
恢复现场:从内核栈中恢复用户程序之前保存的寄存器状态。
切回用户态:执行返回指令(如 sysret 或 iret),将 CPU 运行级别降回 Ring 3,并跳转回用户程序触发系统调用的下一条指令处继续执行。
时分复用(Time Division Multiplexing, TDM)是一种通过时间划分将多个信号或数据流复用到同一信道的技术。
时分复用的核心思想是将信号的传输时间划分成若干个小的时间片(时隙),每个信号在各自的时间片内占用传输通道,按顺序传输其数据。这样,多个信号可以在同一时间共享同一信道,从而提升信道的利用率。
利用多路空间上的正交信道来同时传输信号的技术
空分复用(SDM)技术是一种利用多路空间上的正交信道来同时传输信号的技术,旨在提高网络容量并降低干扰。它最早在无线通信领域被提出,并与波束成形和大规模MIMO等技术相关联。在5G网络中,空分复用(SDMA)被视为关键技术之一,能够通过空间维度区分不同用户的数据流,从而提升频谱效率和用户体验。
第一章 操作系统概论
操作系统的概念(定义):操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基础的系统软件。(任务管理器)
操作系统的功能与目标:
(1)作为系统资源的管理者:处理机管理、存储器管理、文件管理、设备管理,目标是安全、高效。
(2)向上层提供方便易用的服务:封装思想。
(GUI:图形化用户接口,用户可以使用图形化界面操作)
联机命令接口(交互式命令接口)
脱机命令接口(批处理命令接口)
程序接口:在程序中进行系统调用来使用程序接口,只能通过程序代码间接使用。
操作系统的四个特征
并发(最基本特征):两个或多个事件在同一个时间间隔内发生,宏观上是同时发生的,但微观上是交替发生的
(区别于并行:两个或多个事件在同一时刻同时发生)
操作系统的并发性:计算机系统种“同时运行着多个程序”,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。
单核CPU同一时刻只能执行一个程序,各程序只能并发地运行。
多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行。
共享(最基本特征):系统中的资源可供内存中多个并发执行的进程共同使用。两种方式:互斥共享方式、同时(可能是并发)共享方式。
失去并发性,则共享性也就无意义;失去共享性,并发也就难以实现。
虚拟:把一个物理上的实体变为若干个逻辑上的对应物,物理实体是实际存在的,而逻辑上的对应物是用户感受到的。(时分复用技术、空分复用技术)
失去并发性,虚拟性也就无意义。
异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,程序的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进。
只有系统拥有并发性,才可能导致异步性。
空分复用:将资源划分成小块然后分配给不同的进程
时分复用:将时间划分成片,然后分配给进程,进程可以在一个时间片内独享资源
操作系统的发展与分类
(1)手工操作阶段
(2)批处理阶段——单道批处理系统
引入脱机输入/输出技术,并由监督程序负责控制作业的输入与输出(减免人工费时)
(3)批处理阶段——多道批处理系统
操作系统正式诞生,用于支持多道程序并发进行,然而不提供人机交互功能
(4)分时操作系统,可轮流为各个用户/作业服务,用户请求可以被即时响应,但不能优先处理一些紧急任务
(5)实时操作系统,能优先相应一些紧急任务(硬实时系统:绝对严格执行;软实时系统:允许偶尔违反规则)
操作系统的运行机制
两类程序:内核程序与应用程序
两类指令:特权指令与非特权指令
两种处理器状态:内核态/核心态/管态;用户态/目态
内核是操作系统最重要最核心的部分,由很多内核程序组成,作为可信软件来提供支持进程并发执行的基本功能和基本操作的一组程序模块,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
内核必须实现的功能:中断处理,短程调度,原语管理(协调进程通信,并发执行,资源共享)
内核的作用:
(1)资源抽象:抽象硬件,方便用户程序使用
(2)资源分配:将硬件资源合理分配给用户程序
(3)资源共享:提供资源共享的同步、互斥机制
内核态到用户态:一条修改PSW的特权指令,主动让出CPU
用户态到内核态:由中断引起,硬件自动完成
CPU中有寄存器:程序状态字寄存器(PSW),1表示内核态、0表示用户态
(1)开机时:CPU为内核态;
(2)开机完成后,用户可启动某个应用程序;
(3)操作系统内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行
(4)应用程序运行在用户态
(5)而此时应用程序被植入一条特权指令,企图破坏系统
(6)CPU发现接下来要执行的这条指令是特权指令,但本身又处于用户态
(7)这个非法时间会引发一个中断信号
(8)中断使得操作系统再次夺回对CPU的控制权
(9)操作系统会对引发终端的时间进行处理,处理完后再把CPU使用权交给别的应用程序。
中断和异常
中断是让操作系统内核夺回CPU使用权的唯一途径。是指程序执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程。
为什么要中断:请求系统服务—系统调用,实现并发工作,处理突发事件,满足实时要求
中断/异常响应的步骤:发现中断源\(\to\)保护现场\(\to\)转向处理中断/异常事件的处理程序\(\to\)恢复现场
异常处理流程:当异常产生后,自动转向异常处理程序公共入口执行,执行下列操作:
(1) 将硬件错误码和异常向量号存入当前进程PCB中;
(2) 判别异常产生于核心态还是用户态,对于前者,将简单地转向内核预定义服务程序处理,没有被处理的核心态异常是操作系统的致命错误;
(3) 对于用户态异常,终止当前进程运行,并给当前进程发信号;
(4) 从ret_from_exception处返回用户空间时,检查进程是否有信号等待处理,如果有则根据信号类型调用相应函数进行处理。
内中断:中断信号来源于CPU内部,与当前执行的指令有关。(特权指令、非法指令、故障(可能被内核程序修复)、终止(内核程序无法修复,将会直接终止该应用程序)等),优势应用程序想请求操作系统内核的服务,此时会执行陷入指令,系统调用即通过此指令完成。
外中断:中断信号来源于CPU外部,与当前执行的指令无关。
在每个指令周期末尾例行检查。
时钟中断——由时钟部件发送,每隔一个时间片给CPU发送一个时钟中断信号实现进程并发运行。
I/O中断:由输入输出设备发来的中断信号
中断优先级和多重中断
中断优先级:按中断的紧迫程度分类
以不发生中断丢失为前提,优先响应优先级高的中断
高优先级中断可以中断低优先级中断的处理程序
处理高优先级中断时,屏蔽低优先级中断
中断屏蔽——屏蔽中断码(0:禁止响应;1:响应中断)
中断机制的基本原理
不同的中断信号需要不同的中断处理程序来处理,CPU将会根据中断信号的类型去查询”中断向量表“。
系统调用
系统调用是操作系统提供给应用程序使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。
与库函数的区别:有的库函数是对系统调用的进一步封装、有的则没有使用系统调用。
由于系统的并发性,由操作系统对共享资源进行统一的管理,并向上提供系统调用,用户进程想要使用打印机这种共享资源,只能通过系统调用想操作系统内核发出请求。内核会对各个请求进行协调处理。
系统调用包括:
(1)设备管理:完成设备的请求/释放/启动等功能
(2)文件管理:完成文件的读/写/创建/删除等功能
(3)进程控制:完成进程的创建/撤销/阻塞/唤醒等功能
(4)进程通信:完成进程之间的消息传递/信号传递等功能
(5)内存管理:完成内存的分配/回收等功能
凡是与共享资源有关的操作,都必须通过系统调用的方式想操作系统内核提出服务请求。
系统调用的过程
(1)传递系统调用参数(直接参数,简介参数)(如部分参数指明系统调用类型)
(2)执行陷入指令(用户态)
(3)执行相应的内核程序处理系统调用请求(核心态)
(4)返回应用程序
操作系统体系结构
原语是一种特殊的程序,具有原子性,这段程序的运行不可被中断。运行时间较短,调用频繁。
大内核(单内核):进程管理、存储管理、设备管理等均在内核中,高性能、但内核代码庞大,结构混乱、高度耦合、难以维护。
小内核(微内核):上述均被划出,功能少、结构清晰、方便维护,但需频繁在核心态与用户态之间切换,性能低
注意:时钟管理、中断管理、原语均在两种内核中。
分层结构:操作系统被分为多层,最底层是硬件,最高层是用户接口,每层只能调用更低一层的接口,调试方便,但难以合理定义各层的边界、效率低。
模块化:将内核划分为多个模块。其中内核由主模块(只负责核心功能)和可加载内核模块构成。模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发;支持动态加载新的内核模块;任何模块都可以直接调用其他模块,效率高。但模块之间的定义不一定合理使用,模块之间相互依赖,难以调试和验证。
外核:内核负责进程调度,进程通信等功能,外盒负责向用户进程直接分配未经抽象的硬件资源,并保证其使用安全。可以是用户进程更灵活地使用硬件资源,但降低了系统的一致性、使系统变得更复杂。
操作系统引导(开机过程)
(1)CPU从一个特定的主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
(2)将磁盘的第一块——主引导记录读入内存,执行磁盘引导程序,扫描分区表
(3)从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
(4)从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成”开机“的一系列动作