8
用户空间的I/O软件¶
I/O子系统概述¶
-
所有高级语言的运行时(runtime) 都提供了执行I/O功能的机制
- 从高级语言程序中通过I/O函数或I/O 操作符提出I/O请求,到设备响应并完 成I/O请求,涉及到多层次I/O软件和 I/O硬件的协作。
- 从用户I/O软件切换到内核I/O软件的唯一 办法是“异常”机制:系统调用(自陷)
- 用户软件提出请求的方式:
- 使用高级语言提供的标准I/O库函数。
- 还封装了缓冲区等机制,效率更高、安全
- 标准库IO
-
使用OS提供的API函数或系统调用。
- 对于Unix或Linux 用户程序,则直接使用像open、read、write、close等系统调用封装函数
- 系统级IO
-
o/i的特性
- 共享性。I/O系统被多个程序共享,须由OS对I/O资源统一 调度管理,以保证用户程序只能访问自己有权访问的那部分I/O 设备,并使系统的吞吐率达到最佳
- 复杂性。I/O设备控制细节复杂,需OS提供专门的驱动程序 进行控制,这样可对用户程序屏蔽设备控制的细节。
-
异步性。不同设备之间速度相差较大,因而,I/O设备与主 机之间的信息交换使用异步的中断I/O方式,中断导致从用户态 向内核态转移,因此必须由OS提供中断服务程序来处理。
-
系统调用和API
- 应用编程接口(API)与系统调用两者在概念上不完全相同,它们都 是系统提供给用户程序使用的编程接口,但前者指的是功能更广泛、 抽象程度更高的函数,后者仅指通过软中断(自陷)指令向内核态发 出特定服务请求的函数。
- 系统调用封装函数是API 函数中的一种。
- 从内核设计者来看,API 和系统调用差别很大。API 在用户态执行, 系统调用封装函数也在用户态执行,但具体服务例程在内核态执行。
- 返回参数为整数值。正数或0表示成功,负数表示出错码
- 标准I/O库函数比系统调用封装函数抽象层次高,后者属于系统级I/O函 数。与系统提供的API函数一样,前者是基于后者实现的。
文件¶
- 所有I/O操作通过读写文件实现,所有外设,包括网络、终端设备,都被看成 文件。
- 所有物理设备抽象成逻辑上统一的“文件”使得用户程序访问物理设备与访 问真正的磁盘文件完全一致,差别则由内核处理!
- 通常,将键盘和显示器构成的设备称为终端,对应标准输入、 和标准(错误)输出文件;像磁盘、光盘等外存上的文件则是普通文件。
-
标准输入和标准(错误)输出文件是ASCII文件。 ° 普通文件可能是文本文件或二进制文件
-
在读写文件之前要先创建文件/打开文件:
- 标准输入(fd=0)、标准输出(fd=1)和标准错误(fd=2)三种文件自动打开 ,其他文件须用creat或open函数显式创建或打开后才能读写
- read/write是不带缓冲的读写:直接从(向)磁盘读(写),没有缓冲
系统级IO¶
标准库的IO¶
- 读数据
- 从文件fp中读数据时,FILE中定义的缓冲区为输入流缓冲(在内存)
- 文件描述符(File Descriptor):通常用 "fd" 表示,是操作系统为每个打开的文件分配的一个唯一的整数值。文件描述符是对文件或设备的引用,它允许程序通过操作文件描述符来进行读取、写入和其他操作。在UNIX、Linux和类UNIX系统中,文件描述符是非负整数值,通常以 0、1、2 分别表示标准输入、标准输出和标准错误。其他打开的文件会被分配其他非负整数值的文件描述符。
- 磁盘文件
- 文件指针(File Pointer):通常用 "fp" 表示,是在高级编程语言中用于访问文件的数据结构。文件指针是指向文件的当前位置的指针,用于记录程序在文件中的读写位置。它可以用于确定读取或写入文件的位置,并通过逐步移动指针来操作文件的不同部分。文件指针通常包含有关文件的信息,如文件描述符、当前位置和其他相关的文件状态。
- 在内存缓冲区
- 首先要从文件fp中读入1024(缓冲大小BUFSIZ=1024)个字节数据到 缓存,然后,再按需从缓存中读取1个(如getc)或n个(如fread)字 节并返回
- 写数据(flush)
- 向文件fp中写数据时,FILE中定义的缓冲区为输出流缓冲
- 先按需不断地向缓存写1个(如putc)或n个(如fwrite)字节,遇到换 行符\n或缓存被写满1024(缓冲大小BUFSIZ=1024)个字节,则将缓 存内容一次写入文件fp中
文件缓冲区¶
- 将文件加载到缓冲区(read)
- 首先设置缓冲区大小(如果是stderr等不需要缓冲的则将缓冲区大小设置为1,否则1024)
- 无缓冲区则申请缓冲区(如果读取失败说明EOF)
- 从文件读取到缓冲区(填满)
- 将缓冲区写到文件(冲刷缓冲区write)
- 写入到缓冲区可能不会一次填满,只写入部分字节
- 避免直接使用read、write因为不带缓冲区
I/O硬件和软件接口¶
总线¶
- 系统总线上传输:数据(指令、操作数、中断号)、地址、 其他控制/状态/定时等信号!
传输方式¶
- 总线裁决
- 早期:总线多是共享传输,需确定哪个设备使用总线
- 现在:总线多是点对点传输,无需裁决。
- 总线定时
- 定义总线事务中的每一步何时开始、何时结束
- Synchronous (同步):用时钟信号来确定每个步骤
- Asynchronous(异步):用握手信号来定时,前一个信号结束就是下一 个信号的开始
- 半同步:结合使用时钟信号和握手信号来定时
- 并行/串行传
- 并行传输:一个方向同时传输多位数据信号,故位与位需同步,慢!
- 串行传输:一个方向只传输一位数据信号,无需在位之间同步,快!
- 现在总线设计的趋势是:点对点、异步、串行
- 传送方式
- 非突发传送:每个总线事务都传送地址,一个地址对应一次数据传送
- 突发(Burst)传送:即成块数据传送。突发传送总线事务中,先传送一 个地址,后传送多次数据,后续数据的地址默认为前面地址自动增量
性能指标¶
- 总线宽度
- 总线中数据线的条数,决定了每次能同时传输的信息位数
- 总线工作频率
- 每秒传送次数(MT/s(MHz)或GT/s)。早期的总线通常一个时钟传送一次数据 ,此时,工作频率等于总线时钟频率;现在总线一个时钟周期可传送2次或 4次数据,因此,工作频率是时钟频率的2倍或4倍
- MT/s实际上等于时钟周期内数据传输次数乘以MHz,但有时并不区分
- MT/s表示的是每秒的传输次数(双向存储不重复计入)
- 总线带宽
- 总线的最大数据传输率(一秒钟内传输的数据量)
- 总线带宽计算公式:B=W×F/N
- W-总线宽度;F-总线时钟频率;N-完成一次数据传送所用时钟周期数 F/N实际上就是总线工作频率
分类¶
- 系统总线通常由一组控制线、一组数据线和一组地址线构成。也有些总线没有单独 的地址线,地址信息通过数据线来传送,这种情况称为数据/地址复用。
- 数据线(Data Bus):承载在源和目部件之间传输的信息。数据线的宽度反映 一次能传送的数据的位数。(区分指令和控制信号,指令是属于数据的)
- 地址线(Address Bus):给出源数据或目的数据所在的主存单元或I/O端口 的地址。地址线的宽度反映最大的寻址空间
处理器(前端)总线¶
- 接收/发送每秒各2次,即每秒共发送4个包
存储器总线¶
- 内存条频率表示适配的总线工作频率
I/O总线¶
- 10=8(有效信息)+2(校验),即相当于10位对应一个有效字节
- 因为同时收发因此还需要乘以2
模型及设备¶
- QPI总线主要用于连接多个处理器,以构建高性能的多处理器系统,例如服务器和工作站。它可以提供高带宽和低延迟的通信,使多个处理器能够有效地协同工作。
- PCI Express则广泛应用于外部设备连接,如显卡、硬盘控制器、音频设备等。它提供了一种高速的、可扩展的接口,使得外部设备能够与计算机系统进行快速的数据交换。
- 主机----北桥---I/O总线----南桥(设备控制器)----电缆----外设
IO接口¶
-
底层I/O控制软件通过设备控制器来控制外设
- 将I/O控制器中CPU能够访问的各类寄存器称为I/O端口 对外设的访问通过向I/O端口发命令、读状态、读/写数据来进行、
- 数据缓冲控制器也称为数据端口
- 状态/控制寄存器简称为状态/控制端口
寻址方式¶
- 对I/O端口读写就是向I/O设备送出命令或从设备读状态或读/写数据
- 一个I/O控制器可能会占有多个端口地址
- I/O端口必须编号后,CPU才能访问它
- I/O设备的寻址方式就是I/O端口的编号方式
- 统一编址可以同一使用move
-
独立编址对于不同的组成内部能具有相同的编号
- 使用指令的操作码来进行区分,即需要独立的输入输出指令
I/O控制方式¶
- 三种基本I/O方式
- 程序直接控制方式(最简单的I/O方式)
- 无条件传送:对简单外设定时(同步)进行数据传送
- 条件传送:CPU主动查询(I/O的状态),也称程序查询或轮询(Polling)方式
- I/O Interrupt (中断I/O方式): 几乎所有系统都支持中断I/O方式
- 若一个I/O设备需要CPU干预,它就通过中断请求通知CPU
- CPU中止当前程序的执行,调出OS(中断处理程序)来执行
- 处理结束后,再返回到被中止的程序继续执行
- Direct Memory Access (DMA方式): 磁盘等高速外设所用的方式
- 磁盘等高速外设成批地直接和主存进行数据交换
- 需要专门的DMA控制器控制总线,完成数据传送
- 数据传送过程无需CPU参与
程序查询方式¶
中断方式¶
- 当外设准备好(ready)时,便向CPU发中断请求,CPU响应后, 中止现行程序的执行,转入“中断服务程序”进行输入/出操作,以 实现主机和外设接口之间的数据传送,并启动外设工作。 “中断服 务程序”执行完后,返回原被中止的程序断点处继续执行。此时, 外设和CPU并行工作。
中断检测¶
中断响应¶
- 中断响应是指主机发现外部中断请求,中止现行程序的执 行,到调出中断服务程序这一过程。
- 条件
- CPU处于开中断状态
- 在一条指令执行完(这与异常是不同的)
- 至少要有一个未被屏蔽的中断请求
中断处理¶
- 中断处理是指执行相应中断服务程序的过程
- 不同的中断源对应的中断服务程序不同
- 处理过程
多重中断¶
- 在一个中断处理(即执行中断服务程序)过程中,若又有新的中 断请求发生,而新中断优先级高于正在执行的中断,则应立即中 止正在执行的中断服务程序,转去处理新的中断。这种情况为多 重中断,也称中断嵌套。
- 中断响应优先级----由查询程序或硬联排队线路决定的优先权,反 映多个中断同时请求时选择哪个响应。(固定的)
- 中断处理优先级----由各自的中断屏蔽字来动态设定,反映本中断 与其它中断间的关系。(可以实现优先级管理,比如能否打断现在的中断)
例¶
- 1表示中断引指令
DMA方式¶
- 在高速外设和主存间直接传送数据由专门硬件(即:DMA控制器)控制总线进行传输
- 适用场合
- 高速设备(如:磁盘、光盘等)
- 成批数据交换,且数据间间隔时间短,一旦启动,数据连续读写
- 采用“请求-响应”方式
- 每当高速设备准备好数据就进行一次“DMA请求”,DMA控制器 接受到DMA请求后,申请总线使用权
- DMA控制器的总线使用优先级比CPU高
- 因为 cpu 大部分的访存都在 cache 中进行,因此存储器带宽大部分让给 DMA
- 根据磁盘的速度,DMA会定时占用总线,这一过程中会阻塞CPU
-
在DMA控制器控制总线进行数据传送时,CPU执行其他程序,DMA传送结束时,要通过“DMA结束中断”告知CPU
-
过程
- 例
内核空间的I/O软件¶
-
内核空间I/O软件实现相应系统调用的服务功能