文章目录
假脱机技术
假脱机技术(Spooling)是一种用于管理输入/输出操作的技术,常用于缓解输入/输出设备与处理器之间速度差异的问题。本质上是一种队列管理技术,主要应用于打印作业、磁盘读写等场景。
1. 假脱机技术的基本概念
- 定义:假脱机技术通过将输入/输出请求缓存在中间存储区域(如硬盘或内存)中,实现数据的排队处理,使得计算机的处理器不必等待输入/输出设备完成任务即可继续处理其他任务。
2. 工作原理
假脱机技术的工作过程包括以下几个步骤:
- 数据接收:应用程序将需要处理的数据发送给假脱机系统。
- 缓存存储:假脱机系统将数据临时存放在缓冲区中,通常在硬盘或内存中进行缓存。
- 资源调度:假脱机系统按照一定的调度策略将缓冲区中的数据传送给相应的输出设备(如打印机)。
- 输出设备处理:输出设备从缓冲区中读取数据并进行实际的输出操作(如打印文档)。
- 任务完成:输出任务完成后,假脱机系统将该任务从缓冲区中移除。
4. 典型应用场景
- 打印作业:在办公环境中,多个用户可以将文档发送至同一台打印机进行打印。打印机通过假脱机技术处理排队任务,确保每个任务按顺序打印。
打印机一定是独占式设备,用spooling实现共享。在磁盘输出井重申请空闲缓冲区,申请空白的打印请i去表,将用户的大一请求填入表中,将表挂到假脱机的文件队列上。 - 磁盘读写:假脱机技术可以用在磁盘 I/O 操作中,提升磁盘读写效率,使得处理器不必因等待磁盘操作而停滞。
- 批处理系统:在批量数据处理系统中,假脱机技术可以用来暂存需要处理的数据,再按顺序处理。
设备的分配和回收
设备分配方式
- 独占设备:一次只能被一个进程使用。例如,打印机在打印时只能由一个进程占用。
- 共享设备:多个进程可以同时访问,如硬盘驱动器、网络接口等。
- 虚拟设备:通过软件和硬件的协作,将一个物理设备虚拟化为多个逻辑设备,以支持并发访问。
SPOOLING技术将独占设备虚拟成共享设备。
安全分配模式和不安全分配模式
1. 安全分配模式
安全分配模式是指系统在分配资源时,能够保证当前和未来状态都不会进入死锁状态。此时,系统能找到至少一种资源分配顺序,使得每个进程都能顺利完成而不会因等待资源而陷入死锁。
2. 不安全分配模式
不安全分配模式是指系统在分配资源后,可能无法保证不进入死锁状态。即使系统在某个时间点没有死锁,未来的资源请求可能会使系统陷入死锁。
3. 安全与不安全模式的区别
特性 | 安全分配模式 | 不安全分配模式 |
---|---|---|
死锁风险 | 无死锁风险 | 存在潜在死锁风险 |
安全序列 | 存在 | 不存在 |
资源分配条件 | 系统分配资源前确保安全 | 可能在分配后无法保证安全 |
实施策略 | 使用如银行家算法等死锁预防策略 | 需要更复杂的死锁检测和恢复机制 |
分配策略
- 静态分配:在进程运行之前,设备就已经分配给进程,适合任务执行过程中一直需要使用设备的应用。例如,某些实时系统中会提前为关键任务分配设备。注意不会发生死锁。
- 动态分配:在进程运行过程中,根据需要动态分配设备。提高了资源利用率,但需要更复杂的管理。
- 按需分配:设备在被请求时分配,释放后其他进程才能使用。
1.3 分配方法
- 直接分配:操作系统直接分配设备给请求的进程。
- 队列分配:当多个进程请求同一设备时,使用队列来管理设备请求。例如,打印机使用打印队列来处理多个打印任务。
- 资源分配图:使用图形结构管理资源分配和避免死锁,其中节点表示进程和设备,边表示资源请求和分配。
数据结构
设备控制表 (DCT)
设备控制表(Device Control Table,DCT)是操作系统用于管理和跟踪系统中所有硬件设备的信息结构。它保存了有关设备状态、当前使用情况和分配情况等关键信息,以便操作系统能够有效地控制和分配设备。每个设备都有一个或多个设备控制表,用于管理其状态和操作。
设备控制表的组成
设备控制表通常包含以下几个关键字段:
字段名称 | 描述 |
---|---|
设备标识符 | 唯一标识设备的编号或名称。 |
设备状态 | 设备的当前状态,如空闲、忙碌或故障。 |
分配信息 | 记录设备是否被分配,分配给哪个进程或任务。 |
控制信息 | 控制设备的操作信息,如设备控制寄存器的地址。 |
数据缓冲区 | 用于临时存储设备输入/输出的数据。 |
I/O 请求队列 | 等待使用设备的进程或任务的队列。 |
错误信息 | 记录设备操作中的错误状态或错误代码。 |
设备驱动程序指针 | 指向与设备相关的驱动程序,用于控制设备操作。 |
控制器控制表(COCT)
控制器控制表(Controller Control Table)是操作系统用于管理和跟踪计算机系统中硬件控制器(如磁盘控制器、网络控制器等)相关信息的数据结构。
控制器控制表的组成
控制器控制表通常包含以下字段:
字段名称 | 描述 |
---|---|
控制器标识符 | 唯一标识硬件控制器的编号或名称。 |
设备列表 | 由该控制器管理的设备列表(指向相关设备控制表的指针)。 |
控制器状态 | 当前控制器的状态,如空闲、忙碌、错误等。 |
I/O 操作队列 | 当前控制器正在处理或等待处理的 I/O 请求队列。 |
寄存器信息 | 与控制器交互的寄存器地址或内存映射 I/O 信息。 |
当前操作 | 控制器正在执行的具体任务描述,如读取、写入等。 |
错误标志和处理信息 | 控制器错误状态的标志和错误处理机制。 |
驱动程序指针 | 指向与控制器关联的设备驱动程序,用于控制具体的操作。 |
2. 控制器控制表的作用
- 管理多设备:控制器控制表用于管理连接到同一控制器的多个设备,协调和调度它们的操作。
- 简化 I/O 操作:通过控制器控制表,操作系统可以高效地调度和控制多个设备的输入/输出操作。
- 错误检测与恢复:通过记录和监控控制器状态及错误标志,操作系统能够识别并处理硬件故障。
- 资源分配:提供当前控制器的状态和分配情况,帮助操作系统合理分配和使用控制器资源。
通道控制表(CHCT)
1. 通道控制表的组成
通道控制表通常包含以下字段:
字段名称 | 描述 |
---|---|
通道标识符 | 唯一标识通道的编号或名称。 |
通道状态 | 通道的当前状态,如空闲、忙碌、传输中或出现故障。 |
设备列表 | 与该通道相关联的设备列表(指向设备控制表的指针)。 |
当前任务信息 | 当前通道正在执行的任务信息,如读取或写入的任务描述。 |
传输缓冲区 | 数据传输过程中使用的缓冲区信息。 |
命令链指针 | 指向包含 I/O 命令的命令链表,用于管理多步骤的 I/O 操作。 |
优先级和调度信息 | 表示通道的调度优先级,以便在多个 I/O 请求间进行调度。 |
错误信息和标志 | 记录和标识与通道操作有关的错误状态和处理标志。 |
系统设备表(SDT)
系统设备表(System Device Table, SDT)是操作系统中用于管理和跟踪系统内所有设备的信息的数据结构。它帮助操作系统识别和调度设备,确保硬件资源的有效使用和分配。
系统设备表的组成
系统设备表通常包括以下信息:
字段名称 | 描述 |
---|---|
设备标识符 | 唯一标识设备的编号或名称,方便操作系统识别设备。 |
设备类型 | 指定设备的类型,如存储设备、输入设备、输出设备、网络设备等。 |
设备状态 | 设备的当前状态,如空闲、忙碌、在线或离线。 |
设备地址 | 设备的物理地址或 I/O 端口地址,便于系统与设备进行交互。 |
驱动程序指针 | 指向与设备关联的驱动程序,操作系统通过该指针调用设备驱动程序。 |
分配信息 | 当前设备的使用情况,如是否正在被分配、分配给哪个进程等。 |
错误状态 | 记录设备操作中的错误信息,以便于故障诊断和处理。 |
系统设备表、设备控制表、通道控制表和控制器控制表对比
比较维度 | 系统设备表 (SDT) | 设备控制表 (DCT) | 通道控制表 (CCT) | 控制器控制表 (CTL) |
---|---|---|---|---|
作用 | 跟踪和管理系统中所有设备的全局信息 | 记录单个设备的详细信息 | 管理和调度与通道相关的设备和数据传输 | 管理和控制设备控制器的信息及操作 |
信息字段 | 设备标识符、设备类型、状态、地址、驱动程序指针等 | 设备状态、错误信息、使用历史、I/O 操作细节 | 通道标识符、设备列表、数据传输状态 | 控制器标识符、连接的设备信息、操作模式 |
作用范围 | 系统级别,概括整个系统内的设备管理 | 单个设备的详细级别,提供设备特定信息 | 多个设备通过同一通道时的管理 | 控制器下的设备管理和控制 |
主要用途 | 设备资源分配、状态跟踪、调度 | 管理设备使用、操作细节和错误诊断 | 数据传输路径管理,协调设备的使用 | 控制器之间和设备的交互,提供低级操作控制 |
更新频率 | 随设备的分配、释放或状态变化而更新 | 设备操作、故障或状态变化时更新 | 通道操作或传输任务变化时更新 | 控制器执行任务或状态变化时更新 |
示例应用 | 检查设备是否空闲、分配设备资源 | 读取设备特定的错误状态或操作记录 | 管理一条数据总线上传输的多个设备 | 管理与磁盘控制器或网络适配器相关的操作 |
与其他结构的关系 | 连接 PCB、DCT 等结构以跟踪设备的全局使用情况 | 与系统设备表和进程 PCB 关联,用于具体设备操作管理 | 与系统设备表结合,以协调设备访问 | 与设备控制表结合以管理具体设备和控制器间的交互 |
总结
用于设备分配的数据结构有系统设备表(SDT)、设备控制表(DCT)、控制器控制表(COCT)和通道控制表(CHCT)。
- 系统设备表 (SDT) 整个系统中只有一张,提供了所有设备的概述和资源管理信息。
- 设备控制表 (DCT) 每个设备有一张,包含设备的详细信息,便于进行特定设备的操作和管理。
- 通道控制表 (COCT) 每个控制器有一张,主要用于数据通道的调度和管理,适用于涉及多个设备的传输场景。
- 控制器控制表 (CHTL) 系统为每个通道配置一张 CHCT,用于与具体控制器打交道,协调设备的低级操作和控制。
SDT中每个表目有一个指向 DCT的指针,DCT中的每个表目有一个指向 COCT的指针,COCT 中有一个 CHCT指针,CHCT中有一个 COCT指针。
设备分配
硬件资源以满足请求的流程。这个过程确保系统资源能够被合理使用,防止资源冲突,并提供必要的同步机制以实现资源共享。
设备分配过程的基本步骤
设备分配过程一般分为以下几个步骤:
步骤 | 描述 |
---|---|
1. 请求设备 | 进程通过系统调用向操作系统请求使用某个设备。 |
2. 检查设备表 | 操作系统查询系统设备表,检查该设备是否存在以及其当前状态(如是否可用或正在使用中)。 |
3. 检查权限 | 操作系统验证进程是否有权使用该设备,以确保设备访问权限符合安全和权限要求。 |
4. 分配设备 | 如果设备是空闲且权限验证通过,操作系统将设备分配给请求的进程,并更新设备状态为“忙碌”。 |
5. 更新信息 | 更新系统设备表中的分配信息,记录设备已被分配给哪个进程以及其状态变更。 |
6. 通知进程 | 操作系统将设备分配结果通知请求的进程,使其可以继续执行并访问该设备。 |
7. 使用设备 | 进程使用分配到的设备进行 I/O 操作,完成后通过系统调用释放设备。 |
8. 设备释放 | 操作系统收到设备释放请求后,将设备状态更新为“空闲”,从而允许其他进程请求使用该设备。 |
2. 设备分配的策略
设备分配可以采用不同的策略,以便提高系统的性能和资源利用率。常见的策略包括:
- 固定分配:为每个进程预先分配特定的设备,该设备只供该进程使用。此方法确保了稳定的设备访问,但灵活性较低。
- 动态分配:设备根据当前的请求情况进行动态分配。此方法提高了资源的利用率,但需要更复杂的管理和调度。
- 优先级分配:根据进程的优先级,操作系统可以优先将设备分配给高优先级的进程,以保障关键任务的执行。
缓冲区管理
缓冲区在计算机系统中用于临时存储数据,尤其是输入和输出操作的过渡数据。不同类型的缓冲区机制有助于提高程序的性能和响应速度。非空不能写,非满不能读。
单缓冲 (Single Buffer)
单缓冲是最简单的缓冲区机制。只有一个缓冲区用于存储数据。在数据传输过程中,程序需要等待数据完全处理完后才能继续执行下一个操作。因为只有一个缓冲区,所以在读写操作中会发生阻塞。工作区满,缓冲区空,就是工作时间爱。
优缺点:
- 优点:实现简单,开销较小。
- 缺点:效率较低,因为每次操作都需要等待当前缓冲区的数据处理完。只能单向传输
双缓冲 (Double Buffer)
双缓冲使用两个缓冲区来进行数据存储。在一个缓冲区处理数据的同时,另一个缓冲区用于存储新的输入数据。当一个缓冲区完成处理时,另一个缓冲区的数据被立刻加载并处理,从而减少了等待时间,提高了效率。
优缺点:
- 优点:避免了单缓冲的阻塞,提高了数据处理效率。
- 缺点:需要更多的内存资源和管理开销。
循环缓冲 (Circular Buffer)
循环缓冲(又称环形缓冲区)使用一个固定大小的缓冲区,读取指针和写入指针在缓冲区中循环移动。当缓冲区满时,写入指针会回绕到缓冲区的开头。如果缓冲区的内容被读取,读取指针会前移。它适用于流式数据的处理,例如音频、视频数据流等。
优缺点:
- 优点:有效利用固定大小的内存资源,避免了内存溢出和浪费。
- 缺点:需要管理读写指针,且在缓冲区满或空时的处理需要特别注意。
缓冲池 (Buffer Pool)
缓冲池是一组缓冲区的集合,用于存储不同大小的缓冲区,可以根据需要动态分配。这种机制通常用于数据库或大规模数据处理场景中,可以根据数据大小和访问模式优化缓冲区的使用。
优缺点:
- 优点:缓冲池能够高效管理多个缓冲区,适用于需要动态调整缓冲区大小和频繁读取写入数据的场景。
- 缺点:管理复杂,可能带来较大的系统开销。
对比表
特性 | 单缓冲 | 双缓冲 | 循环缓冲 | 缓冲池 |
---|---|---|---|---|
内存使用 | 最小 | 较大 | 固定大小 | 动态分配,根据需求 |
效率 | 低 | 高 | 高,适合流式数据 | 高,根据数据访问模式 |
实现复杂度 | 简单 | 较复杂 | 中等 | 高 |
阻塞 | 存在阻塞 | 无阻塞 | 无阻塞,循环读取 | 无阻塞,动态管理 |
适用场景 | 简单应用 | 数据处理较快的应用 | 流式数据处理(音视频) | 大规模数据处理,数据库 |