第一章:操作系统引论(可以不看或者最后看)
-
操作系统目标与作用
-
操作系统目标
- 方便性
- 有效性
- 可扩充性
- 开放性
-
操作系统的作用
- os是用户与计算机硬件系统之间的接口
- os是是计算机系统资源文件、处理机、存储器、i/o设备管理者
- os是实现计算机资源的抽象表现
-
操作系统的前进动力
- 不断的方便用户
- 不断提高资源利用率
- 硬件不断升级
- 计算机体系结构不断优化
- 不断应对新的要求
-
-
操作系统的发展过程
-
操作系统发展历史
-
第1代(1946-1955年):电子管时代
-
第2代(1955年-1965年):晶体管时代
-
第3代(1965-1970年):中小规模集成电路时代
-
第4代(1970年-至今):大规模和超大规模集成电路时代
-
-
未配置操作系统的计算机系统
- 人工操作方式
-
早期的操作方式是由程序员将事先已穿孔的纸带(或卡片),装入纸带输入机(或卡片输入机),再启动它们将纸带(或卡片)上的程序和数据输入计算机,然后启动计算机运行。仅当程序运行完毕并取走计算结果后,才允许下一个用户上机。
- 缺点:1. 用户独占系统 2. CPU 等待人工操作
-
- 脱机输入\输出方式
- 程序员将穿孔的纸带通过外围机将纸带上的数据输入到磁盘里,再从磁盘上把数据高速调入内存,输出的结果再通过外围机到相应的输出设备输出。
-
这样可以解决人机矛盾以及CPU与I/O设备速度不匹配的矛盾。
- 人工操作方式
-
单道批处理
- 单道批处理系统的处理过程
-
为实现对作业的连续处理,需要先把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序(Monitor),在它的控制下,使这批作业能一个接一个地连续处理。
- 目的:提高利用率和吞吐量
- 特点:1.单道性 2.顺序性 3.自动性
- 缺点:资源得不到充分利用
-
- 单道批处理系统的处理过程
-
多道批处理
- 多道程序设计的基本概念
-
在多道程序设计系统中,用户提交的作业先放在外存上,并排成一个队列,称为后备队列。
-
然后由作业调度程序按照一定的算法,从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中的各种资源。
-
- 特点:1.多道性 2.无序性 3.调度性
- 优点:1.资源利用率高 2.资源吞吐量大
- 缺点:1.平均周转时间长 2.无交互能力
- 多道批处理系统需要解决的问题
- 处理机争用问题
- 内存分配和保护问题
- I/o设备分配问题
- 文件的组织和管理问题
- 作业管理问题
- 用户与系统的接口问题
- 多道程序设计的基本概念
-
分时操作系统
- 分时系统的引入
- 对于用户开始有了要求(比如银行):人–机交互,共享主机,便于用户上机,一个终端,一群人通过不同的用户终端使用。
- 分时系统的关机问题
-
主机以很短的时间片为单位,把CPU轮流分配给每个终端使用;直到所有作业被运行完。若某个作业在分配给 它的时间片内未完成计算,则该作业暂停运行,把处理器让给其他作业使用,等待下一轮再继续使用。若终端数量不多 ,每个终端很快就能重新获得CPU,使得每个终端得到及时响应。
- 及时接收 配置多路卡和缓冲区
- 及时处理 作业直接进入内存和采用轮转运行方式。
-
- 分时系统的特征
-
多路性。 允许一台主机上联接多台终端,系统按分时原则为每个用户服务;
-
独立性。 每个用户各占一个终端,独立操作,互不干扰;
-
及时性。 用户的请求能在很短的时间内获得响应;
-
交互性。 用户可通过终端与系统进行广泛的人机对话。
-
-
缺点:
- 不能有效处理紧急任务操作系统对各个用户 / 作业都是完全公平的,循环地为每个用户 /作业服务一个时间片,不区分任务的紧急性
- 分时系统的引入
-
实时操作系统
-
所谓“实时”,是表示“及时”,而实时系统是指系统能及时(或即时)响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。
- 应用需求:1.实时控制 2.实时信息处理
- 实时系统的类型:1.工业(武器)控制系统 2.信息查询系统 3. 多媒体系统 4. 嵌入式系统
- 实时任务类型
-
周期性实时任务和非周期性实时任务
-
周期性实时任务:在实时操作系统中,周期性实时任务是指那些按照固定时间间隔重复执行的任务,通常用于定时监控和控制系统中对时间要求严格的功能。
-
非周期性实时任务:在实时操作系统中,非周期性实时任务是指那些在不确定的时间点由外部事件触发的任务,适用于处理突发事件或响应外部中断。
-
-
硬实时任务和软实时任务
- 硬实时系统:必须在绝对严格的规定时间内完成处理。
- 软实时系统:能接受偶尔违反时间规定。
-
- 实时系统的特征
- 多路性
- 独立性
- 及时性
- 交互性
- 可靠性(实时性系统比分时性系统高)
- 优点: 能够优先响应一些紧急任务,某些紧急任务不需时间片排队。
-
-
微机操作系统的发展
- 按照字长分
- 字:计算机处理数据的一个基本单位。一个字的大小由处理器的架构决定,通常由多个比特(bit)组成。
- 字长:是指一个字的比特数,通常表示处理器一次可以处理的最大数据长度。字长越大,处理器在一次操作中可以处理的数据量也越大。
- 常是8的倍数,8位,16位,32位,64位
- 按照用户方式分
-
单用户单任务操作系统(Single-User Single-Task Operating System)
- 仅支持单个用户一次运行一个任务。
- 适用于资源有限的设备,系统结构简单。
- cp/m,ms-dos
-
单用户多任务操作系统(Single-User Multi-Tasking Operating System)
- 支持单个用户同时运行多个任务。
- 提供后台任务处理,提升用户操作效率,适合桌面环境。
- 早期win
-
多用户多任务操作系统(Multi-User Multi-Tasking Operating System)
- 允许多个用户同时登录系统,并各自独立运行多个任务。
- 系统提供资源隔离,适合服务器和大型计算机环境。
- unix,linux
-
- 按照字长分
-
-
操作系统的基本特性
- 基本特性:并发,共享,虚拟,异步
- 详解
- 并发
- 并行与并发
- 并行:两个或多个事件在同一时刻发生
- 并发:两个或多个事件在同一时间间隔内发生(宏观),微观上是不可能同时间点同时发生。
-
并发是提高系统资源利用率,增加系统的吞吐量的主要手段单处理机并发执行和多处理机的并发/并行执行
-
进程
-
进程是操作系统中正在执行的一个程序的实例。它包含了程序的代码、所需的数据、执行时的状态以及资源(如内存、文件、I/O设备等)。一个程序在运行时可以启动一个或多个进程,每个进程独立调度和执行。
-
引入进程这一概念可实现并发执行
-
- 并行与并发
-
共享
-
资源共享也称为资源复用,是指系统中的资源可供内存中多个并发执行的进程共同使用。
-
分类
-
互斥共享方式
- 临界资源:一段时间内只允许一个进程访问的资源。
- 例如:打印机,系统表格
- 同时访问方式
-
系统中还有另一类资源,允许在一段时间内由多个进程“同时”对它们进行访问。这里所谓的“同时”,在单处理机环境下是宏观意义上的,而在微观上,这些进程对该资源的访问是交替进行的。
-
例如:共享代码,共享库等
-
-
-
虚拟
-
在os中,通过某种技术将一个物理实体变为若干个逻辑上的对应物的功能称为虚拟。
-
分类
- 时分复用:虚拟处理机(多道程序)技术、虚拟设备技术
- 空分复用:多道程序共享内存,多文件共享磁盘, 用以提高存储空间的利用率
-
- 异步
-
在多道程序环境下,系统允许多个进程并发执行。在单处理机环境下,由于系统中只有一台处理机,因而每次只允许一个进程执行,其余进程只能等待。
可见,由于资源等因素的限制,使进程的执行通常都不可能“一气呵成”,而是以"停停走走”的方式运行。
-
-
- 并发
-
操作系统的主要功能
- 处理机(进程)管理功能
- 主要功能:创建和撤销进程,对进程的运行进行协调,实现进程之间的信息交换,以及按照一定算法把处理机分配给进程。
- 进程控制;进程同步;进程通信;调度;
- 存储管理功能
- 主要任务:是位多道程序的运行提供良好环境,提高存储器的利用率,方便用户使用,并可以在逻辑上扩展内存。
- 内存分配;内存保护;地址映射;内存扩充;
- 设备管理功能
- 主要任务:完成用户进程提出的i/o请求,位用户提供相应的设备,并完成指定的i/o操作,提高CPU与i/o设备利用率,提高i/o速度,方便用户使用i/o设备。
- 缓冲管理;设备分配;设备处理
- 文件管理功能
- 主要任务:对用户文件与系统文件进行管理,方便用户使用的同时保证文件的安全性。
- 目录管理;文件的读写管理与保护;文件存储空间管理
- 操作系统与用户的接口
- 用户接口
-
联机用户接口;脱机用户接口;图形用户接口
-
- 程序接口
-
程序接口是为用户程序在执行中访问系统资源而设置的,是用户程序取得操作系统服务的唯一途径。
-
- 用户接口
-
现代操作系统的新功能
-
系统安全
- 认证技术
- 密码技术
- 访问控制技术
- 反病毒技术
-
网络的功能和服务
- 网络通信
- 资源管理
- 应用互操作
-
支持多媒体
- 接纳控制功能。
- 实时调度。
- 多媒体文件的存储
-
- 处理机(进程)管理功能
-
os结构设计
-
传统结构操作系统
-
介绍: 传统结构操作系统通常采用单体内核设计,将所有操作系统功能集成在一个内核中。这种设计在早期计算机中非常普遍,系统的所有服务和管理功能都在一个单一的内核中实现,具有高效的性能但也存在复杂性和维护困难的问题。
- MS-DOS:早期的单体内核操作系统,只支持单用户单任务,功能简单但运行效率高。
- UNIX(早期版本):经典的单体结构,所有系统功能集中在内核中,功能全面但系统复杂。
-
-
现代结构操作系统
-
介绍: 现代结构操作系统采用了更先进的设计理念,如模块化和微内核设计。它们的目标是提高系统的灵活性、可维护性和扩展性,同时支持更多的功能和服务。
- Linux(现代版本):采用模块化设计,支持动态加载和卸载模块,提升了系统的灵活性和扩展性。
- Windows 10/11:现代化的操作系统,结合了模块化设计、多任务处理和虚拟化技术,提供丰富的功能和良好的用户体验。
- macOS:结合了微内核和模块化设计,提供稳定的系统环境和优良的用户体验,适用于个人计算和创作工作。
-
-
无结构操作系统
-
介绍: 无结构操作系统通常指那些没有明确层次或模块化设计的操作系统,这种设计通常较为早期或实验性,可能存在结构混乱和维护困难的问题。
- 早期实验性操作系统:一些早期的操作系统没有明确的结构设计,通常用于学术研究或实验目的,系统功能和服务可能没有清晰的划分。
-
-
模块化结构操作系统
-
介绍: 模块化结构操作系统将系统功能分解为多个独立的模块,每个模块负责特定的功能。模块可以在运行时动态加载或卸载,提供了灵活的系统扩展和维护方式。
- Linux:内核支持模块化设计,能够动态加载和卸载模块,支持各种设备驱动和文件系统。
- Solaris:采用可插拔的内核模块设计,允许功能扩展和管理,适用于企业级服务器环境。
-
-
分层次结构操作系统
-
介绍: 分层次结构操作系统将系统功能划分为多个层次,每一层提供特定的服务,并依赖于下层提供的功能。这种设计使得系统结构清晰,易于维护和扩展。
- THE操作系统:由Edsger Dijkstra设计,将操作系统划分为多个层次,每层功能明确,设计清晰。
- Windows NT:采用分层设计,系统服务和用户界面被划分为不同层次,提高了系统的可扩展性和管理性。
-
- 微内核OS结构
- 内核架构划分
-
微内核
-
定义: 微内核设计将操作系统内核的功能最小化,只保留最基本的系统服务,如进程管理、基本的内存管理和低级别的硬件接口。其他功能,如文件系统、网络协议和设备驱动程序,通常运行在用户空间的服务器中。
-
特点:
- 最小内核功能: 内核仅包含最基本的功能,其他服务由用户空间的服务器提供。
- 高可维护性: 内核较小,易于维护和扩展,修改或更新某一功能不影响整个系统。
- 高安全性: 服务分离降低了系统出错的风险,单个服务的崩溃不会影响整个系统。
- 性能开销: 内核与用户空间的通信需要通过消息传递机制,可能导致性能开销较大。
-
示例:
- Minix:早期的微内核操作系统,用于教育和研究。
- QNX:一个商用微内核操作系统,广泛应用于嵌入式系统和实时系统。
- Mach:一个实验性的微内核,曾被用于NeXTSTEP和部分现代操作系统。
-
-
宏内核
-
定义: 宏内核设计将操作系统的所有核心功能集成在一个单一的内核中。这包括进程管理、内存管理、文件系统、设备驱动程序和网络协议等。
-
特点:
- 集成的功能: 内核包括所有核心服务,功能全面。
- 高效性: 内核内部的服务可以直接调用,减少了通信开销,通常性能较好。
- 复杂性: 内核较大,功能复杂,出错的可能性高,修改和维护较为困难。
- 扩展性差: 增加新功能或修改现有功能可能需要重新编译整个内核。
-
示例:
- Linux(传统版本):虽然现代Linux支持模块化,但其内核结构依然是宏内核设计。
- Unix(早期版本):经典的宏内核设计,所有核心功能集成在一个内核中。
- Windows NT:尽管Windows NT采用了分层次设计,但其核心功能集成在宏内核中。
-
- 总结:
- 宏内核:所有核心功能集成在一个内核中,提供高效性能但维护和扩展较为复杂。
- 微内核:将内核功能最小化,其他功能在用户空间提供,具有高可维护性和安全性,但可能存在性能开销。
-
- 微内核os基本概念
-
总够小的内核
-
基于客户\服务器模式
-
应用“机制与策略分离”原理
-
采用面向对象技术
-
-
微内核基本功能
-
现在一般都采用“机制与策略分离”的原理,将机制部分以及与硬件紧密相关的部分放入微内核中。
-
进程(线程)管理
-
低级存储器管理
-
中断和陷入处理
-
-
微内核优点与缺点
-
优点
-
微内核OS结构建立在模块化、层次化结构的基础上的并采用了客户/服务器模式和面向对象的程序设计技术。
-
提高了系统的可扩展性
-
增强了系统的可靠性
-
可移植性强
-
提供了对分布式系统的支持
-
融入了面向对象技术
-
-
缺点
-
较之早期的操作系统,微内核操作系统的运行效率有所降低。
-
原因:在完成一次客户对OS提出的服务请求时,需要利用消息实现多次交互和进行用户/内核模式与上下文的多次切换。
-
-
- 内核架构划分
-
第二章:进程的描述与控制
-
进程的分类
- 按照使用资源的权限:系统进程,用户进程
- 按照对CPU的依赖性:偏CPU进程,偏I/O进程
-
前趋图和程序执行
-
前趋图
-
定义: 前趋图是一种有向无环图(DAG),用于表示多个任务或操作之间的依赖关系。图中的每个节点表示一个任务,边表示任务之间的前趋关系,即一个任务必须在另一个任务之前完成。
-
前趋图两要素:结点,有向边(不要忘了,前趋图不接受循环的爱)
-
结点:表示一个进程或一个程序段,乃至一条语句
-
有向边:两结点间的前趋关系
-
前趋图可以这样描述:
P
={P1,P2,P3,P4,P5,P6,P7,P8,P9}
={(P1,P2),(P1,P3),(P1,P4),(P2,P5),(P3,P5),(P4,P6),(P4,P7),(P5,P8),(P6,P8),(P7,P9),(P8,P9)}
或者:
P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9
前趋图中不允许有循环
-
-
特点:
-
任务依赖:通过图中边的方向性,可以清晰地表示任务执行的顺序和依赖关系。
- 任务调度:前趋图常用于任务调度中,帮助确定任务的执行顺序以避免冲突。
- 并行性分析:通过分析前趋图,可以识别哪些任务可以并行执行,哪些必须顺序执行。
-
-
应用:
- 编译器设计:用于优化代码执行顺序。
- 并行计算:用于分析并行任务之间的依赖关系。
-
-
程序的顺序执行
- 定义: 按照某种先后次序顺序执行,仅当前一进程段执行完后,才运行后一程序段。
- 顺序执行的程序举例:
- 程序I: 输入程序:用于输入用户的程序和数据
- 程序C:计算程序:对所输入的而数据进行计算
- 程序P:打印程序:打印计算结果。
- 顺序执行前趋图:
- 特征
-
顺序性:处理机严格地按照程序所规定的顺序执行
-
封闭性:程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它,程序一旦开始执行,其结果不受外界影响。
-
可再现性:只要程序执行时的环境和初始状态相同,当程序重复执行时,不论它时从头到尾不停顿地执行、还是“停停走走”地执行,都能获得相同的结果。
-
- 定义: 按照某种先后次序顺序执行,仅当前一进程段执行完后,才运行后一程序段。
-
程序的并发执行
- 为什么要并发执行 程序顺序执行虽然带来方便,但系统资源的利用率却很低。为此,应该让程序或程序段能够并发执行。
- 程序并发执行的必要条件:不存在前趋关系的程序
- 程序并发执行例子:
-
Pi−1和Cii和Ii+1之间不存在前趋关系,可以并发执行。
-
特征:
- 间断性
- 失去封闭性
- 不可再现性
-
-
进程的描述
-
进程的定义和特征
-
进程的定义: 进程又叫进程实体,由程序段、数据段和PCB三部分构成。
-
典型的进程定义有
-
进程是程序的依次执行
-
进程是一个程序极其数据在处理机上顺序执行时发生的活动。
-
进程是具有独立功能的程序在一个数据集合上运行的过程。它是系统进行资源分配和调度的一个独立单位。
-
-
进程的特征:
-
动态性。进程实质是进程实体的执行过程
-
并发性。多个进程实体同存于内存中,且能在一段时间内同时运行。
-
独立性。传统的OS中,进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位
-
-
进程与程序
-
定义:
- 程序:静态的代码和指令集合,存储在磁盘上。
- 进程:程序的执行实例,动态运行在内存中。
-
静态与动态:
- 程序:静态存在,不具备执行能力。
- 进程:动态实体,反映程序的执行状态。
-
资源与执行:
- 程序:不直接占用资源,直到被执行。
- 进程:占用计算资源,如CPU、内存等,由操作系统管理。
-
多个实例:
- 程序:同一个程序可以多次执行。
- 进程:每次执行生成一个独立的进程实例。
-
生命周期:
- 程序:无生命周期,只是文件。
- 进程:有生命周期(创建、执行、等待、终止)。
-
-
进程控制块(PCB)【nest?哈哈哈,嵌入式,纯属我自己的笑点】:
- 定义:PCB是操作系统用来管理进程的一个数据结构。
- 作用:存储进程的状态信息,包括进程ID、寄存器状态、内存分配、I/O状态等,用于调度和管理进程的执行。
- 假设有一个处理机在处理一个程序代码,这个执行实体被称为进程。进程基本元素由程序代码和数据集,以及用来描述和控制进程的数据结构PCB。进程的任意时刻都可以用如下元素来表征。
-
标识符:与进程相关的唯一表示符,用来区分其他进程。
-
状态:若进程正在执行,则进程处于运行态。
-
优先级:相对于其他进程的优先顺序。
-
程序计数器:程序中即将执行的下一条指令的地址。
-
内存指针:包括程序代码和进程相关数据的指针,以及与其他进程共享内存块的指针。
-
上下文数据:进程执行时处理器的寄存器中的数据。
-
I/O状态信息:包括显示I/O请求,分配给进程的I/O设备(如磁带驱动器)和被进程使用的文件列表等。
-
记账信息:包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。
-
-
-
进程的基本状态及其转换(▽)
- 进程的三种基本状态
-
就绪(Ready)状态。(等待CPU)
-
执行(Running)状态。(执行进程)
-
阻塞(Block)状态。(除了CPU还缺少一些东西
一般是I\0
) -
基本状态的转换
-
-
创建与终止状态
-
创建状态(Creation State)
- 概念:当一个新进程被创建时,它处于创建状态。
- 步骤:
- 操作系统为新进程分配资源(如内存、PCB)。
- 初始化进程控制块(PCB),记录进程的基本信息。
- 将新进程放入就绪队列,等待调度执行。
-
终止状态(Termination State)
- 概念:当一个进程完成执行或被终止时,它进入终止状态。
- 步骤:
- 操作系统回收该进程的资源(如内存、文件描述符)。
- 清除或重用进程控制块(PCB)。
- 记录终止状态,并通知相关进程(如父进程)。
- 进程的五种基本状态及转换
-
- 进程的三种基本状态
-
挂起操作和进程状态的转换
-
挂起操作(Suspension Operation)
- 定义:挂起操作是将一个进程暂时停止执行,并将其状态保存到磁盘中,而不是内存中。
- 目的:释放内存资源,以便其他进程使用。
- 类型:
- 主动挂起:进程或用户请求,例如暂停程序。
- 被动挂起:操作系统为优化资源而自动挂起进程。
-
进程状态转换:——》进程在以下状态之间进行转换
-
新建(New) → 就绪(Ready):
- 进程被创建,等待CPU调度。
-
就绪(Ready) ↔ 运行(Running):
- 就绪:进程等待执行。
- 运行:进程正在执行。
- 时间片用尽或被中断时,回到就绪。
-
运行(Running) → 等待(Waiting/Blocked):
- 进程等待某事件(如I/O操作)完成。
-
挂起状态:
- 挂起就绪(Suspended Ready):就绪状态的进程被挂起。
- 挂起等待(Suspended Waiting):等待状态的进程被挂起。
-
恢复:
- 挂起就绪 → 就绪:系统资源可用时恢复执行。
- 挂起等待 → 等待:事件完成后恢复。
-
终止(Terminated):
- 进程执行结束,不再进行状态转换。
-
-
-
进程管理的数据结构(pcb内的东西)
-
进程标识信息
-
进程ID(PID):用于唯一标识进程的一个数字标识符,每个进程在系统中都有一个唯一的PID。
-
父进程ID(PPID):指向该进程的父进程的PID,帮助操作系统管理进程的层次结构。
-
用户ID(UID):创建或拥有该进程的用户的ID。
-
-
处理器状态信息
- 程序计数器(Program Counter):保存进程即将执行的下一条指令的内存地址,当进程暂停或恢复时,操作系统通过该计数器继续执行。
- CPU寄存器:保存进程在执行期间使用的CPU寄存器内容,如通用寄存器、堆栈指针、指令寄存器等,这些信息确保进程可以从中断点继续执行。
- 程序状态字(PSW):保存与当前进程相关的条件码和控制信息。
-
进程调度信息
- 进程状态(Process State):表示进程当前所处的状态,例如新建、就绪、运行、等待、挂起或终止。
- 优先级(Priority):一个数值,用于确定进程相对于其他进程的调度优先级,高优先级的进程更容易获得CPU时间片。
- 调度队列指针:指向进程在调度队列中的位置,用于将进程插入或移出调度队列。
-
内存管理信息
- 基址寄存器和界限寄存器:用于指示进程在内存中的物理地址范围,确保进程只能访问其自身的内存区域。
- 页表(Page Table):用于分页管理,记录虚拟内存页与物理内存帧的映射关系。
- 段表(Segment Table):用于分段管理,记录进程的各个段在内存中的位置和大小。
-
资源分配信息
- 打开的文件列表:记录进程当前打开的文件及其对应的文件描述符,管理进程与文件系统的交互。
- I/O状态信息:包括进程等待的I/O操作、已完成的I/O请求,以及与设备驱动程序的交互信息。
- 进程资源使用限制:记录进程被允许使用的资源上限,如最大内存使用量、最大打开文件数等。
-
进程间通信信息
- 信号处理信息:记录进程可以接收的信号类型及其处理程序的地址,用于进程间的异步通信。
- 消息队列:用于进程间消息传递的队列,保存进程发送或接收的消息。
- 管道(Pipe):记录进程间通过管道进行数据流通信的相关信息。
-
进程会计信息
- CPU时间:记录进程在用户模式和内核模式下已使用的CPU时间,用于统计和调度。
- 记账信息:记录与进程相关的系统资源使用情况,如内存使用量、I/O操作次数、页面交换次数等,通常用于系统性能分析和用户计费。
-
-
-
进程控制
-
简述:
进程控制是进程管理中最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程置于阻塞状态、负责进程运行中的状态转换等功能。
进程控制通常是由操作系统内核中的原语来实现的。原语是操作系统提供的基本操作或服务,它们直接在内核模式下执行,用于实现复杂的操作系统功能。 -
操作系统内核
-
处理机的执行状态
- 系统态(管态、内核态):系统管理程序执行时的状态。具有较高的特权,能执行一切指令,访问所有寄存器和存储器
- 用户态(目态):以后程序执行时的状态。具有较低的特权,只能执行规定指令,访问指定的寄存器和存储器。
- 操作系统内核功能
- 支撑功能
- 中断处理
-
定义:中断处理是操作系统对硬件或软件中断信号的响应机制。中断信号通知操作系统有重要事件发生,需要立即处理。
-
功能:
- 中断请求(IRQ):硬件设备发出的信号,通知操作系统有待处理的事件。
- 中断服务例程(ISR):操作系统内核中的函数,专门处理特定中断。
- 上下文切换:在处理中断时,操作系统保存当前进程的状态,将其恢复到中断处理完成后。
-
步骤:
- 中断发生:硬件或软件发出中断信号。
- 中断响应:CPU暂停当前任务,保存上下文,转入中断处理程序。
- 中断处理:执行中断服务例程,处理事件。
- 恢复执行:恢复被中断的任务,继续原来的操作。
-
- 时钟管理
-
定义:时钟管理涉及操作系统对系统时钟的控制和使用,以实现时间相关的任务调度和管理。
-
功能:
- 时间片分配:为每个进程分配CPU时间片,实现多任务并发。
- 定时器:使用硬件定时器生成时钟中断,以调度任务和执行延时操作。
- 系统时间维护:跟踪系统时间,为进程提供时间信息,用于调度和超时操作。
-
步骤:
- 时钟中断:硬件定时器产生定期中断。
- 调度决策:操作系统根据时间片和优先级决定下一步调度任务。
- 时间维护:更新系统时钟,提供准确的时间信息给进程。
-
- 原语操作
-
定义:原语操作是操作系统内核提供的基本操作单元,用于实现更复杂的功能,如进程管理、同步和通信。
-
功能:
- 进程控制:如进程创建、终止、挂起和恢复。
- 同步原语:如信号量、互斥锁、条件变量,用于进程间的同步和互斥控制。
- 进程通信:如管道、消息队列、共享内存,用于进程间的数据交换。
-
步骤:
- 系统调用:进程通过系统调用请求原语操作。
- 内核执行:内核执行相应的操作,如修改进程状态、更新同步结构。
- 返回结果:操作完成后,内核返回操作结果或状态信息给用户进程。
- 总结:
- 中断处理:通过响应中断信号和执行中断服务例程,确保系统对事件的及时响应。
- 时钟管理:利用时钟中断和定时器进行时间片分配和系统时间维护,以支持多任务调度和延时操作。
- 原语操作:通过基本的操作原语来管理进程、实现同步和进程间通信,确保操作系统的基本功能得以实现。
-
- 中断处理
- 支撑功能
-
-
-
进程同步
-
进程同步:如果不能采取有效的措施,对多个进程的运行进行妥善的管理,必然会因为这些进程对系统资源的无序争夺给系统造成混乱。致使每次处理的结果存在着不确定性,即显现出其不可再现性。
-
进程同步的基本概念
- 引入
-
进程同步是一个OS级别的概念,是在多道程序的环境下,进程间存在着不同的制约关系。
-
为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步。
-
-
主要任务
-
是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好的互相合作,从而使程序的执行具有可再现性。
-
-
两种形式的制约关系
-
间接相互制约关系:互斥问题
- 定义:确保在任何时刻只有一个进程或线程能访问共享资源,避免冲突。
- 例子:多个进程同时尝试写入一个文件,使用互斥锁(mutex)来确保一次只有一个进程能写入。
-
直接相互制约关系:同步问题
- 定义:确保进程或线程按特定条件顺序执行,协调它们的操作。
- 例子:生产者-消费者问题,消费者只能在生产者放入数据后才能消费,使用条件变量(condition variable)来实现这种同步。
- 总结
- 间接相互制约关系解决对共享资源的独占访问问题。临界资源
- 直接相互制约关系确保进程按照条件或顺序正确执行。
-
- 临界区
- 临界区是指在进程或线程执行过程中,需要对共享资源进行访问的那段代码区域。为了避免多个进程或线程同时访问共享资源而导致数据不一致或资源冲突,必须确保在任何时刻只有一个进程或线程能够执行临界区内的代码。这就是临界区管理的核心任务。
-
定义:
- 临界区是程序中对共享资源进行访问的部分,确保同一时刻只有一个进程或线程可以进入和执行这一部分代码。
-
目标:
- 互斥:确保只有一个进程或线程能够在任何给定时刻进入临界区,防止同时访问共享资源。
- 数据一致性:防止因并发访问造成数据损坏或不一致。
-
实现机制:
- 互斥锁(Mutex):用于控制对临界区的访问。进程或线程在进入临界区之前必须获取互斥锁,离开临界区后释放锁。
- 信号量(Semaphore):二值信号量(Binary Semaphore)也可以用于实现临界区的互斥访问。
- 自旋锁(Spinlock):一个轻量级的锁机制,适用于短时间内的临界区保护,进程或线程在等待锁时会不断循环检查锁的状态。
- 临界区管理的常见策略
- 进入临界区前获取锁:进程或线程在进入临界区之前获取互斥锁,确保没有其他进程或线程进入临界区。
- 离开临界区后释放锁:进程或线程在退出临界区后释放互斥锁,允许其他进程或线程访问临界区。
- 避免长时间持有锁:尽量减少在临界区内的代码量,以减少锁持有的时间,提高系统并发性能。
- 引入
-
硬件同步机制
- 什么是硬件同步机制
- 硬件同步机制是指在计算机系统中,为了协调多个硬件设备或处理器之间的操作,确保它们能够正确地协同工作而采用的一系列技术和方法。同步机制的主要目标是避免数据竞争、死锁等问题,确保系统的可靠性和效率。
- 常见的一些机制
-
锁(Lock): 锁是最基本的同步机制,用于确保一个资源在同一时间只能被一个设备或处理器访问。例如,在多处理器系统中,锁可以防止多个处理器同时修改共享数据,从而避免数据不一致的问题。
-
屏障(Barrier): 屏障是一种同步点,所有参与的设备或处理器必须在此点等待,直到所有设备都到达屏障后才能继续执行。这种机制通常用于并行计算,以确保所有任务在某个阶段完成之前,不会进入下一阶段。
-
中断(Interrupt): 中断是一种硬件信号,通知处理器或设备某个事件已经发生,通常用于在外部设备(如输入设备)和处理器之间进行同步。中断可以使处理器暂停当前操作,处理紧急任务,然后恢复之前的操作。
-
总线仲裁(Bus Arbitration): 在计算机系统中,多个设备可能需要访问同一总线。总线仲裁机制用于决定哪个设备在某一时刻可以控制总线,从而避免总线冲突。
-
缓存一致性协议(Cache Coherence Protocol): 在多处理器系统中,每个处理器都有自己的缓存。缓存一致性协议确保多个缓存中相同数据的副本保持一致,避免不同处理器读取到不同版本的数据。
-
自旋锁(Spinlock): 自旋锁是一种忙等待的锁机制,处理器在获取锁之前会不断轮询锁的状态。虽然这种机制可能会浪费处理器资源,但在锁等待时间非常短的情况下,可能比休眠和唤醒更高效。
-
信号量(Semaphore): 信号量是计数器,用于控制多个设备或处理器对有限资源的访问。信号量可以用来实现更复杂的同步机制,如限制同时访问某个资源的设备数量。
-
- 什么是硬件同步机制
-
信号量
-
信号量的类型
-
二进制信号量(Binary Semaphore):
- 也称为互斥量(Mutex),其值只有0和1。
- 主要用于管理对单个资源的独占访问,确保同一时间只有一个进程或线程能够访问该资源。
- 如果一个进程试图在信号量为0时访问资源,它必须等待,直到信号量恢复为1。
-
计数信号量(Counting Semaphore):
- 可以表示一个大于1的非负整数值。
- 用于控制对有限数量资源(例如多个相同类型的资源,如线程池或数据库连接)的访问。
- 计数值表示剩余可用资源的数量。每当一个进程获取资源时,计数器减一;释放资源时,计数器加一。
-
信号量的操作
信号量通常支持两种基本操作:
-
P操作(Proberen,试图减少):
- 该操作会尝试将信号量的值减一。
- 如果信号量的当前值大于0,则减一后继续执行。
- 如果信号量的当前值为0,则进程或线程进入等待状态,直到信号量值大于0。
- 在不同的编程语言中,这个操作通常被称为
wait
、down
或decrement
。
-
V操作(Verhogen,增加):
- 该操作将信号量的值加一。
- 如果有进程或线程在等待信号量,它们将被唤醒以获取资源。
- 这个操作通常被称为
signal
、up
或increment
。
-
信号量的应用
信号量在操作系统中有广泛应用,尤其是在以下场景中:
-
进程同步:
- 信号量可以确保多个进程按照特定的顺序执行。例如,在生产者-消费者问题中,信号量可以确保生产者不会在缓冲区已满时继续生产,而消费者则不会在缓冲区为空时消费。
-
访问控制:
- 信号量可以限制多个进程或线程同时访问共享资源的数量,防止资源过度使用或竞争。例如,限制同一时间只有固定数量的线程访问数据库连接池。
-
死锁预防:
- 信号量通过严格的资源获取和释放顺序,可以防止死锁的发生,确保系统能够安全运行。
-
信号量的优点与局限性
-
优点:
- 简单易用:信号量的概念比较简单,容易在多种场景下应用。
- 强大:能够处理各种同步和互斥问题。
- 局限性:
- 忙等待:某些信号量实现可能导致进程或线程在等待资源时持续占用CPU资源(类似自旋锁),这在某些情况下可能不够高效。
- 死锁风险:如果使用不当,信号量可能导致死锁,例如进程A和进程B互相等待对方持有的信号量。
-
-
-
-
-
经典进程的同步问题(暂时跳过)
-
进程通信
-
进程通信类型
- 共享储存器
- 共享存储系统中,相互通信的进程,共享相同数据结构或者存储区域
- 进程通过共享存储空间进行通信
- 分类
- 基于共享数据结构:比如读写时的共享缓冲区,os只提供共享存储区,程序员负责同步实现。
- 基于共享储存区:先申请,再附加,后使用,最后归还
- 管道通信系统
- 管道是指用于连接一个读进程和一个写进程的一个共享文件,又叫pipe文
- 首创于UNIX
- 读写数据以字符流形式通过管道从写进程送给读进程
- 能力
- 互斥
- 同步
- 确定对方是否存在,只有确定对方已存在时才通信
- 消息传递系统
- 以格式化的消息为单位,将数据封装在消息中,利用OS提供的一组通信命令/原语(send,receive)实现数据交换
- 隐藏通信细节,属于高级通讯方式
- 计算机广泛用于,如微内核-服务器。也适用于多处理机,分布式系统,计算机网络领域
- 类型
- 直接消息传递:直接发给对方
- 间接消息传递:通过中间实体(邮箱)完成收发
- 客户-服务器系统
- 计算机网络领域普遍存在的系统类型(目前也是占比最多的)
- 分类
- 套接字(socket)
- 起源于20世纪70年代UNIX
- 是UNIX操作系统下的网络通信
- 最初被设计在一个主机上面多个应用程序之间的通信
- 套接字是目前最流行的网络通信接口,专门为C/S模型设计
- 套接字是用于通信的数据结构,包含目的地址,端口号,传输协议,进程所在网络地址等
- 多个系统调用:listen,bind,connect,accept,read,write,close
- 远程过程调用(RPC)
- 本地和主机上都需要运行网络守护进程,负责网络消息传递
- 该协议允许一台计主机(本地)系统上的进程调用另外一台主机(远程)系统上的进程,和普通过程调用类似
- 远程过程(函数)调用RPC,是一个通信协议,用于通过网络连接系统
- 原创方法调用(RMC)
- 套接字(socket)
- 共享储存器
-
消息传递通信实现方式
- 直接消息传递系统
- 分类
- 对此寻址方式(1v1)
- 非对称寻址方式(1v多)
- 消息格式
- 所传递的消息,必须具有一定的消息格式
- 单机环境中,由于发送和接收进程处于同一机器中,有着相同环境,所以消息格式简单,可采用比较短的定长消息格式,以减少对消息的处理和存储开销。
- 定长格式对于需要发送较长消息的用户是不方便的。为此,可采用变长的消息格式。 对于变长消息,系统无论再处理方面还是存储方面,都可能付出更多的开销,有点在于方便用户。
- 进程的同步方式
- 发送进程阻塞,接收进程阻塞;
- 发送进程不阻塞,接收进程阻塞;
- 发送进程和接收进程均不阻塞;
- 通信链路
- 发送进程和接收进程之间够进行通信,必须在两者之间建立一条通信链路
- 命令(原语)请求系统为之建立一条通信链路,在链路使用完后拆除链路。(网络)
- 利用系统提供的发送命令(原语),系统自动为之建立一条通信链路。(单机系统)
- 分类
- 信箱通信
- 信箱就是一种数据结构
- 信箱头+信箱=信箱
- 信箱的原语(提供为信箱通信提供了若干条原语)(原语(Primitive)是计算机系统中最基本的操作或指令,不能再分解或简化,通常用于构建更复杂的操作或机制。)
- 邮箱的创建和撤销
- 消息的发送和接收
- 邮箱(信箱)类型:要注意他们说会考,说不定有点重要
- 按照创建人不同
- 私用(进程结束邮箱消失)
- 公用(os创建进行指派)
- 共享
- 按照创建人不同
- 信箱就是一种数据结构
- 直接消息传递系统
- 直接消息传递系统实例(暂时不说)
-
-
线程(threads)的基本概念
- 为什么会有线程
- 在OS中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么在操作系统中再 引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
- 基本属性
- 进程是一个可拥有资源的独立单位
- 进程同时又是一个可独立调度和分派的基本单位
- 线程并发执行要付出的时空开销
- 创建进程,系统在创建一个进程时,必须为它分配其所必需的、除处理机以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB;
- 撤消进程,系统在撤消进程时,又必须先对其所占有的资源执行回收操作,然后再撤消PCB;
- 进程切换,对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中进程的CPU环境,因而须花费不少的处理机时间。
- 作为调度和分配的基本单位
- 为什么会有线程
-
线程的实现
-
内核级线程(Kernel-Level Threads)
- 实现方式: 线程由操作系统内核直接管理,每个线程在内核中都有一个线程控制块(TCB),用于记录线程的状态、寄存器内容、栈指针等信息。
- 调度: 内核负责调度所有线程,将它们映射到处理器核上执行。这种实现方式通常能够充分利用多核处理器的能力,适合高并发、高负载的应用。
- 优点: 内核级线程可以充分利用多处理器系统的优势,内核负责线程的调度和管理,支持真正的并行执行。
- 缺点: 由于每个线程的调度和管理需要内核介入,存在较高的开销,尤其是在频繁创建和销毁线程的情况下。
-
用户级线程(User-Level Threads)
- 实现方式: 线程由用户级库(如 POSIX 线程库 pthread)在用户空间实现和管理。线程的切换、同步等操作由用户级库负责,操作系统内核对此不可见。
- 调度: 线程调度由用户级库自行管理,多个用户级线程可能映射到同一个内核线程上执行。
- 优点: 用户级线程切换速度快,开销小,不需要内核介入,适合对实时性要求较高的应用。
- 缺点: 由于操作系统无法感知用户级线程的存在,线程阻塞可能导致整个进程阻塞,多核处理器的优势也无法充分发挥。
-
混合实现(Hybrid Threads)
- 实现方式: 这种方法结合了内核级线程和用户级线程的优点,将多个用户级线程映射到少量内核级线程上。常见的模型有“多对多”(M)模型,即多个用户级线程可以映射到多个内核级线程。
- 调度: 用户级线程的调度在用户空间进行,而内核级线程的调度由操作系统内核负责。
- 优点: 这种方法提供了更大的灵活性,既能利用多核处理器的优势,又保持了较低的线程管理开销。
- 缺点: 实现复杂,需要处理线程映射和调度的协调问题。
-
协程(Coroutines)
- 实现方式: 协程是一种特殊的用户级线程,线程的调度完全由用户代码控制。协程不像传统线程那样由操作系统调度,而是通过显式的切换操作(如
yield
)来控制执行顺序。 - 调度: 协程调度完全在用户级进行,通常由开发者编写代码来控制何时切换执行。
- 优点: 协程开销极低,适合 I/O 密集型和高并发的任务,避免了线程的上下文切换开销。
- 缺点: 协程不支持并行执行,不能充分利用多核处理器。
- 实现方式: 协程是一种特殊的用户级线程,线程的调度完全由用户代码控制。协程不像传统线程那样由操作系统调度,而是通过显式的切换操作(如
-
轻量级进程(Lightweight Process, LWP)
- 实现方式: 轻量级进程是一种内核级线程的实现形式,通常用于多线程环境中。操作系统将 LWP 作为调度的基本单位,而用户级线程库可以将用户级线程映射到这些 LWP 上。
- 调度: LWP 由操作系统调度,并将处理器时间分配给它们,而用户级线程由库管理,使用 LWP 进行实际执行。
- 优点: 结合了内核级线程的调度能力和用户级线程的管理灵活性。
- 缺点: 实现和管理较为复杂,可能增加系统开销。
- 再说一遍:
- 线程是操作系统能够独立执行的最小调度单位,通常在多线程编程中用于并发执行多个任务
-
第三章:处理机调度和死机
-
处理机调度层次和调度算法目标
- 层次
- 高级调度(作业调度):主要是根据某种算法,把外存上处于后备队列中的那些作业调入内存。
- 低级调度(进程调度):是保存处理机的现场信息,按某种算法先取进程,再把处理器分配给进程。
- 引入中级调度(内存调度):的主要目的是为了提高内存利用率和系统吞吐量。使那些暂时不能运行的进程不再占用内存资源,将它们调至外存等待,把进程状态改为就绪驻外存状态或挂起状态。
- 算法目标
- 处理机调度算法共同目标
- 资源利用率
- 公平性:每个进程获得合理的时间分配
- 平衡性:使CPU和各种外部设备都处于忙碌状态,调度算法保证系统资源的使用平衡性
- 策略强制执行:对所制定的策略,只要需要就予以执行,即使会造成某些工作的延迟也要执行
- 批处理系统的目标
-
最大化吞吐量
- 通过有效的调度,确保系统在单位时间内处理尽可能多的作业,提高整体的系统吞吐量。
-
最小化作业等待时间
- 调度算法应尽可能减少作业在作业队列中的等待时间,使作业能够尽早开始执行,提升用户的满意度。
-
最小化作业周转时间
- 周转时间是指作业从提交到完成所经历的总时间。调度算法应尽量减少作业的周转时间,尤其是对于高优先级或时间敏感的作业。
-
公平性
- 确保每个作业都能获得公平的处理机会,避免某些作业长时间得不到执行,防止出现“饥饿”现象(即某些作业被长期推迟执行)。
-
最大化资源利用率
- 通过合理调度,使得CPU、内存、I/O设备等系统资源得到充分利用,减少资源空闲时间,避免资源浪费。
-
考虑作业优先级
- 对于具有不同优先级的作业,调度算法应优先处理高优先级的作业,确保关键任务能够及时完成。
-
平衡负载
- 如果系统中有多个处理器或多核处理器,调度算法应尽可能平衡负载,避免某些处理器过载,而其他处理器闲置。
-
处理不同类型的作业
- 对于I/O密集型和CPU密集型作业,调度算法应能够有效区分,并分别优化它们的调度,以提高整体系统性能。
-
常见的批处理调度算法
-
先来先服务(First-Come, First-Served, FCFS):
- 简单易实现,作业按到达顺序执行,但可能导致长作业拖延短作业的执行。
-
短作业优先(Shortest Job Next, SJN):
- 优先执行估计运行时间最短的作业,减少平均周转时间,但可能导致长作业“饥饿”。
-
最短剩余时间优先(Shortest Remaining Time, SRT):
- 动态调度算法,实时调整,优先执行剩余时间最短的作业,适合处理变化的作业负载。
-
最高响应比优先(Highest Response Ratio Next, HRRN):
- 结合作业等待时间和服务时间,平衡短作业和长作业的调度,减少“饥饿”现象。
-
多级反馈队列(Multilevel Feedback Queue):
- 动态调整作业的优先级,使得不同性质的作业(如CPU密集型和I/O密集型)能够得到合理的调度。
-
-
- 分时操作系统
-
响应时间快
响应时间:是从用户通过键盘提交一个请求开始,直到屏幕上显示出处理结果为止 的一段时间间隔。
-
均衡性
均衡性:是指系统响应时间的快慢应与用户请求服务的复杂性相适应。
-
- 实时系统目标
- 截止时间保证
截止时间是指某任务必须开始执行的最迟时间,或必须完成的最迟时间。
HRT和SRT任务的调度方式、调度算法对其要求不一样。
-
可预测性
- 截止时间保证
- 处理机调度算法共同目标
- 层次
-
作业和作业调度
-
作业(Job)
-
定义:
- 作业是指用户提交给计算机系统进行处理的任务或一系列任务的集合。每个作业通常包含程序代码、所需的输入数据、输出要求,以及执行所需的资源信息(如CPU时间、内存、I/O设备等)。
-
特点:
- 独立性: 作业是一个独立的任务,不需要用户的干预即可完成。
- 批处理: 在批处理系统中,作业通常成批提交,系统在无人干预的情况下处理这些作业。
- 运行时间: 作业的运行时间可能各不相同,有的作业可能几秒钟内完成,而有的作业可能需要几小时甚至几天。
- 资源需求: 作业需要特定的系统资源,如处理器时间、内存、存储空间等,来完成其执行。
-
-
作业调度(Job Scheduling)
-
定义:
- 作业调度是指在计算机系统中,根据一定的规则和策略,决定哪个作业在什么时候、使用哪些资源进行执行的过程。作业调度的目的是优化系统性能,如提高吞吐量、减少作业等待时间、最大化资源利用率等。
-
类型:
- 长程调度(Long-Term Scheduling):
- 决定哪些作业从作业池中选择进入主存准备执行。通常用于控制系统的作业负荷,决定作业进入系统的频率。
- 短程调度(Short-Term Scheduling):
- 又称为处理器调度,决定哪些作业的进程可以获得CPU执行。这个调度频率较高,直接影响系统的响应时间和处理效率。
- 中程调度(Medium-Term Scheduling):
- 决定是否将某些作业从主存调出到外存(即交换),以便腾出内存空间给其他作业使用。中程调度通常用于多任务系统中的内存管理。
- 长程调度(Long-Term Scheduling):
-
-
-
进程调度
-
实时调度
-
死锁概述
-
预防死锁
-
避免死锁
-
死锁的检测与接触