操作系统学习笔记-5.1-IO设备
文章目录
- I/O控制器
- I/O 控制器的组成
- I/O 控制器的工作流程
- I/O 控制器的类型
- I/O 控制器的主要功能
- I/O 控制器与操作系统的交互
- DMA 的工作原理
- DMA 传输模式
- DMA 控制器的组成
- 组成
- 内存映像I/O,寄存器独立编址
- IO软件层次
- 用户层 I/O 软件
- 设备独立性软件层
- 设备驱动程序
- 中断处理程序
- 硬件层
- 各层次间的交互流程
- 输入输出应用程序接口
- 输入输出应用程序接口(I/O API)
- 应用层和操作系统层的交互
- 驱动程序接口
- 概述
- 特点
- 驱动程序的接口功能
- 3. I/O API 和驱动程序接口的对比
- 它们之间的协作关系
- 阻塞IO和非阻塞IO
- 1. 阻塞 I/O(Blocking I/O)
- 概述
- 特点
- 2. 非阻塞 I/O(Non-blocking I/O)
- 概述
- 3. 阻塞 I/O 与 非阻塞 I/O 的对比
- Socket
- 1. 什么是 Socket?
- 2. Socket 的基本工作原理
- 3. Socket 的类型
- 5. Socket API 的常见函数
- 5. Socket 的特点与使用场景
- 6. 使用 Socket 的注意事项
I/O控制器
UNIX将外界设备抽象为一种特殊文件。
IO控制器被CPU控制,用来控制设备的机械部件设备。接受和识别CPU发出命令,数据交换,地址识别。
I/O 控制器的组成
I/O 控制器通常由以下部分组成:
- 控制寄存器:用于存储设备的控制信息,比如设备状态、命令等。
- 数据寄存器:存储从设备传输到主机或从主机发送到设备的数据。
- 状态寄存器:指示设备的当前状态,比如是否空闲、忙碌或出现错误。
- 缓冲区:用来暂存数据,缓解设备和 CPU 之间速度不匹配的问题。
I/O 控制器的工作流程
- 数据传输:当需要进行数据传输时,CPU 向 I/O 控制器发送请求,并传递相应的指令或数据。I/O 控制器负责将数据从主存中读取或写入到设备。
- 中断管理:当 I/O 设备完成数据传输或出现错误时,I/O 控制器会向 CPU 发送中断信号,以便 CPU 进行相应处理。
- 缓冲处理:为了提高数据传输效率,I/O 控制器通常会利用缓冲区暂存数据,减少 CPU 等待时间。
I/O 控制器的类型
- 通用 I/O 控制器:用于管理多种不同类型的 I/O 设备,如 USB 控制器、SATA 控制器。
- 专用 I/O 控制器:为特定设备设计,如硬盘控制器、网络控制器、图形控制器等。
- DMA 控制器:直接存储器访问(DMA)控制器,用于在内存和 I/O 设备之间进行数据传输,而不需要 CPU 的持续干预,从而提高数据传输效率。
I/O 控制器的主要功能
- 数据格式转换:将 CPU 可以理解的数据格式转换为设备所需的格式,反之亦然。
- 数据缓冲:通过缓冲区实现数据的暂存,减少 CPU 等待时间。
- 中断处理:在设备完成任务或遇到问题时,向 CPU 发出中断信号。
- 设备管理:监控设备的状态和控制设备的操作,如启动、暂停和停止等。
I/O 控制器与操作系统的交互
-
驱动程序:操作系统通过设备驱动程序与 I/O 控制器进行交互,驱动程序提供了控制器的指令集接口,使操作系统能够与设备进行通信。
-
中断服务程序:当控制器发出中断信号时,操作系统会调用相应的中断服务程序来处理中断。
-
数据传输模式:
-
程序控制 I/O:CPU 主动查询设备的状态,进行数据传输。
-
中断驱动 I/O:设备完成任务后通过中断通知 CPU,从而提高 CPU 的利用率。
-
通道控制模式
-
DMA 模式:控制器负责数据传输,CPU 只在传输开始和结束时进行干预。
DMA(Direct Memory Access,直接内存访问) 是一种计算机系统技术,它允许外部设备(如硬盘、网络适配器、图形卡等)直接与内存进行数据传输,而不需要通过 CPU 逐字节地管理传输过程。这大大提高了数据传输的效率,并释放了 CPU 资源,使其能够处理其他任务。
-
DMA 的工作原理
DMA 控制器是一个专用的硬件模块,负责在 I/O 设备和内存之间进行数据传输,而无需 CPU 的持续参与。DMA 控制器管理着数据传输的启动、数据块的传输、数据传输的结束和中断通知等。
DMA 操作步骤:
- 初始化 DMA 控制器:
- CPU 发送配置命令,向 DMA 控制器提供内存地址、传输方向、传输数据的数量等信息。
- DMA 控制器启动数据传输:
- DMA 控制器接管数据传输任务,与 I/O 设备和内存进行交互。
- 数据传输进行中:
- DMA 控制器在传输数据时,不会占用 CPU,因此 CPU 可以执行其他任务。
- 传输结束:
- 数据传输完成后,DMA 控制器向 CPU 发送中断信号,告知传输已结束。CPU 随后可以检查传输状态或继续处理相关数据。
DMA 传输模式
DMA 控制器支持多种传输模式,每种模式在传输速率和 CPU 使用上有所不同:
- 突发模式(Burst Mode):
- DMA 控制器一次性传输整个数据块,在传输过程中完全占用系统总线。虽然效率高,但会暂停 CPU 的内存访问,可能导致系统响应时间增加。
- 周期偷取模式(Cycle Stealing Mode):
- DMA 控制器在每个传输周期中从 CPU 获取系统总线的使用权,仅传输一小部分数据,然后释放总线供 CPU 使用。此模式平衡了 CPU 和 DMA 的总线访问,但传输速率低于突发模式。
- 透明模式(Transparent Mode):
- DMA 控制器仅在 CPU 不需要总线时进行传输。此模式对 CPU 运行的影响最小,但可能会导致传输速度较慢。
DMA 控制器的组成
DMA 控制器一般包括以下组成部分:
- 地址寄存器:存储内存中数据的起始地址。
- 计数寄存器:记录要传输的数据字节或字数的数量。
- 控制寄存器:存储传输模式、传输方向等配置信息。
- 状态寄存器:记录 DMA 控制器的当前状态,如传输是否完成或是否出现错误。
组成
CPU与控制器接口:链接
IO逻辑:操作
控制器与设备接口:链接。
内存映像I/O,寄存器独立编址
内存映像 I/O(Memory-Mapped I/O)是一种将 I/O 设备的寄存器地址映射到系统的内存地址空间的技术,使 CPU 可以通过标准的内存访问指令对 I/O 设备进行操作。
寄存器独立编址(Port-Mapped I/O 或 Isolated I/O)是一种通过专门的指令和端口访问 I/O 设备的方法,与内存地址空间分开。
IO软件层次
I/O(输入/输出)软件层次是操作系统设计中用来实现对各种 I/O 设备的高效管理和操作的结构化方法。
用户层 I/O 软件
- 描述:这是与用户最接近的一层,是用户程序或应用程序发起 I/O 请求的地方。用户程序通过调用操作系统提供的系统调用或库函数来执行 I/O 操作,例如读取文件或写入数据。
- 任务:
- 调用系统提供的 I/O 库函数,如
printf()
、scanf()
、fopen()
。 - 提供缓冲区,以便于数据的临时存储和管理。
- 调用系统提供的 I/O 库函数,如
设备独立性软件层
- 描述:与设备无关的操作,这一层旨在屏蔽具体设备的细节,使用户层软件可以使用统一的接口访问不同类型的设备。
- 任务:
- 提供与设备无关的 I/O 接口,如文件系统、设备名称的管理等。
- 设备缓冲区管理和数据格式转换。
- 设备保护和错误处理,如确保用户程序不会访问未授权的设备。
- 设备的分配和回收
- 建立逻辑设备名到物理设备名的映射关系,逻辑设备表,包含驱动程序的地址
设备驱动程序
- 描述:设备驱动程序是操作系统内核中专门用于与特定硬件设备交互的软件。它们是设备无关软件和设备控制器之间的桥梁。
- 任务:
- 与硬件设备进行直接交互,发送控制命令和数据。
- 处理来自设备的中断。
- 执行设备初始化和配置。
- 示例:打印机驱动程序负责将打印请求转换成设备可以理解的语言,并将其发送给打印机。
中断处理程序
- 描述:当设备完成请求或需要服务时,它会向 CPU 发送中断信号。中断处理程序会在收到中断信号后执行预定义的操作,确保设备请求被及时响应。
- 任务:
- 保存当前 CPU 状态并转到中断服务程序。
- 执行必要的设备处理操作,如接收数据或清除状态标志。
- 恢复 CPU 状态并返回原始程序。
- 示例:键盘输入的中断处理程序会在用户按下键盘按键时读取输入并将其存储到缓冲区中。
硬件层
- 描述:这是 I/O 软件层次的最底层,由物理硬件设备组成,包括 I/O 设备、控制器和设备寄存器。
- 任务:
- 执行具体的 I/O 操作,如读取数据块、发送数据字节。
- 响应驱动程序发送的命令。
- 示例:硬盘控制器负责将磁盘的物理操作(如旋转和定位磁头)转换成数据传输。
各层次间的交互流程
- 用户层发起 I/O 请求(如读取文件),调用标准库函数。
- 设备无关软件层接收请求并根据设备类型选择合适的设备驱动程序。
- 设备驱动程序与硬件设备控制器交互,向其发送命令。
- 硬件层执行具体的 I/O 操作,并通过中断向系统通知完成情况。
- 中断处理程序捕获中断信号,执行相应的中断服务,通知上层软件传输完成。
- 数据通过设备驱动程序返回到设备无关软件层,再返回给用户层程序。
输入输出应用程序接口
输入输出应用程序接口(I/O API)
- I/O 应用程序接口是由操作系统提供的、供用户程序调用的函数或系统调用,用于执行输入输出操作。它为用户程序屏蔽了底层的复杂细节,使程序员可以使用简单的函数调用实现复杂的 I/O 操作。
应用层和操作系统层的交互
用户程序调用 I/O API,操作系统将调用转发给相关的设备无关软件层,再通过设备驱动程序与硬件设备进行交互。
驱动程序接口
概述
- 驱动程序接口是操作系统与硬件设备之间的桥梁,位于 I/O 软件的设备驱动程序层。驱动程序为操作系统提供了一种标准化的方式与特定的硬件设备进行交互。
特点
- 与硬件紧密结合:驱动程序直接与硬件设备的寄存器和控制器交互,负责将高层请求转化为设备可以理解的命令。
- 设备专用:不同类型的设备通常需要不同的驱动程序。例如,打印机、网卡、硬盘等设备都有各自的驱动程序。
- 中断处理:驱动程序负责处理设备发出的中断信号,确保数据传输完成或报告错误状态。
- 错误处理和状态监控:驱动程序会监控设备的状态,处理异常并将错误报告给操作系统。
驱动程序的接口功能
- 初始化:配置设备的初始状态。
- 数据传输:实现数据的读写操作。
- 中断服务:处理硬件中断信号,确保设备请求得到响应。
- 设备控制:执行设备特定的控制操作,如调节打印机的纸张输出、改变屏幕分辨率等。
3. I/O API 和驱动程序接口的对比
特性 | I/O API 接口 | 驱动程序接口 |
---|---|---|
使用层次 | 用户层和操作系统层之间 | 操作系统与硬件之间 |
抽象程度 | 高,屏蔽底层硬件细节,提供统一调用 | 低,与硬件密切相关,需要处理具体设备的细节 |
目标用户 | 应用程序开发者 | 操作系统开发者、硬件工程师 |
复杂性 | 较低,调用简单,易于使用 | 较高,需要理解设备协议和硬件结构 |
功能范围 | 提供标准的输入输出操作接口,如文件操作 | 提供与设备的直接交互,如发送控制命令、处理中断等 |
设备适应性 | 与设备无关,适用于各种 I/O 操作 | 针对具体设备编写,每个设备通常需要不同的驱动 |
错误处理 | 依赖操作系统提供的错误报告和处理机制 | 负责监控设备状态,处理错误并将状态反馈给上层 |
它们之间的协作关系
- 应用程序通过调用 I/O API 发起 I/O 请求,这些请求由操作系统传递给相应的设备无关软件层。
- 设备无关软件层调用合适的设备驱动程序接口来与硬件设备交互。
- 设备驱动程序执行 I/O 操作,并在操作完成后,通过中断或其他机制通知操作系统。
- 操作系统通过 API 将操作结果返回给应用程序。
阻塞IO和非阻塞IO
阻塞 I/O 和非阻塞 I/O 是操作系统在处理输入输出(I/O)操作时的两种不同模型,主要用于描述应用程序与操作系统进行 I/O 操作时的行为方式。
1. 阻塞 I/O(Blocking I/O)
概述
- 在阻塞 I/O 模型中,当应用程序发起 I/O 请求后,调用进程会被挂起,进入等待状态,直到 I/O 操作完成并返回数据。
- 这种模型简单易用,但在等待期间,应用程序无法执行其他任务,可能导致资源浪费。
特点
- 调用过程:应用程序调用 I/O 函数,等待 I/O 操作完成,调用返回时数据已准备好。
- 使用场景:常用于简单的应用程序或对实时性要求不高的情况。
- 优点:编程简单,逻辑清晰。
- 缺点:等待过程中进程无法执行其他任务,导致应用程序的可扩展性和性能受限。
2. 非阻塞 I/O(Non-blocking I/O)
概述
- 在非阻塞 I/O 模型中,当应用程序发起 I/O 请求时,如果数据未准备好,I/O 函数立即返回,而不会挂起调用进程。程序可以继续执行其他操作或重新尝试读取数据。
3. 阻塞 I/O 与 非阻塞 I/O 的对比
特性 | 阻塞 I/O | 非阻塞 I/O |
---|---|---|
调用行为 | 调用后等待,直到 I/O 操作完成 | 调用后立即返回,数据未就绪时继续其他任务 |
资源利用率 | 低,等待期间资源未被充分利用 | 高,可在等待数据时执行其他操作 |
编程难度 | 较低,代码编写简单 | 较高,需要实现状态检查或轮询 |
适用场景 | 简单任务、对响应性要求不高的程序 | 需要高响应性或实时性的应用程序 |
应用举例 | 文件系统的简单读写操作 | 网络服务器、实时系统 |
Socket
Socket(套接字)是计算机网络编程中的一种通信机制,用于实现不同进程之间的通信,通常用于网络应用程序开发。它抽象了网络通信的底层细节,使得开发者能够通过一致的接口进行数据传输。
1. 什么是 Socket?
- 定义:Socket 是计算机之间或同一台计算机上进程之间进行数据交换的端点。通过 Socket,可以建立一个通信链路,使得数据可以在网络上传输。
- 用途:实现网络通信,如 Web 浏览器访问 Web 服务器、在线聊天应用、FTP 等。
2. Socket 的基本工作原理
Socket 通常使用“客户端-服务器”模型来建立连接并传输数据:
-
服务器端:
- 创建一个 Socket。
- 绑定到一个指定的 IP 地址和端口号。
- 监听连接请求。
- 接收连接并处理通信。
-
客户端:
- 创建一个 Socket。
- 连接到指定的服务器地址和端口号。
- 发送和接收数据。
3. Socket 的类型
Socket 类型决定了其支持的通信协议和方式。常见的有:
- 流式套接字(Stream Socket):
- 使用 TCP(传输控制协议),提供面向连接、可靠的双向通信。
- 适合需要可靠数据传输的应用,如 HTTP、FTP。
- 数据报套接字(Datagram Socket):
- 使用 UDP(用户数据报协议),提供面向无连接、不可靠的数据传输。
- 适合对速度有更高要求、对可靠性要求不高的应用,如视频流、在线游戏。
5. Socket API 的常见函数
函数 | 说明 |
---|---|
socket() | 创建一个套接字对象 |
bind() | 将套接字绑定到指定的 IP 和端口 |
listen() | 开始监听连接请求 |
accept() | 接收客户端连接 |
connect() | 客户端连接到服务器 |
send() / sendall() | 发送数据 |
recv() | 接收数据 |
close() | 关闭套接字 |
5. Socket 的特点与使用场景
- TCP Socket:提供可靠的数据传输,适合需要完整数据交付的应用。
- UDP Socket:轻量、无连接的传输方式,适合实时传输,如语音通话、视频流。
6. 使用 Socket 的注意事项
- 错误处理:在编写 Socket 程序时,应处理网络故障、超时、数据丢失等问题。
- 多线程/异步编程:在处理多个客户端时,通常需要使用多线程或异步编程来提高服务器的并发能力。
- 端口:同一台计算机上的不同应用程序必须使用不同的端口号来避免冲突。