- 操作系统教程
- 操作系统 - 首页
- 操作系统 - 需求
- 操作系统 - 概述
- 操作系统 - 历史
- 操作系统 - 组成部分
- 操作系统 - 结构
- 操作系统 - 架构
- 操作系统 - TAT & WAT
- 操作系统 - 类型
- 操作系统 - 服务
- 操作系统 - 属性
- 操作系统 - 进程
- 操作系统 - 进程调度
- 操作系统 - 调度算法
- 操作系统 - 多线程
- 操作系统 - 内存管理
- 操作系统 - 虚拟内存
- 操作系统 - I/O 硬件
- 操作系统 - I/O 软件
- 操作系统 - 文件系统
- 操作系统 - 安全性
- 操作系统 - Linux
- 操作系统 - 考试题及答案
- 操作系统 - 考试题及答案
- 操作系统有用资源
- 操作系统 - 快速指南
- 操作系统 - 有用资源
- 操作系统 - 讨论
操作系统 - 快速指南
操作系统 - 概述
操作系统(OS)是计算机用户和计算机硬件之间的接口。操作系统是一个软件,它执行所有基本任务,例如文件管理、内存管理、进程管理、处理输入和输出以及控制外围设备(如磁盘驱动器和打印机)。
一些流行的操作系统包括 Linux 操作系统、Windows 操作系统、VMS、OS/400、AIX、z/OS 等。
定义
操作系统是一个程序,它充当用户和计算机硬件之间的接口,并控制各种程序的执行。
以下是操作系统的一些重要功能。
- 内存管理
- 处理器管理
- 设备管理
- 文件管理
- 安全
- 控制系统性能
- 作业记账
- 错误检测辅助工具
- 协调其他软件和用户
内存管理
内存管理是指主内存或主存储器的管理。主内存是一个大型的字或字节数组,每个字或字节都有自己的地址。
主内存提供一个 CPU 可以直接访问的快速存储器。要执行程序,它必须位于主内存中。操作系统为内存管理执行以下活动:
跟踪主内存,即哪些部分被谁使用,哪些部分未使用。
在多道程序设计中,操作系统决定哪个进程何时以及获得多少内存。
当进程请求时分配内存。
当进程不再需要内存或已被终止时,释放内存。
处理器管理
在多道程序设计环境中,操作系统决定哪个进程何时以及获得多长时间的处理器。此功能称为**进程调度**。操作系统为处理器管理执行以下活动:
跟踪处理器和进程的状态。负责此任务的程序称为**流量控制器**。
将处理器 (CPU) 分配给进程。
当不再需要进程时,释放处理器。
设备管理
操作系统通过其相应的驱动程序管理设备通信。它为设备管理执行以下活动:
跟踪所有设备。负责此任务的程序称为**I/O 控制器**。
决定哪个进程何时以及获得多长时间的设备。
以高效的方式分配设备。
释放设备。
文件管理
文件系统通常组织成目录,以便于导航和使用。这些目录可能包含文件和其他目录。
操作系统为文件管理执行以下活动:
跟踪信息、位置、用途、状态等。这些集体设施通常被称为**文件系统**。
决定谁获得资源。
分配资源。
释放资源。
其他重要活动
以下是操作系统执行的一些重要活动:
**安全性** - 通过密码和类似的其他技术,它可以防止未经授权访问程序和数据。
**控制系统性能** - 记录服务请求与系统响应之间的延迟。
**作业记账** - 跟踪各种作业和用户使用的時間和资源。
**错误检测辅助工具** - 生成转储、跟踪、错误消息和其他调试和错误检测辅助工具。
**协调其他软件和用户** - 协调和分配编译器、解释器、汇编器和其他软件给计算机系统的各种用户。
操作系统类型
操作系统从第一代计算机就已经存在,并且随着时间的推移不断发展。在本章中,我们将讨论一些最常用的重要操作系统类型。
批处理操作系统
批处理操作系统的用户不直接与计算机交互。每个用户都在脱机设备(如穿孔卡片)上准备他的作业,并将其提交给计算机操作员。为了加快处理速度,具有相似需求的作业被批量在一起并作为一个组运行。程序员将他们的程序交给操作员,然后操作员将具有相似要求的程序分类到批次中。
批处理系统的问题如下:
- 用户和作业之间缺乏交互。
- CPU 经常空闲,因为机械 I/O 设备的速度比 CPU 慢。
- 难以提供所需的优先级。
分时操作系统
分时是一种技术,它使许多位于不同终端的人能够同时使用特定的计算机系统。分时或多任务处理是多道程序设计的逻辑扩展。处理器的时间在多个用户之间同时共享称为分时。
多道程序批处理系统和分时系统的主要区别在于,对于多道程序批处理系统,目标是最大化处理器使用率,而对于分时系统,目标是最小化响应时间。
CPU 通过在多个作业之间切换来执行多个作业,但切换非常频繁。因此,用户可以立即收到响应。例如,在事务处理中,处理器以短暂的突发或计算量子来执行每个用户程序。也就是说,如果存在 **n** 个用户,则每个用户可以获得一个时间量子。当用户提交命令时,响应时间最多为几秒钟。
操作系统使用 CPU 调度和多道程序设计为每个用户提供一小部分时间。最初设计为批处理系统的计算机系统已被修改为分时系统。
分时操作系统的优点如下:
- 提供快速响应的优势。
- 避免软件重复。
- 减少 CPU 空闲时间。
分时操作系统的缺点如下:
- 可靠性问题。
- 用户程序和数据安全性和完整性问题。
- 数据通信问题。
分布式操作系统
分布式系统使用多个中央处理器来服务多个实时应用程序和多个用户。数据处理作业将相应地分布在处理器之间。
处理器通过各种通信线路(例如高速总线或电话线)相互通信。这些被称为**松散耦合系统**或分布式系统。分布式系统中的处理器的大小和功能可能各不相同。这些处理器被称为站点、节点、计算机等等。
分布式系统的优点如下:
- 使用资源共享功能,一个站点上的用户可以使用另一个站点提供的资源。
- 通过电子邮件加快数据交换速度。
- 如果分布式系统中的一个站点发生故障,其余站点可以继续运行。
- 为客户提供更好的服务。
- 减少主机计算机的负载。
- 减少数据处理延迟。
网络操作系统
网络操作系统运行在服务器上,并为服务器提供管理数据、用户、组、安全、应用程序和其他网络功能的能力。网络操作系统的首要目的是允许在网络中的多台计算机之间共享文件和打印机访问,通常是局域网 (LAN)、专用网络或其他网络。
网络操作系统的示例包括 Microsoft Windows Server 2003、Microsoft Windows Server 2008、UNIX、Linux、Mac OS X、Novell NetWare 和 BSD。
网络操作系统的优点如下:
- 集中式服务器高度稳定。
- 安全由服务器管理。
- 新技术和硬件的升级可以轻松集成到系统中。
- 可以从不同位置和类型的系统远程访问服务器。
网络操作系统的缺点如下:
- 购买和运行服务器的成本很高。
- 大多数操作依赖于中心位置。
- 需要定期维护和更新。
实时操作系统
实时系统定义为一种数据处理系统,其中处理和响应输入所需的时间间隔非常小,以至于它可以控制环境。系统响应输入并显示所需更新信息所需的时间称为**响应时间**。因此,在这种方法中,响应时间比联机处理要短得多。
当对处理器的操作或数据流有严格的时间要求时,可以使用实时系统,并且实时系统可以用作专用应用程序中的控制设备。实时操作系统必须具有定义明确的、固定的时间约束,否则系统将失败。例如,科学实验、医学成像系统、工业控制系统、武器系统、机器人、空中交通管制系统等。
实时操作系统主要分为两种。
硬实时系统
硬实时系统保证关键任务按时完成。在硬实时系统中,辅助存储器有限或缺失,数据存储在ROM中。这些系统几乎从不使用虚拟内存。
软实时系统
软实时系统限制较少。关键实时任务优先于其他任务,并保持优先级直到完成。与硬实时系统相比,软实时系统的实用性有限。例如,多媒体、虚拟现实、高级科学项目(如海底探测和行星探测器)等。
操作系统 - 服务
操作系统为用户和程序提供服务。
- 它为程序提供执行环境。
- 它为用户提供以便捷方式执行程序的服务。
以下是操作系统提供的一些常见服务:
- 程序执行
- I/O 操作
- 文件系统操作
- 通信
- 错误检测
- 资源分配
- 保护
程序执行
操作系统处理各种活动,从用户程序到系统程序,例如打印机后台处理程序、名称服务器、文件服务器等。这些活动中的每一个都被封装为一个进程。
一个进程包含完整的执行上下文(要执行的代码、要操作的数据、寄存器、正在使用的操作系统资源)。以下是操作系统在程序管理方面的主要活动:
- 将程序加载到内存中。
- 执行程序。
- 处理程序的执行。
- 提供进程同步机制。
- 提供进程间通信机制。
- 提供死锁处理机制。
I/O 操作
I/O 子系统包含 I/O 设备及其相应的驱动程序软件。驱动程序隐藏了特定硬件设备对用户的特殊性。
操作系统管理用户和设备驱动程序之间的通信。
- I/O 操作是指对任何文件或任何特定 I/O 设备进行读或写操作。
- 操作系统在需要时提供对所需 I/O 设备的访问。
文件系统操作
文件表示相关信息的集合。为了长期存储的目的,计算机可以将文件存储在磁盘(辅助存储器)上。存储介质的示例包括磁带、磁磁盘和光盘驱动器(如CD、DVD)。这些介质中的每一个都有其自身的属性,例如速度、容量、数据传输速率和数据访问方法。
文件系统通常组织成目录,以便于导航和使用。这些目录可能包含文件和其他目录。以下是操作系统在文件管理方面的主要活动:
- 程序需要读取或写入文件。
- 操作系统授予程序对文件的操作权限。
- 权限范围从只读、读写到拒绝访问等。
- 操作系统为用户提供创建/删除文件的接口。
- 操作系统为用户提供创建/删除目录的接口。
- 操作系统提供创建文件系统备份的接口。
通信
对于分布式系统(一系列不共享内存、外围设备或时钟的处理器),操作系统管理所有进程之间的通信。多个进程通过网络中的通信线路相互通信。
操作系统处理路由和连接策略,以及争用和安全问题。以下是操作系统在通信方面的主要活动:
- 两个进程通常需要在它们之间传输数据。
- 这两个进程可以位于一台计算机上,也可以位于不同的计算机上,但通过计算机网络连接。
- 通信可以通过两种方法实现:共享内存或消息传递。
错误处理
错误随时随地都可能发生。错误可能发生在 CPU、I/O 设备或内存硬件中。以下是操作系统在错误处理方面的主要活动:
- 操作系统持续检查可能的错误。
- 操作系统采取适当的措施以确保正确和一致的计算。
资源管理
在多用户或多任务环境中,主内存、CPU 周期和文件存储等资源需要分配给每个用户或作业。以下是操作系统在资源管理方面的主要活动:
- 操作系统使用调度程序管理各种资源。
- CPU 调度算法用于更好地利用 CPU。
保护
考虑到具有多个用户和多个进程并发执行的计算机系统,各个进程必须受到保护,以免受到彼此活动的干扰。
保护是指一种机制或方法,用于控制程序、进程或用户对计算机系统定义的资源的访问。以下是操作系统在保护方面的主要活动:
- 操作系统确保对系统资源的所有访问都受到控制。
- 操作系统确保外部 I/O 设备免受无效的访问尝试。
- 操作系统通过密码为每个用户提供身份验证功能。
操作系统 - 属性
批处理
批处理是一种技术,其中操作系统在处理开始之前将程序和数据一起收集到批处理中。操作系统执行与批处理相关的以下活动:
操作系统定义一个作业,该作业具有预定义的命令、程序和数据序列作为单个单元。
操作系统在内存中保留一定数量的作业,并在没有任何人工干预的情况下执行它们。
作业按提交顺序处理,即先到先服务方式。
作业完成执行后,其内存被释放,作业的输出被复制到输出池中,以便稍后打印或处理。
优点
批处理将操作员的大部分工作转移到计算机上。
性能提升,因为新的作业在之前的作业完成后的立即启动,无需人工干预。
缺点
- 难以调试程序。
- 作业可能进入无限循环。
- 由于缺乏保护方案,一个批处理作业可能会影响待处理的作业。
多任务处理
多任务处理是指 CPU 通过在多个作业之间切换来同时执行多个作业。切换发生得非常频繁,以至于用户可以在程序运行时与每个程序进行交互。操作系统执行与多任务处理相关的以下活动:
用户直接向操作系统或程序发出指令,并立即收到响应。
操作系统以可以同时处理多个操作/执行多个程序的方式来处理多任务处理。
多任务操作系统也称为分时系统。
这些操作系统是为了以合理的成本提供计算机系统的交互式使用而开发的。
分时操作系统使用 CPU 调度和多道程序设计的概念,为每个用户提供分时 CPU 的一小部分时间。
每个用户在内存中至少有一个单独的程序。
加载到内存中并正在执行的程序通常称为进程。
进程执行时,通常只执行很短的时间,然后才会完成或需要执行 I/O。
由于交互式 I/O 通常以较慢的速度运行,因此完成可能需要很长时间。在此期间,另一个进程可以使用 CPU。
操作系统允许用户同时共享计算机。由于分时系统中的每个操作或命令都倾向于很短,因此每个用户只需要很少的 CPU 时间。
当系统快速地将 CPU 从一个用户/程序切换到另一个用户/程序时,每个用户都会产生拥有自己的 CPU 的印象,而实际上只有一个 CPU 被许多用户共享。
多道程序设计
当两个或多个程序同时驻留在内存中时共享处理器,称为多道程序设计。多道程序设计假设单个共享处理器。多道程序设计通过组织作业来提高 CPU 利用率,以便 CPU 始终有一个作业可执行。
下图显示了多道程序设计系统的内存布局。(此处应插入图片)
操作系统执行与多道程序设计相关的以下活动。
操作系统同时在内存中保留多个作业。
这组作业是作业池中保留的作业的子集。
操作系统选择并开始执行内存中的一个作业。
多道程序设计操作系统使用内存管理程序监视所有活动程序和系统资源的状态,以确保 CPU 从不空闲,除非没有作业可处理。
优点
- 高且高效的 CPU 利用率。
- 用户感觉许多程序几乎同时分配了 CPU。
缺点
- 需要 CPU 调度。
- 为了在内存中容纳许多作业,需要内存管理。
交互性
交互性是指用户与计算机系统交互的能力。操作系统执行与交互性相关的以下活动:
- 为用户提供与系统交互的界面。
- 管理输入设备以接收用户的输入。例如,键盘。
- 管理输出设备以向用户显示输出。例如,显示器。
操作系统的响应时间需要很短,因为用户提交并等待结果。
实时系统
实时系统通常是专用的嵌入式系统。操作系统执行与实时系统活动相关的以下活动。
- 在这些系统中,操作系统通常从传感器数据读取并对其做出反应。
- 操作系统必须保证在固定时间段内对事件做出响应,以确保正确的性能。
分布式环境
分布式环境是指计算机系统中的多个独立 CPU 或处理器。操作系统执行与分布式环境相关的以下活动:
操作系统在多个物理处理器之间分配计算逻辑。
处理器不共享内存或时钟。相反,每个处理器都有自己的本地内存。
操作系统管理处理器之间的通信。它们通过各种通信线路相互通信。
假脱机
假脱机是同时外围操作在线的缩写。假脱机是指将各种 I/O 作业的数据放入缓冲区。该缓冲区是内存或硬盘中一个特殊的区域,I/O 设备可以访问该区域。
操作系统执行与分布式环境相关的以下活动:
处理 I/O 设备数据假脱机,因为设备具有不同的数据访问速率。
维护假脱机缓冲区,该缓冲区提供一个等待站,数据可以在较慢的设备赶上来时在此处停留。
由于卷轴处理(spooling)过程可以并行执行I/O操作,因此可以保持并行计算。计算机可以同时从磁带读取数据、向磁盘写入数据以及向磁带打印机输出数据,同时执行其计算任务。
优点
- 卷轴操作使用磁盘作为非常大的缓冲区。
- 卷轴能够将一个作业的I/O操作与另一个作业的处理器操作重叠。
操作系统 - 进程
进程
进程基本上是正在执行的程序。进程的执行必须以顺序方式进行。
进程定义为代表系统中要实现的基本工作单元的实体。
简单来说,我们将计算机程序写入文本文件,当我们执行此程序时,它就变成了一个执行程序中所有任务的进程。
当程序加载到内存中并成为一个进程时,它可以分为四个部分——堆栈、堆、文本和数据。下图显示了主内存中进程的简化布局:
| 序号 | 组成部分及描述 |
|---|---|
| 1 | 堆栈 进程堆栈包含临时数据,例如方法/函数参数、返回地址和局部变量。 |
| 2 | 堆 这是在运行时动态分配给进程的内存。 |
| 3 | 文本 这包括由程序计数器的值和处理器寄存器的内容表示的当前活动。 |
| 4 | 数据 此部分包含全局变量和静态变量。 |
程序
程序是一段代码,可以是一行或数百万行。计算机程序通常由计算机程序员使用编程语言编写。例如,这是一个用C语言编写的简单程序:
#include <stdio.h>
int main() {
printf("Hello, World! \n");
return 0;
}
计算机程序是由一系列指令组成的集合,当计算机执行这些指令时,会执行特定的任务。当我们将程序与进程进行比较时,我们可以得出结论:进程是计算机程序的动态实例。
执行明确定义的任务的计算机程序的一部分称为算法。计算机程序、库和相关数据的集合称为软件。
进程生命周期
当进程执行时,它会经过不同的状态。这些阶段在不同的操作系统中可能有所不同,这些状态的名称也不规范。
一般来说,进程一次可以处于以下五种状态之一。
| 序号 | 状态及描述 |
|---|---|
| 1 |
开始 这是进程首次启动/创建时的初始状态。 |
| 2 |
就绪 进程正在等待分配到处理器。就绪进程正在等待操作系统为其分配处理器,以便它们可以运行。进程可能在开始状态后进入此状态,或者在运行过程中被调度程序中断以将CPU分配给其他进程。 |
| 3 | 运行 一旦操作系统调度程序将进程分配给处理器,进程状态将设置为运行,并且处理器将执行其指令。 |
| 4 | 等待 如果进程需要等待资源(例如等待用户输入或等待文件可用),则进程将进入等待状态。 |
| 5 | 终止或退出 一旦进程完成执行或被操作系统终止,它将被移至终止状态,在那里等待从主内存中删除。 |
进程控制块 (PCB)
进程控制块是操作系统为每个进程维护的数据结构。PCB 由一个整数进程 ID (PID) 标识。PCB 保持跟踪进程所需的所有信息,如下表所示:
| 序号 | 信息及描述 |
|---|---|
| 1 | 进程状态 进程的当前状态,即它是否就绪、运行、等待或其他状态。 |
| 2 | 进程权限 这是允许/不允许访问系统资源所必需的。 |
| 3 | 进程ID 操作系统中每个进程的唯一标识。 |
| 4 | 指针 指向父进程的指针。 |
| 5 | 程序计数器 程序计数器是指向此进程要执行的下一条指令的地址的指针。 |
| 6 | CPU寄存器 进程在运行状态下需要存储在其中的各种CPU寄存器。 |
| 7 | CPU调度信息 进程优先级和其他调度信息,这些信息是调度进程所必需的。 |
| 8 | 内存管理信息 这包括页面表、内存限制、段表的信息,具体取决于操作系统使用的内存。 |
| 9 | 会计信息 这包括进程执行使用的CPU数量、时间限制、执行ID等。 |
| 10 | I/O状态信息 这包括分配给进程的I/O设备列表。 |
PCB的架构完全取决于操作系统,并且在不同的操作系统中可能包含不同的信息。这是一个简化的PCB示意图:
在进程的整个生命周期中都为其维护PCB,并且一旦进程终止,PCB就会被删除。
操作系统 - 进程调度
定义
进程调度是进程管理器处理从CPU中移除正在运行的进程以及根据特定策略选择另一个进程的活动。
进程调度是多道程序操作系统的重要组成部分。这种操作系统允许将多个进程同时加载到可执行内存中,并且加载的进程使用时间多路复用来共享CPU。
进程调度队列
操作系统将所有PCB保存在进程调度队列中。操作系统为每个进程状态维护一个单独的队列,并且处于相同执行状态的所有进程的PCB都放置在同一个队列中。当进程的状态发生变化时,其PCB将从其当前队列中解链,并移动到其新的状态队列。
操作系统维护以下重要的进程调度队列:
作业队列 - 此队列保留系统中的所有进程。
就绪队列 - 此队列保留驻留在主内存中、已准备好并等待执行的所有进程的集合。新进程总是放入此队列。
设备队列 - 由于I/O设备不可用而被阻塞的进程构成此队列。
操作系统可以使用不同的策略来管理每个队列(FIFO、轮询、优先级等)。操作系统调度程序确定如何将进程在就绪队列和运行队列之间移动,运行队列在系统上每个处理器内核只能有一个条目;在上图中,它已与CPU合并。
二态进程模型
二态进程模型指的是运行状态和非运行状态,如下所述:
| 序号 | 状态及描述 |
|---|---|
| 1 | 运行 当创建一个新进程时,它将作为运行状态进入系统。 |
| 2 | 非运行 未运行的进程保存在队列中,等待轮到它们执行。队列中的每个条目都是指向特定进程的指针。队列使用链表实现。调度程序的使用如下。当进程中断时,该进程将被转移到等待队列。如果进程已完成或中止,则该进程将被丢弃。在这两种情况下,调度程序都会从队列中选择一个进程来执行。 |
调度程序
调度程序是特殊的系统软件,它们以各种方式处理进程调度。它们的主要任务是选择要提交到系统的作业,并决定运行哪个进程。调度程序有三种类型:
- 长期调度程序
- 短期调度程序
- 中期调度程序
长期调度程序
它也称为作业调度程序。长期调度程序确定哪些程序被允许进入系统进行处理。它从队列中选择进程并将它们加载到内存中以执行。进程加载到内存中以进行CPU调度。
作业调度程序的主要目标是提供均衡的作业组合,例如I/O绑定和处理器绑定。它还控制多道程序设计的程度。如果多道程序设计的程度稳定,则进程创建的平均速率必须等于离开系统的进程的平均离开速率。
在某些系统上,长期调度程序可能不可用或最小化。分时操作系统没有长期调度程序。当进程将状态从新建更改为就绪时,则使用长期调度程序。
短期调度程序
它也称为CPU调度程序。其主要目标是根据所选的标准提高系统性能。它是进程状态从就绪状态更改为运行状态。CPU调度程序从已准备好执行的进程中选择一个进程,并为其中一个进程分配CPU。
短期调度程序(也称为调度程序)决定接下来执行哪个进程。短期调度程序比长期调度程序快。
中期调度程序
中期调度是交换的一部分。它从内存中移除进程。它降低了多道程序设计的程度。中期调度程序负责处理交换出的进程。
正在运行的进程如果发出I/O请求,可能会变为挂起状态。挂起的进程无法朝完成方向取得任何进展。在这种情况下,为了从内存中移除进程并为其他进程腾出空间,将挂起的进程移动到辅助存储器。此过程称为交换,并且据说该进程已交换出或推出。交换可能需要改进进程组合。
调度程序比较
| 序号 | 长期调度程序 | 短期调度程序 | 中期调度程序 |
|---|---|---|---|
| 1 | 它是作业调度程序 | 它是CPU调度程序 | 它是进程交换调度程序。 |
| 2 | 速度低于短期调度程序 | 速度是其他两种中最快的 | 速度介于短期和长期调度程序之间。 |
| 3 | 它控制多道程序设计的程度 | 它对多道程序设计的程度的控制较少 | 它降低了多道程序设计的程度。 |
| 4 | 在分时系统中几乎不存在或最小化 | 在分时系统中也最小化 | 它是分时系统的一部分。 |
| 5 | 它从进程池中选择进程并将其加载到内存中以执行。 | 它选择那些准备执行的进程。 | 它可以将进程重新引入内存,并可以继续执行。 |
上下文切换
上下文切换是一种存储和恢复CPU在进程控制块中状态或上下文的机制,以便稍后可以从同一点恢复进程执行。使用此技术,上下文切换器使多个进程能够共享单个CPU。上下文切换是多任务操作系统功能的重要组成部分。
当调度程序将CPU从执行一个进程切换到执行另一个进程时,当前运行进程的状态将存储到进程控制块中。在此之后,下一个要运行的进程的状态将从其自身的PCB加载,并用于设置PC、寄存器等。此时,第二个进程可以开始执行。
上下文切换在计算上是密集型的,因为必须保存和恢复寄存器和内存状态。为了避免上下文切换时间过长,一些硬件系统采用两组或多组处理器寄存器。当进程切换时,以下信息将被存储以供以后使用。
- 程序计数器
- 调度信息
- 基址和界限寄存器值
- 当前使用的寄存器
- 已更改的状态
- I/O状态信息
- 会计信息
操作系统调度算法
进程调度程序根据特定的调度算法调度不同的进程分配给CPU。本章将讨论六种常用的进程调度算法:
- 先来先服务 (FCFS) 调度
- 最短作业优先 (SJN) 调度
- 优先级调度
- 剩余时间最短
- 轮询 (RR) 调度
- 多级队列调度
这些算法要么是**非抢占式**的,要么是**抢占式**的。非抢占式算法的设计使得一旦一个进程进入运行状态,它就不能被抢占,直到它完成分配的时间,而抢占式调度是基于优先级的,调度程序可以在任何时候抢占低优先级的运行进程,只要高优先级的进程进入就绪状态。
先来先服务 (FCFS)
- 作业按照先来先服务的顺序执行。
- 这是一种非抢占式,可抢占的调度算法。
- 易于理解和实现。
- 其实现基于FIFO队列。
- 性能较差,平均等待时间较长。
每个进程的**等待时间**如下:
| 进程 | 等待时间:服务时间 - 到达时间 |
|---|---|
| P0 | 0 - 0 = 0 |
| P1 | 5 - 1 = 4 |
| P2 | 8 - 2 = 6 |
| P3 | 16 - 3 = 13 |
平均等待时间:(0+4+6+13) / 4 = 5.75
最短作业优先 (SJN)
这也被称为**最短作业优先**,或SJF。
这是一种非抢占式,可抢占的调度算法。
最小化等待时间的最佳方法。
易于在批处理系统中实现,其中所需的CPU时间是预先知道的。
无法在交互式系统中实现,因为所需的CPU时间是未知的。
处理器应该预先知道进程需要多长时间。
已知:进程表及其到达时间、执行时间
| 进程 | 到达时间 | 执行时间 | 服务时间 |
|---|---|---|---|
| P0 | 0 | 5 | 0 |
| P1 | 1 | 3 | 5 |
| P2 | 2 | 8 | 14 |
| P3 | 3 | 6 | 8 |
每个进程的**等待时间**如下:
| 进程 | 等待时间 |
|---|---|
| P0 | 0 - 0 = 0 |
| P1 | 5 - 1 = 4 |
| P2 | 14 - 2 = 12 |
| P3 | 8 - 3 = 5 |
平均等待时间:(0 + 4 + 12 + 5)/4 = 21 / 4 = 5.25
基于优先级的调度
优先级调度是一种非抢占式算法,也是批处理系统中最常见的调度算法之一。
每个进程都被分配一个优先级。优先级最高的进程将首先执行,依次类推。
具有相同优先级的进程按照先来先服务的顺序执行。
优先级可以根据内存需求、时间需求或任何其他资源需求来决定。
已知:进程表及其到达时间、执行时间和优先级。这里我们认为1是最低优先级。
| 进程 | 到达时间 | 执行时间 | 优先级 | 服务时间 |
|---|---|---|---|---|
| P0 | 0 | 5 | 1 | 0 |
| P1 | 1 | 3 | 2 | 11 |
| P2 | 2 | 8 | 1 | 14 |
| P3 | 3 | 6 | 3 | 5 |
每个进程的**等待时间**如下:
| 进程 | 等待时间 |
|---|---|
| P0 | 0 - 0 = 0 |
| P1 | 11 - 1 = 10 |
| P2 | 14 - 2 = 12 |
| P3 | 5 - 3 = 2 |
平均等待时间:(0 + 10 + 12 + 2)/4 = 24 / 4 = 6
剩余时间最短
最短剩余时间 (SRT) 是 SJN 算法的抢占式版本。
处理器分配给最接近完成的作业,但它可以被一个新的、完成时间更短的就绪作业抢占。
无法在交互式系统中实现,因为所需的CPU时间是未知的。
它通常用于批处理环境中,需要优先处理短作业。
轮询调度
轮询是一种抢占式进程调度算法。
每个进程都被提供一个固定的执行时间,这被称为**时间片**。
一旦一个进程执行了给定的时间段,它就会被抢占,另一个进程将执行给定的时间段。
上下文切换用于保存被抢占进程的状态。
每个进程的**等待时间**如下:
| 进程 | 等待时间:服务时间 - 到达时间 |
|---|---|
| P0 | (0 - 0) + (12 - 3) = 9 |
| P1 | (3 - 1) = 2 |
| P2 | (6 - 2) + (14 - 9) + (20 - 17) = 12 |
| P3 | (9 - 3) + (17 - 12) = 11 |
平均等待时间:(9+2+12+11) / 4 = 8.5
多级队列调度
多级队列不是一种独立的调度算法。它们利用其他现有算法对具有共同特征的作业进行分组和调度。
- 为具有共同特征的进程维护多个队列。
- 每个队列都可以有自己的调度算法。
- 为每个队列分配优先级。
例如,CPU密集型作业可以安排在一个队列中,所有I/O密集型作业安排在另一个队列中。然后,进程调度程序交替地从每个队列中选择作业,并根据分配给队列的算法将它们分配给CPU。
操作系统 - 多线程
什么是线程?
线程是通过进程代码的执行流,它有自己的程序计数器来跟踪下一个要执行的指令,系统寄存器保存其当前的工作变量,以及包含执行历史的堆栈。
线程与其对等线程共享一些信息,例如代码段、数据段和打开的文件。当一个线程改变代码段内存项时,所有其他线程都会看到这一点。
线程也称为**轻量级进程**。线程通过并行性提供了一种提高应用程序性能的方法。线程代表了一种软件方法,通过减少开销来提高操作系统的性能,线程相当于经典进程。
每个线程都属于一个进程,并且任何线程都不能存在于进程之外。每个线程代表一个单独的控制流。线程已成功用于实现网络服务器和Web服务器。它们也为在共享内存多处理器上并行执行应用程序提供了合适的框架。下图显示了单线程和多线程进程的工作方式。
进程和线程的区别
| 序号 | 进程 | 线程 |
|---|---|---|
| 1 | 进程是重量级或资源密集型的。 | 线程是轻量级的,比进程占用更少的资源。 |
| 2 | 进程切换需要与操作系统交互。 | 线程切换不需要与操作系统交互。 |
| 3 | 在多处理环境中,每个进程执行相同的代码,但拥有自己的内存和文件资源。 | 所有线程可以共享同一组打开的文件、子进程。 |
| 4 | 如果一个进程被阻塞,则在第一个进程解除阻塞之前,任何其他进程都不能执行。 | 当一个线程被阻塞并等待时,同一任务中的第二个线程可以运行。 |
| 5 | 不使用线程的多进程使用更多资源。 | 多线程进程使用更少的资源。 |
| 6 | 在多进程中,每个进程独立于其他进程运行。 | 一个线程可以读取、写入或更改另一个线程的数据。 |
线程的优点
- 线程最小化上下文切换时间。
- 使用线程可以在进程内提供并发性。
- 高效的通信。
- 创建和上下文切换线程更经济。
- 线程允许更大规模和效率地利用多处理器架构。
线程类型
线程的实现方式如下:
**用户级线程** - 用户管理的线程。
**内核级线程** - 操作系统管理的线程,作用于内核(操作系统核心)。
用户级线程
在这种情况下,线程管理内核不知道线程的存在。线程库包含用于创建和销毁线程、在线程之间传递消息和数据、调度线程执行以及保存和恢复线程上下文的代码。应用程序以单个线程启动。
优点
- 线程切换不需要内核模式权限。
- 用户级线程可以在任何操作系统上运行。
- 调度可以在用户级线程中是特定于应用程序的。
- 用户级线程创建和管理速度快。
缺点
- 在典型的操作系统中,大多数系统调用都是阻塞的。
- 多线程应用程序无法利用多处理。
内核级线程
在这种情况下,线程管理由内核完成。应用程序区域中没有线程管理代码。内核线程直接由操作系统支持。任何应用程序都可以被编程为多线程的。应用程序中的所有线程都支持在一个进程内。
内核维护整个进程以及进程内各个线程的上下文信息。内核的调度是基于线程进行的。内核在内核空间执行线程创建、调度和管理。内核线程的创建和管理通常比用户线程慢。
优点
- 内核可以同时调度来自同一进程的多个线程到多个进程上。
- 如果进程中的一个线程被阻塞,内核可以调度同一进程的另一个线程。
- 内核例程本身可以是多线程的。
缺点
- 内核线程的创建和管理通常比用户线程慢。
- 从同一进程中的一个线程到另一个线程的控制转移需要模式切换到内核。
多线程模型
一些操作系统提供组合的用户级线程和内核级线程功能。Solaris就是一个很好的结合方法的例子。在一个组合系统中,同一应用程序中的多个线程可以在多个处理器上并行运行,并且阻塞系统调用不必阻塞整个进程。多线程模型有三种类型
- 多对多关系。
- 多对一关系。
- 一对一关系。
多对多模型
多对多模型将任意数量的用户线程多路复用到相同数量或更少的内核线程上。
下图显示了多对多线程模型,其中6个用户级线程与6个内核级线程多路复用。在这个模型中,开发人员可以根据需要创建任意数量的用户线程,相应的内核线程可以在多处理器机器上并行运行。该模型提供了对并发的最佳精度,当线程执行阻塞系统调用时,内核可以调度另一个线程执行。
多对一模型
多对一模型将许多用户级线程映射到一个内核级线程。线程管理由用户空间中的线程库完成。当线程进行阻塞系统调用时,整个进程将被阻塞。一次只有一个线程可以访问内核,因此多个线程无法在多处理器上并行运行。
如果用户级线程库在操作系统中以系统不支持的方式实现,则内核线程使用多对一关系模式。
一对一模型
用户级线程与内核级线程之间存在一对一的关系。该模型比多对一模型提供更多的并发性。当线程进行阻塞系统调用时,它也允许另一个线程运行。它支持在微处理器上并行执行多个线程。
这种模型的缺点是创建用户线程需要相应的内核线程。OS/2、Windows NT和Windows 2000使用一对一的关系模型。
用户级线程与内核级线程的区别
| 序号 | 用户级线程 | 内核级线程 |
|---|---|---|
| 1 | 用户级线程创建和管理速度更快。 | 内核级线程创建和管理速度较慢。 |
| 2 | 通过用户级的线程库实现。 | 操作系统支持创建内核线程。 |
| 3 | 用户级线程是通用的,可以在任何操作系统上运行。 | 内核级线程是特定于操作系统的。 |
| 4 | 多线程应用程序无法利用多处理。 | 内核例程本身可以是多线程的。 |
操作系统 - 内存管理
内存管理是操作系统的功能,它处理或管理主内存,并在执行过程中将进程在主内存和磁盘之间移动。内存管理跟踪每个内存位置,无论它是否分配给某个进程或它是空闲的。它检查要分配给进程的内存量。它决定哪个进程将在何时获得内存。它跟踪何时一些内存被释放或未分配,并相应地更新状态。
本教程将教你与内存管理相关的基本概念。
进程地址空间
进程地址空间是进程在其代码中引用的逻辑地址集。例如,当使用32位寻址时,地址范围可以从0到0x7fffffff;也就是说,2^31个可能的数字,理论总大小为2GB。
操作系统负责在向程序分配内存时将逻辑地址映射到物理地址。在分配内存之前和之后,程序中使用了三种类型的地址:
| 序号 | 内存地址及说明 |
|---|---|
| 1 |
符号地址 在源代码中使用的地址。变量名、常量和指令标签是符号地址空间的基本元素。 |
| 2 |
相对地址 在编译时,编译器将符号地址转换为相对地址。 |
| 3 | 物理地址 加载器在程序加载到主内存时生成这些地址。 |
在编译时和加载时地址绑定方案中,虚拟地址和物理地址相同。在执行时地址绑定方案中,虚拟地址和物理地址不同。
程序生成的所有逻辑地址的集合称为**逻辑地址空间**。与这些逻辑地址对应的所有物理地址的集合称为**物理地址空间**。
虚拟地址到物理地址的运行时映射由内存管理单元 (MMU) 完成,MMU 是一种硬件设备。MMU 使用以下机制将虚拟地址转换为物理地址。
基址寄存器的值加到用户进程生成的每个地址上,在发送到内存时将其视为偏移量。例如,如果基址寄存器值为10000,则用户尝试使用地址位置100将动态重新分配到位置10100。
用户程序处理虚拟地址;它永远不会看到实际的物理地址。
静态加载与动态加载
在开发计算机程序时需要选择静态加载或动态加载。如果必须静态加载程序,则在编译时,将编译和链接完整的程序,而不会留下任何外部程序或模块依赖项。链接器将目标程序与其他必要的目标模块组合成一个绝对程序,其中也包括逻辑地址。
如果编写的是动态加载程序,则编译器将编译程序,并且对于要动态包含的所有模块,仅提供引用,其余工作将在执行时完成。
在加载时,使用**静态加载**,将绝对程序(和数据)加载到内存中以启动执行。
如果使用**动态加载**,库的动态例程将以可重定位的形式存储在磁盘上,并且仅在程序需要时才加载到内存中。
静态链接与动态链接
如上所述,当使用静态链接时,链接器将程序所需的所有其他模块组合到单个可执行程序中,以避免任何运行时依赖项。
当使用动态链接时,不需要将实际的模块或库与程序链接,而是在编译和链接时提供对动态模块的引用。Windows中的动态链接库 (DLL) 和Unix中的共享对象是动态库的良好示例。
交换
交换是一种机制,其中可以暂时将进程从主内存(或移动)交换到辅助存储器(磁盘),并将该内存提供给其他进程。在稍后的某个时间,系统将进程从辅助存储器交换回主内存。
虽然交换进程通常会影响性能,但它有助于并行运行多个大型进程,这就是**交换也称为内存压缩技术**的原因。
交换过程的总时间包括将整个进程移动到辅助磁盘然后将其复制回内存所需的时间,以及进程恢复主内存所需的时间。
让我们假设用户进程的大小为2048KB,并且进行交换的标准硬盘的数据传输速率约为每秒1MB。将1000K进程实际传输到内存或从内存传输需要
2048KB / 1024KB per second = 2 seconds = 2000 milliseconds
现在考虑进出时间,它将需要完整的4000毫秒加上其他开销,其中进程竞争以恢复主内存。
内存分配
主内存通常有两个分区:
**低内存** - 操作系统驻留在该内存中。
**高内存** - 用户进程保存在高内存中。
操作系统使用以下内存分配机制。
| 序号 | 内存分配及说明 |
|---|---|
| 1 | 单分区分配 在这种类型的分配中,使用重定位寄存器方案来保护用户进程彼此不受影响,并防止更改操作系统代码和数据。重定位寄存器包含最小物理地址的值,而限制寄存器包含逻辑地址的范围。每个逻辑地址都必须小于限制寄存器。 |
| 2 | 多分区分配 在这种类型的分配中,主内存被划分为多个固定大小的分区,每个分区应只包含一个进程。当分区空闲时,从输入队列中选择一个进程并将其加载到空闲分区中。当进程终止时,该分区可用于另一个进程。 |
碎片
随着进程加载到内存和从内存中删除,空闲内存空间被分割成小块。有时会发生这种情况,由于进程大小较小,因此无法将进程分配到内存块,并且内存块保持未使用状态。这个问题称为碎片。
碎片分为两种类型:
| 序号 | 碎片及说明 |
|---|---|
| 1 | 外部碎片 总内存空间足以满足请求或在其上驻留进程,但它不连续,因此无法使用。 |
| 2 | 内部碎片 分配给进程的内存块较大。部分内存未被使用,因为它不能被另一个进程使用。 |
下图显示了碎片如何导致内存浪费以及如何使用压缩技术从碎片内存中创建更多空闲内存:
可以通过压缩或整理内存内容来减少外部碎片,以便将所有空闲内存放在一个大的块中。为了使压缩可行,重定位应该是动态的。
可以通过有效地分配最小但足够大的分区来减少内部碎片。
分页
计算机可以寻址的内存量超过系统上实际安装的内存量。这部分额外的内存实际上称为虚拟内存,它是硬盘的一个部分,用于模拟计算机的RAM。分页技术在实现虚拟内存中起着重要作用。
分页是一种内存管理技术,其中进程地址空间被分成相同大小的块,称为**页**(大小为2的幂,介于512字节和8192字节之间)。进程的大小以页数来衡量。
类似地,主内存被分成称为**帧**的小型固定大小的(物理)内存块,并且帧的大小与页的大小相同,以优化主内存的利用率并避免外部碎片。
地址转换
页地址称为**逻辑地址**,用**页号**和**偏移量**表示。
Logical Address = Page number + page offset
帧地址称为**物理地址**,用**帧号**和**偏移量**表示。
Physical Address = Frame number + page offset
一个称为**页表**的数据结构用于跟踪进程的页与物理内存中帧之间的关系。
当系统将帧分配给任何页时,它会将此逻辑地址转换为物理地址,并在页表中创建条目,以便在程序执行期间使用。
当要执行进程时,其相应的页将加载到任何可用的内存帧中。假设您有一个8KB的程序,但您的内存在给定时间点只能容纳5KB,那么分页概念就会出现。当计算机内存不足时,操作系统 (OS) 将将空闲或不需要的内存页移动到辅助内存,以便为其他进程释放RAM,并在程序需要时将其取回。
此过程在程序的整个执行过程中持续进行,其中操作系统不断将空闲页从主内存中删除并将其写入辅助内存,并在程序需要时将其取回。
分页的优缺点
以下是分页的优缺点列表:
分页减少了外部碎片,但仍然存在内部碎片。
分页易于实现,并被认为是一种有效的内存管理技术。
由于页和帧的大小相等,因此交换变得非常容易。
页表需要额外的内存空间,因此对于RAM较小的系统可能不太好。
分段
分段是一种内存管理技术,其中每个作业被分成几个不同大小的段,每个段包含执行相关功能的片段。每个段实际上是程序的不同逻辑地址空间。
当要执行进程时,其对应的段将加载到非连续内存中,尽管每个段都加载到可用的连续内存块中。
分段内存管理的工作方式与分页非常相似,但这里的段是可变长度的,而分页中的页是固定大小的。
程序段包含程序的主函数、实用函数、数据结构等等。操作系统为每个进程维护一个段映射表,以及包含段号、大小和主存中对应内存位置的空闲内存块列表。表中为每个段存储段的起始地址和长度。内存位置的引用包括标识段的值和偏移量。
操作系统 - 虚拟内存
计算机可以寻址的内存量超过系统实际安装的物理内存量。这部分额外的内存实际上称为虚拟内存,它是硬盘上的一部分区域,用于模拟计算机的RAM。
这种方案的主要可见优势在于程序可以大于物理内存。虚拟内存有两个用途。首先,它允许我们通过使用磁盘来扩展物理内存的使用。其次,它允许我们拥有内存保护,因为每个虚拟地址都转换为物理地址。
以下是一些不需要将整个程序完全加载到主内存的情况。
用户编写的错误处理例程仅在数据或计算中发生错误时使用。
程序的某些选项和功能可能很少使用。
许多表被分配了固定数量的地址空间,即使实际上只使用了表的一小部分。
能够执行仅部分加载到内存中的程序会抵消许多好处。
加载或交换每个用户程序到内存所需的I/O次数会减少。
程序将不再受可用物理内存量的限制。
每个用户程序可以使用更少的物理内存,可以同时运行更多程序,从而提高CPU利用率和吞吐量。
现代用于通用用途的微处理器内置了内存管理单元 (MMU)。MMU 的工作是将虚拟地址转换为物理地址。下面给出一个基本的例子:
虚拟内存通常通过按需分页来实现。它也可以在分段系统中实现。按需分段也可以用于提供虚拟内存。
按需分页
按需分页系统与带交换的分页系统非常相似,其中进程驻留在辅助存储器中,页面仅按需加载,而不是预先加载。当发生上下文切换时,操作系统不会将任何旧程序的页面复制到磁盘,也不会将任何新程序的页面复制到主内存。相反,它只在加载第一页后开始执行新程序,并在引用时获取该程序的页面。
在执行程序期间,如果程序引用一个在主内存中不可用的页面(因为它不久前被交换出去了),处理器将此无效内存引用视为页面错误,并将控制权从程序转移到操作系统,以请求将页面调回内存。
优点
以下是按需分页的优点:
- 大型虚拟内存。
- 更有效地利用内存。
- 多道程序设计的程度没有限制。
缺点
处理页面中断所需的表数量和处理器开销大于简单的分页管理技术。
页面置换算法
页面置换算法是操作系统用来决定哪些内存页面需要交换出去,写入磁盘的技术,当需要分配内存页面时。当发生页面错误并且无法使用空闲页面进行分配时发生分页,原因是页面不可用或空闲页面的数量少于所需页面。
当选择的要替换并已分页出的页面再次被引用时,它必须从磁盘读取,这需要I/O完成。这个过程决定了页面置换算法的质量:等待页面调入的时间越短,算法越好。
页面置换算法查看硬件提供的关于访问页面的有限信息,并尝试选择哪些页面应该被替换以最大限度地减少页面错误的总数,同时平衡主存储器的成本和算法本身的处理器时间。有很多不同的页面置换算法。我们通过在一个特定的内存引用字符串上运行算法并计算页面错误的数量来评估算法。
引用串
内存引用的字符串称为引用串。引用串是人工生成的,或者通过跟踪给定的系统并记录每个内存引用的地址来生成的。后者会产生大量数据,我们要注意两点。
对于给定的页面大小,我们只需要考虑页号,而不是整个地址。
如果我们有一个对页面p的引用,那么任何紧随其后的对页面p的引用都不会导致页面错误。页面p将在第一次引用后驻留在内存中;紧随其后的引用不会出错。
例如,考虑以下地址序列:123, 215, 600, 1234, 76, 96
如果页面大小为100,则引用串为1, 2, 6, 12, 0, 0
先进先出 (FIFO) 算法
主内存中最旧的页面将被选择替换。
易于实现,保持一个列表,从尾部替换页面,并在头部添加新页面。
最优页面算法
最优页面置换算法具有所有算法中最低的页面错误率。存在最优页面置换算法,被称为 OPT 或 MIN。
替换在最长时间内不会被使用的页面。使用页面将要使用的时间。
最近最少使用 (LRU) 算法
主内存中使用时间最长的页面将被选择替换。
易于实现,保持一个列表,通过回顾时间来替换页面。
页面缓冲算法
- 为了快速启动进程,保留一个空闲帧池。
- 页面错误时,选择一个页面进行替换。
- 将新页面写入空闲池的帧中,标记页表并重新启动进程。
- 现在将脏页面写入磁盘,并将包含被替换页面的帧放入空闲池中。
最不经常使用 (LFU) 算法
计数最小的页面将被选择替换。
该算法存在这样的情况:在进程的初始阶段大量使用一个页面,但之后再也不会使用。
最经常使用 (MFU) 算法
该算法基于这样的论点:计数最小的页面可能刚刚被调入,尚未使用。
操作系统 - I/O 硬件
操作系统的重要的工作之一是管理各种 I/O 设备,包括鼠标、键盘、触摸板、磁盘驱动器、显示适配器、USB 设备、位图屏幕、LED、模数转换器、开关、网络连接、音频 I/O、打印机等。
I/O 系统需要接收应用程序的 I/O 请求并将其发送到物理设备,然后接收从设备返回的任何响应并将其发送到应用程序。I/O 设备可以分为两类:
块设备 - 块设备是指驱动程序通过发送整个数据块进行通信的设备。例如,硬盘、USB摄像头、U盘等。
字符设备 - 字符设备是指驱动程序通过发送和接收单个字符(字节、八位字节)进行通信的设备。例如,串口、并口、声卡等。
设备控制器
设备驱动程序是可以插入操作系统的软件模块,用于处理特定设备。操作系统借助设备驱动程序来处理所有I/O设备。
设备控制器充当设备和设备驱动程序之间的接口。I/O 单元(键盘、鼠标、打印机等)通常由机械部件和电子部件组成,其中电子部件称为设备控制器。
每个设备都有一个设备控制器和一个设备驱动程序与操作系统通信。一个设备控制器可能能够处理多个设备。作为接口,它的主要任务是将串行比特流转换为字节块,并在必要时执行错误校正。
任何连接到计算机的设备都通过插头和插座连接,插座连接到设备控制器。以下是连接 CPU、内存、控制器和 I/O 设备的模型,其中 CPU 和设备控制器都使用公共总线进行通信。
同步与异步 I/O
同步 I/O - 在此方案中,CPU 执行在 I/O 进行时等待。
异步 I/O - I/O 与 CPU 执行并发进行。
与 I/O 设备的通信
CPU 必须有一种方法可以将信息传递到 I/O 设备和从 I/O 设备接收信息。有三种方法可用于与 CPU 和设备通信。
- 特殊指令 I/O
- 内存映射 I/O
- 直接内存访问 (DMA)
特殊指令 I/O
这使用专门用于控制 I/O 设备的 CPU 指令。这些指令通常允许将数据发送到 I/O 设备或从 I/O 设备读取数据。
内存映射 I/O
使用内存映射 I/O 时,内存和 I/O 设备共享相同的地址空间。该设备直接连接到某些主内存位置,以便 I/O 设备可以将数据块直接传输到内存或从内存传输数据,而无需经过 CPU。
使用内存映射 I/O 时,操作系统在内存中分配缓冲区并通知 I/O 设备使用该缓冲区将数据发送到 CPU。I/O 设备与 CPU 异步运行,在完成时中断 CPU。
这种方法的优点是每个可以访问内存的指令都可以用来操作 I/O 设备。内存映射 I/O 用于大多数高速 I/O 设备,如磁盘、通信接口。
直接内存访问 (DMA)
像键盘这样的慢速设备会在传输每个字节后向主 CPU 生成中断。如果像磁盘这样的快速设备为每个字节生成中断,操作系统将花费大部分时间处理这些中断。因此,典型的计算机使用直接内存访问 (DMA) 硬件来减少这种开销。
直接内存访问 (DMA) 意味着 CPU 将读取或写入内存的权限授予 I/O 模块,而无需参与。DMA 模块本身控制主内存和 I/O 设备之间的数据交换。CPU 仅参与传输的开始和结束,并且仅在整个块传输完成后才中断。
直接内存访问需要一个称为 DMA 控制器 (DMAC) 的特殊硬件,该硬件管理数据传输并仲裁对系统总线的访问。控制器使用源和目标指针(在哪里读取/写入数据)进行编程,使用计数器跟踪已传输的字节数,并设置包括 I/O 和内存类型、中断和 CPU 周期的状态在内的设置。
操作系统使用DMA硬件的方式如下:
| 步骤 | 描述 |
|---|---|
| 1 | 指示设备驱动程序将磁盘数据传输到缓冲区地址X。 |
| 2 | 然后,设备驱动程序指示磁盘控制器将数据传输到缓冲区。 |
| 3 | 磁盘控制器启动DMA传输。 |
| 4 | 磁盘控制器将每个字节发送到DMA控制器。 |
| 5 | DMA控制器将字节传输到缓冲区,增加内存地址,减少计数器C,直到C变为零。 |
| 6 | 当C变为零时,DMA中断CPU以发出传输完成信号。 |
轮询与中断I/O
计算机必须有一种方法来检测任何类型的输入的到达。这可以通过两种方式实现,分别称为轮询和中断。这两种技术都允许处理器处理任何时候可能发生的、与其当前运行的进程无关的事件。
轮询I/O
轮询是I/O设备与处理器通信的最简单方式。周期性地检查设备状态以查看是否到了下一个I/O操作的时间,这个过程称为轮询。I/O设备只需将信息放入状态寄存器中,处理器必须来获取信息。
大多数情况下,设备不需要处理,而当一个设备需要处理时,它必须等到轮询程序下次对其进行询问。这是一种低效的方法,处理器的很多时间都浪费在不必要的轮询上。
将此方法与一位老师不断地一个接一个地询问班上每个学生是否需要帮助进行比较。显然,更有效的方法是学生在需要帮助时通知老师。
中断I/O
处理I/O的另一种方案是中断驱动方法。中断是设备向微处理器发出的需要处理的信号。
当设备需要CPU的注意时,设备控制器会在总线上发出中断信号;当CPU接收到中断时,它会保存其当前状态并使用中断向量(处理各种事件的操作系统例程的地址)调用相应的中断处理程序。处理完中断设备后,CPU继续执行其原始任务,就好像从未中断过一样。
操作系统 - I/O软件
I/O软件通常按以下几层组织:
用户级库 - 为用户程序提供简单的接口来执行输入和输出。例如,stdio是C和C++编程语言提供的库。
内核级模块 - 为设备驱动程序提供与设备控制器交互的接口,以及设备驱动程序使用的与设备无关的I/O模块。
硬件 - 此层包含实际的硬件和硬件控制器,它们与设备驱动程序交互并使硬件运行。
I/O软件设计中的一个关键概念是它应该是与设备无关的,即应该能够编写能够访问任何I/O设备的程序,而无需预先指定设备。例如,将文件作为输入读取的程序应该能够读取软盘、硬盘或CD-ROM上的文件,而无需针对每个不同的设备修改程序。
设备驱动程序
设备驱动程序是可以插入操作系统的软件模块,用于处理特定设备。操作系统借助设备驱动程序来处理所有I/O设备。设备驱动程序封装了与设备相关的代码并实现了标准接口,这样代码就包含了与设备相关的寄存器读/写操作。设备驱动程序通常由设备制造商编写,并随设备一起在CD-ROM上提供。
设备驱动程序执行以下任务:
- 接受来自上层设备无关软件的请求。
- 与设备控制器交互以进行I/O操作并执行必要的错误处理。
- 确保请求成功执行。
设备驱动程序处理请求的方式如下:假设有一个读取块N的请求。如果驱动程序当时空闲,则立即开始执行请求。否则,如果驱动程序正忙于处理其他请求,则将新请求放入挂起请求队列中。
中断处理程序
中断处理程序,也称为中断服务例程或ISR,是操作系统或更具体地说是在设备驱动程序中的一段软件或更具体地说是一个回调函数,其执行由接收中断触发。
当中断发生时,中断程序会执行必要的操作以处理中断,更新数据结构并唤醒正在等待中断发生的进程。
中断机制接受一个地址——一个数字,它从一小组中选择一个特定的中断处理例程/函数。在大多数架构中,此地址是在称为中断向量表的表中存储的偏移量。该向量包含专用中断处理程序的内存地址。
与设备无关的I/O软件
与设备无关的软件的基本功能是执行所有设备通用的I/O功能,并为用户级软件提供统一的接口。虽然很难编写完全与设备无关的软件,但我们可以编写一些所有设备通用的模块。以下是与设备无关的I/O软件的功能列表:
- 设备驱动程序的统一接口
- 设备命名 - 助记符名称映射到主设备号和次设备号
- 设备保护
- 提供与设备无关的块大小
- 缓冲,因为来自设备的数据无法存储在最终目的地。
- 块设备上的存储分配
- 分配和释放专用设备
- 错误报告
用户空间I/O软件
这些是提供更丰富和简化的接口来访问内核功能或最终与设备驱动程序交互的库。大多数用户级I/O软件由库过程组成,一些例外情况,例如后台打印系统,它是在多编程系统中处理专用I/O设备的一种方式。
I/O库(例如,stdio)位于用户空间,以提供与操作系统驻留的与设备无关的I/O软件的接口。例如,putchar()、getchar()、printf()和scanf()是C编程语言中可用的用户级I/O库stdio的示例。
内核I/O子系统
内核I/O子系统负责提供许多与I/O相关的服务。以下是提供的一些服务。
调度 - 内核调度一组I/O请求以确定执行它们的良好顺序。当应用程序发出阻塞I/O系统调用时,请求将被放入该设备的队列中。内核I/O调度程序重新安排队列的顺序以提高整体系统效率和应用程序体验的平均响应时间。
缓冲 - 内核I/O子系统维护一个称为缓冲区的内存区域,该区域在两个设备之间或设备与应用程序操作之间传输数据时存储数据。缓冲是为了应对数据流的生产者和消费者之间的速度不匹配,或者适应具有不同数据传输大小的设备。
缓存 - 内核维护缓存内存,这是一个保存数据副本的快速内存区域。访问缓存副本比访问原始副本更有效。
后台打印和设备预留 - 后台打印是一个缓冲区,用于保存设备(例如打印机)的输出,这些设备无法接受交错的数据流。后台打印系统一次将一个排队的后台打印文件复制到打印机。在某些操作系统中,后台打印由系统守护进程管理。在其他操作系统中,它由内核线程处理。
错误处理 - 使用受保护内存的操作系统可以防止许多类型的硬件和应用程序错误。
操作系统 - 文件系统
文件
文件是记录在辅助存储器(例如磁磁盘、磁带和光盘)上的相关信息的命名集合。一般来说,文件是一系列位、字节、行或记录,其含义由文件的创建者和用户定义。
文件结构
文件结构应符合操作系统可以理解的所需格式。
文件根据其类型具有某种定义的结构。
文本文件是由字符组成的一系列行。
源文件是一系列过程和函数。
目标文件是由字节组成的一系列块,机器可以理解。
当操作系统定义不同的文件结构时,它还包含支持这些文件结构的代码。Unix、MS-DOS支持最少数量的文件结构。
文件类型
文件类型是指操作系统区分不同类型文件(例如文本文件、源文件和二进制文件等)的能力。许多操作系统支持许多类型的文件。像MS-DOS和UNIX这样的操作系统具有以下类型的文件:
普通文件
- 这些文件包含用户信息。
- 它们可能包含文本、数据库或可执行程序。
- 用户可以对这些文件应用各种操作,例如添加、修改、删除甚至删除整个文件。
目录文件
- 这些文件包含文件名列表以及与这些文件相关的其他信息。
特殊文件
- 这些文件也称为设备文件。
- 这些文件代表物理设备,例如磁盘、终端、打印机、网络、磁带驱动器等。
这些文件有两种类型:
字符特殊文件 - 数据逐个字符处理,例如终端或打印机。
块特殊文件 - 数据按块处理,例如磁盘和磁带。
文件访问机制
文件访问机制是指访问文件记录的方式。有几种访问文件的方法:
- 顺序访问
- 直接/随机访问
- 索引顺序访问
顺序访问
顺序访问是指按某种顺序访问记录,即按顺序处理文件中的信息,一次处理一条记录。这种访问方法是最原始的一种。示例:编译器通常以这种方式访问文件。
直接/随机访问
随机访问文件组织提供直接访问记录的功能。
每个记录在文件中都有其自身的地址,借助该地址可以直接访问记录进行读取或写入。
记录在文件内不必按任何顺序排列,也不必在存储介质上的相邻位置。
索引顺序访问
- 此机制建立在顺序访问的基础上。
- 为每个文件创建一个索引,其中包含指向各个块的指针。
- 顺序搜索索引,并使用其指针直接访问文件。
空间分配
文件由操作系统分配磁盘空间。操作系统采用以下三种主要方式为文件分配磁盘空间。
- 连续分配
- 链接分配
- 索引分配
连续分配
- 每个文件在磁盘上占用一个连续的地址空间。
- 分配的磁盘地址按线性顺序排列。
- 易于实现。
- 外部碎片是这种分配技术的重大问题。
链接分配
- 每个文件都包含一个指向磁盘块的链接列表。
- 目录包含指向文件第一个块的链接/指针。
- 没有外部碎片
- 有效地用于顺序访问文件。
- 在直接访问文件中效率低下。
索引分配
- 解决了连续分配和链接分配的问题。
- 创建一个索引块,其中包含所有指向文件的指针。
- 每个文件都有自己的索引块,其中存储文件占用的磁盘空间地址。
- 目录包含文件的索引块地址。
操作系统 - 安全性
安全性是指为计算机系统资源(例如CPU、内存、磁盘、软件程序以及最重要的是存储在计算机系统中的数据/信息)提供保护系统。如果未经授权的用户运行计算机程序,则他/她可能会对计算机或其中存储的数据造成严重损坏。因此,必须保护计算机系统免受未经授权的访问、恶意访问系统内存、病毒、蠕虫等。本章将讨论以下主题。
- 身份验证
- 一次性密码
- 程序威胁
- 系统威胁
- 计算机安全分类
身份验证
身份验证是指识别系统的每个用户并将正在执行的程序与这些用户关联。操作系统的责任是创建一个保护系统,以确保运行特定程序的用户是真实的。操作系统通常使用以下三种方式识别/验证用户:
用户名/密码 - 用户需要输入注册的用户名和密码才能登录到系统。
用户卡/密钥 - 用户需要在读卡器中刷卡,或在操作系统提供的选项中输入密钥生成器生成的密钥才能登录到系统。
用户属性 - 指纹/虹膜/签名 - 用户需要通过操作系统使用的指定输入设备传递其属性才能登录到系统。
一次性密码
一次性密码除了正常的身份验证外,还提供了额外的安全性。在一次性密码系统中,每次用户尝试登录系统时都需要一个唯一的密码。一次性密码一旦使用,就不能再次使用。一次性密码的实现方式多种多样。
随机数 - 为用户提供印有数字及其对应字母的卡片。系统会随机选择一些字母,要求输入对应的数字。
密钥 - 为用户提供可以创建与用户 ID 映射的密钥的硬件设备。系统会要求输入此密钥,该密钥需要在每次登录前生成。
网络密码 - 一些商业应用程序会将一次性密码发送到用户注册的手机/邮箱,需要在登录前输入。
程序威胁
操作系统的进程和内核执行指定的指令任务。如果用户程序使这些进程执行恶意任务,则称为程序威胁。程序威胁的一个常见示例是在计算机中安装的程序,该程序可以通过网络将用户凭据存储并发送给某些黑客。以下是某些众所周知的程序威胁的列表。
特洛伊木马 - 此类程序会窃取用户登录凭据并将它们存储起来,发送给恶意用户,恶意用户随后可以登录到计算机并访问系统资源。
陷阱门 - 如果设计的程序按要求工作,但在其代码中存在安全漏洞,并在用户不知情的情况下执行非法操作,则称其具有陷阱门。
逻辑炸弹 - 逻辑炸弹是指程序仅在满足特定条件时才会出现故障,否则它会像正规程序一样工作。它更难以检测。
病毒 - 正如其名称所示,病毒可以在计算机系统上自我复制。它们非常危险,可以修改/删除用户文件,使系统崩溃。病毒通常是嵌入程序中的少量代码。当用户访问程序时,病毒开始嵌入其他文件/程序中,并可能使系统无法使用。
系统威胁
系统威胁是指滥用系统服务和网络连接以给用户带来麻烦。系统威胁可用于在整个网络上启动程序威胁,称为程序攻击。系统威胁会创建这样的环境:滥用操作系统资源/用户文件。以下是某些众所周知的系统威胁的列表。
蠕虫 - 蠕虫是一个进程,它可以通过将系统资源使用到极端程度来降低系统性能。蠕虫进程会生成多个副本,每个副本都使用系统资源,阻止所有其他进程获得所需的资源。蠕虫进程甚至可以关闭整个网络。
端口扫描 - 端口扫描是一种机制或方法,黑客可以通过它检测系统漏洞以对系统进行攻击。
拒绝服务 - 拒绝服务攻击通常会阻止用户合法使用系统。例如,如果拒绝服务攻击浏览器的内容设置,则用户可能无法使用互联网。
计算机安全分类
根据美国国防部可信计算机系统评估标准,计算机系统有四种安全分类:A、B、C 和 D。这是广泛使用的规范,用于确定和建模系统和安全解决方案的安全性。以下是每种分类的简要说明。
| 序号 | 分类类型和说明 |
|---|---|
| 1 | A 类 最高级别。使用正式的设计规范和验证技术。授予高度的流程安全保证。 |
| 2 | B 类 提供强制保护系统。具有 C2 级系统的所有属性。将敏感性标签附加到每个对象。它有三种类型。
|
| 3 | C 类 使用审核功能提供保护和用户问责制。它有两种类型。
|
| 4 | D 类 最低级别。最低限度的保护。MS-DOS、Window 3.1 属于此类别。 |
操作系统 - Linux
Linux 是流行的 UNIX 操作系统版本之一。它是开源的,因为其源代码是免费提供的。它是免费使用的。Linux 的设计考虑了与 UNIX 的兼容性。其功能列表与 UNIX 非常相似。
Linux 系统组件
Linux 操作系统主要有三个组件
内核 - 内核是 Linux 的核心部分。它负责此操作系统的全部主要活动。它由各种模块组成,并直接与底层硬件交互。内核提供必要的抽象,以向系统或应用程序程序隐藏低级硬件细节。
系统库 - 系统库是特殊的函数或程序,应用程序程序或系统实用程序可以使用它们访问内核的功能。这些库实现了操作系统的绝大部分功能,不需要内核模块的代码访问权限。
系统实用程序 - 系统实用程序负责执行专门的、个体级别的任务。
内核模式与用户模式
内核组件代码在称为内核模式的特权模式下执行,可以完全访问计算机的所有资源。此代码表示单个进程,在单个地址空间中执行,不需要任何上下文切换,因此非常高效和快速。内核运行每个进程并向进程提供系统服务,向进程提供对硬件的受保护访问。
不需要在内核模式下运行的支持代码位于系统库中。用户程序和其他系统程序在用户模式下工作,用户模式无法访问系统硬件和内核代码。用户程序/实用程序使用系统库访问内核函数以获得系统的低级任务。
基本功能
以下是 Linux 操作系统的一些重要功能。
可移植性 - 可移植性意味着软件可以在不同类型的硬件上以相同的方式工作。Linux 内核和应用程序程序支持在其任何类型的硬件平台上安装。
开源 - Linux 源代码是免费提供的,它是一个基于社区的开发项目。多个团队协作以增强 Linux 操作系统的能力,并且它在不断发展。
多用户 - Linux 是一个多用户系统,这意味着多个用户可以同时访问系统资源,如内存/RAM/应用程序程序。
多程序设计 - Linux 是一个多程序设计系统,这意味着多个应用程序可以同时运行。
分层文件系统 - Linux 提供一个标准的文件结构,其中系统文件/用户文件被组织起来。
Shell - Linux 提供一个特殊的解释器程序,可用于执行操作系统的命令。它可用于执行各种类型的操作,调用应用程序程序等。
安全性 - Linux 使用身份验证功能(如密码保护/对特定文件的受控访问/数据加密)来提供用户安全性。
架构
下图显示了 Linux 系统的架构:
Linux 系统的架构由以下几层组成:
硬件层 - 硬件包括所有外围设备(RAM/HDD/CPU 等)。
内核 - 它是操作系统的核心组件,直接与硬件交互,为上层组件提供低级服务。
Shell - 内核的接口,向用户隐藏内核功能的复杂性。Shell 从用户那里获取命令并执行内核的功能。
实用程序 - 提供用户大部分操作系统功能的实用程序。
