Skip to content

8

用户空间的I/O软件

I/O子系统概述

  • image-20230601092220649

  • 所有高级语言的运行时(runtime) 都提供了执行I/O功能的机制

  • 从高级语言程序中通过I/O函数或I/O 操作符提出I/O请求,到设备响应并完 成I/O请求,涉及到多层次I/O软件和 I/O硬件的协作。
  • 从用户I/O软件切换到内核I/O软件的唯一 办法是“异常”机制:系统调用(自陷)
  • image-20230601092256198
  • 用户软件提出请求的方式:
  • 使用高级语言提供的标准I/O库函数。
    • image-20230601092445095
    • 还封装了缓冲区等机制,效率更高、安全
    • 标准库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函数一样,前者是基于后者实现的。
  • image-20230601093317993
  • image-20230601093701318
    • image-20230604175247773
    • image-20230604175314743
  • image-20230601093712725

文件

  • 所有I/O操作通过读写文件实现,所有外设,包括网络、终端设备,都被看成 文件。
  • 所有物理设备抽象成逻辑上统一的“文件”使得用户程序访问物理设备与访 问真正的磁盘文件完全一致,差别则由内核处理!
  • 通常,将键盘和显示器构成的设备称为终端,对应标准输入、 和标准(错误)输出文件;像磁盘、光盘等外存上的文件则是普通文件。
  • 标准输入和标准(错误)输出文件是ASCII文件。 ° 普通文件可能是文本文件或二进制文件

  • 在读写文件之前要先创建文件/打开文件:

  • 标准输入(fd=0)、标准输出(fd=1)和标准错误(fd=2)三种文件自动打开 ,其他文件须用creat或open函数显式创建或打开后才能读写
  • read/write是不带缓冲的读写:直接从(向)磁盘读(写),没有缓冲

系统级IO

  • image-20230604180112894
  • image-20230604180126097
  • image-20230604180141028

标准库的IO

  • image-20230601095102845
  • 读数据
  • 从文件fp中读数据时,FILE中定义的缓冲区为输入流缓冲(在内存)
    • 文件描述符(File Descriptor):通常用 "fd" 表示,是操作系统为每个打开的文件分配的一个唯一的整数值。文件描述符是对文件或设备的引用,它允许程序通过操作文件描述符来进行读取、写入和其他操作。在UNIX、Linux和类UNIX系统中,文件描述符是非负整数值,通常以 0、1、2 分别表示标准输入、标准输出和标准错误。其他打开的文件会被分配其他非负整数值的文件描述符。
    • 磁盘文件
    • 文件指针(File Pointer):通常用 "fp" 表示,是在高级编程语言用于访问文件的数据结构。文件指针是指向文件的当前位置的指针,用于记录程序在文件中的读写位置。它可以用于确定读取或写入文件的位置,并通过逐步移动指针来操作文件的不同部分。文件指针通常包含有关文件的信息,如文件描述符、当前位置和其他相关的文件状态。
    • 在内存缓冲区
    • 首先要从文件fp中读入1024(缓冲大小BUFSIZ=1024)个字节数据到 缓存,然后,再按需从缓存中读取1个(如getc)或n个(如fread)字 节并返回
  • image-20230601095738468
  • 写数据(flush)
  • 向文件fp中写数据时,FILE中定义的缓冲区为输出流缓冲
  • 先按需不断地向缓存写1个(如putc)或n个(如fwrite)字节,遇到换 行符\n或缓存被写满1024(缓冲大小BUFSIZ=1024)个字节,则将缓 存内容一次写入文件fp中
  • image-20230601095901987
  • image-20230604101743507

文件缓冲区

  • image-20230604102326262
  • image-20230604102434974
  • image-20230604103737256
  • 将文件加载到缓冲区(read)
  • 首先设置缓冲区大小(如果是stderr等不需要缓冲的则将缓冲区大小设置为1,否则1024)
  • 无缓冲区则申请缓冲区(如果读取失败说明EOF)
  • 从文件读取到缓冲区(填满)
  • image-20230604103749038
  • 将缓冲区写到文件(冲刷缓冲区write)
  • 写入到缓冲区可能不会一次填满,只写入部分字节
  • image-20230604104919758
  • 避免直接使用read、write因为不带缓冲区

I/O硬件和软件接口

总线

  • image-20230604111517996
  • 系统总线上传输:数据(指令、操作数、中断号)、地址、 其他控制/状态/定时等信号!

传输方式

  • 总线裁决
  • 早期:总线多是共享传输,需确定哪个设备使用总线
  • 现在:总线多是点对点传输,无需裁决。
  • 总线定时
  • 定义总线事务中的每一步何时开始、何时结束
  • 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端口 的地址。地址线的宽度反映最大的寻址空间
  • image-20230604110405166
处理器(前端)总线
  • image-20230604111744294
  • 接收/发送每秒各2次,即每秒共发送4个包
存储器总线
  • image-20230604112710894
  • 内存条频率表示适配的总线工作频率
I/O总线
  • image-20230604112839159
  • 10=8(有效信息)+2(校验),即相当于10位对应一个有效字节
  • 因为同时收发因此还需要乘以2

模型及设备

  • image-20230604113301757
  • QPI总线主要用于连接多个处理器,以构建高性能的多处理器系统,例如服务器和工作站。它可以提供高带宽和低延迟的通信,使多个处理器能够有效地协同工作。
  • PCI Express则广泛应用于外部设备连接,如显卡、硬盘控制器、音频设备等。它提供了一种高速的、可扩展的接口,使得外部设备能够与计算机系统进行快速的数据交换。
  • image-20230604113744179
  • 主机----北桥---I/O总线----南桥(设备控制器)----电缆----外设
  • image-20230604113938684
IO接口
  • 底层I/O控制软件通过设备控制器来控制外设

  • image-20230604114134778

  • image-20230604114226381
  • 将I/O控制器中CPU能够访问的各类寄存器称为I/O端口 对外设的访问通过向I/O端口发命令、读状态、读/写数据来进行、
  • 数据缓冲控制器也称为数据端口
  • 状态/控制寄存器简称为状态/控制端口
寻址方式
  • 对I/O端口读写就是向I/O设备送出命令或从设备读状态或读/写数据
  • 一个I/O控制器可能会占有多个端口地址
  • I/O端口必须编号后,CPU才能访问它
  • I/O设备的寻址方式就是I/O端口的编号方式
  • image-20230604114811342
  • 统一编址可以同一使用move
  • 独立编址对于不同的组成内部能具有相同的编号

    • 使用指令的操作码来进行区分,即需要独立的输入输出指令
  • image-20230604115148779

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参与

程序查询方式

  • image-20230604120154718
  • image-20230604120315735
  • image-20230604120611183

中断方式

  • 当外设准备好(ready)时,便向CPU发中断请求,CPU响应后, 中止现行程序的执行,转入“中断服务程序”进行输入/出操作,以 实现主机和外设接口之间的数据传送,并启动外设工作。 “中断服 务程序”执行完后,返回原被中止的程序断点处继续执行。此时, 外设和CPU并行工作。
  • image-20230604144547452
  • image-20230604145015112

中断检测

  • image-20230604145027294

中断响应

  • 中断响应是指主机发现外部中断请求,中止现行程序的执 行,到调出中断服务程序这一过程。
  • 条件
  • CPU处于开中断状态
  • 在一条指令执行完(这与异常是不同的)
  • 至少要有一个未被屏蔽的中断请求

中断处理

  • 中断处理是指执行相应中断服务程序的过程
  • 不同的中断源对应的中断服务程序不同
  • 处理过程
  • image-20230604145955842
多重中断
  • 在一个中断处理(即执行中断服务程序)过程中,若又有新的中 断请求发生,而新中断优先级高于正在执行的中断,则应立即中 止正在执行的中断服务程序,转去处理新的中断。这种情况为多 重中断,也称中断嵌套。
  • 中断响应优先级----由查询程序或联排队线路决定的优先权,反 映多个中断同时请求时选择哪个响应。(固定的)
  • 中断处理优先级----由各自的中断屏蔽字来动态设定,反映本中断 与其它中断间的关系。(可以实现优先级管理,比如能否打断现在的中断)
  • image-20230604151231394

  • image-20230604151413476
  • image-20230604151429716
  • 1表示中断引指令

DMA方式

  • 在高速外设和主存间直接传送数据由专门硬件(即:DMA控制器)控制总线进行传输
  • 适用场合
  • 高速设备(如:磁盘、光盘等)
  • 成批数据交换,且数据间间隔时间短,一旦启动,数据连续读写
  • 采用“请求-响应”方式
  • 每当高速设备准备好数据就进行一次“DMA请求”,DMA控制器 接受到DMA请求后,申请总线使用权
  • DMA控制器的总线使用优先级比CPU高
    • 因为 cpu 大部分的访存都在 cache 中进行,因此存储器带宽大部分让给 DMA
    • 根据磁盘的速度,DMA会定时占用总线,这一过程中会阻塞CPU
  • 在DMA控制器控制总线进行数据传送,CPU执行其他程序,DMA传送结束时,要通过“DMA结束中断”告知CPU

  • 过程

  • image-20230604152959160
  • image-20230604153011206
  • image-20230604153027414
  • image-20230604153405250
  • image-20230604153413388

内核空间的I/O软件

  • 内核空间I/O软件实现相应系统调用的服务功能

  • image-20230604154046827

设备无关I/O层

  • image-20230604154323080
  • image-20230604154511017

设备驱动程序

  • image-20230604154600397

中断服务程序

  • image-20230604154609201