操作系统·第六章 设备管理自测题:SPOOLing+设备独立性+磁盘调度算法(含超详细解析)
本文摘要:本文围绕操作系统设备管理展开,主要包括设备分类(独占/共享/虚拟设备)、设备分配技术(独占/共享/虚拟分配)及常用算法(FCFS/SSTF/SCAN等)。重点解析了SPOOLing技术如何通过输入/输出井将独占设备虚拟化为共享设备,提高利用率。详细介绍了设备驱动程序的功能与位置、缓冲技术的作用与设置原则,以及I/O请求处理的完整流程。最后通过磁盘调度实例(FCFS/SSTF/SCAN算法
第六章 设备管理 自测习题
一、单项选择题
1.下列设备中,不属于独占设备的是( B )。
A. 打印机
B. 磁盘
C. 终端
D. 磁带
2.通过硬件和软件的功能扩充,把原来独占的设备改造成为能为若干用户共享的设备,这种设备称为( D )设备。
A. 存储
B. 块
C. 共享
D. 虚拟
解析:
通过硬件和软件的辅助,将原本只能独占使用的物理设备(如打印机)改造为可供多个用户逻辑上共享的设备,这种技术称为虚拟设备技术,得到的设备称为虚拟设备。典型的例子是通过SPOOLing(假脱机)技术将一台打印机变为多用户可以逻辑上同时使用的共享打印机。
A 存储(强调存放数据)
B 块(按块传输的设备类型)
C 共享(描述属性,但不是这种改造后的专用术语)
D 虚拟(正确)
3.在操作系统中,用户在使用I/O设备时,通常采用( B )。
A. 设备的绝对号
B. 设备的相对号
C. 虚拟设备号
D. 设备名
解析:
设备的绝对号:系统为每个物理设备分配的唯一编号(如 0 号磁盘、1 号打印机)。用户若直接使用绝对号,程序就无法在不同配置的机器上运行。
设备的相对号:用户在编程时使用的一种“逻辑设备编号”,由系统在程序运行时根据当前的“设备分配表”将相对号映射为绝对号。例如,程序中写“使用设备相对号 1”,系统可能把它映射到实际的打印机或磁盘。
这种设计是实现设备独立性的一种具体手段。用户不关心物理设备具体是哪个,只需指出“我要用第几个 I/O 设备”即可。
4.通道是一种( C )。
A. I/O端口
B. 数据通道
C. I/O专用处理机
D. 软件工具
解析:
通道(Channel)是一个专门用于输入/输出操作的硬件处理器,它拥有自己的指令系统,能够在 CPU 的授权下独立控制 I/O 设备与内存之间的数据传输,而不需要 CPU 逐条指令干预。通道可以并行执行通道程序,从而提高 CPU 与 I/O 设备之间的并行度。
5.CPU启动通道后,设备的控制工作由( C )。
A. CPU执行程序来控制
B. CPU执行通道程序来控制
C. 通道独立执行预先编好的通道程序来控制
D. 通道执行用户程序来控制
6.用户编制的程序与实际使用的物理设备无关是由(D )功能实现的。
A. 设备分配
B. 设备驱动
C. 虚拟设备
D. 设备独立性
解析:
设备独立性(也称设备无关性)是指用户编程时使用逻辑设备名(如 /dev/printer),而不直接指定物理设备(如 COM1)。操作系统通过逻辑设备名到物理设备名的映射,在程序实际运行时再分配具体的物理设备。这使得用户程序与具体物理设备解耦,更换或升级设备时无需修改用户程序。
A 设备分配(负责将物理设备分给进程,但不提供独立性)
B 设备驱动(处理具体硬件的 I/O 指令,与设备紧密相关)
C 虚拟设备(通过软件将独占设备变为共享设备,与独立性有交集但不是直接实现独立性的核心)
D 设备独立性(正确)
7.下列描述中,不是设备管理的功能的是( C )。
A. 实现缓冲区管理
B. 进行设备分配
C. 实现中断处理
D. 完成I/O操作
解析:
设备管理的主要功能包括:缓冲区管理、设备分配、设备驱动、I/O 控制、设备独立性、虚拟设备(SPOOLing) 等。
A 实现缓冲区管理:是设备管理功能(用于缓和 CPU 与 I/O 设备速度不匹配)。
B 进行设备分配:是设备管理核心功能之一(根据进程请求分配设备)。
C 实现中断处理:虽然中断处理与 I/O 完成有关,但中断处理属于操作系统内核的更底层机制(中断向量、中断服务程序),不属于设备管理模块的专属功能。
D 完成 I/O 操作:通过设备驱动程序执行 I/O 指令,是设备管理的目标。
8.下列不属于设备分配技术的是(D )。
A. 虚拟分配技术
B. 独占分配技术
C. 共享分配技术
D. 通道分配技术
解析:
设备分配技术主要根据设备的物理特性(是否可共享、是否可虚拟)分为三类:
A. 虚拟分配技术:通过 SPOOLing 技术将独占设备改造为逻辑上共享的设备,属于设备分配的一种方式。
B. 独占分配技术:将设备一次分配给一个进程,使用期间由该进程独占(如打印机)。
C. 共享分配技术:将设备同时分配给多个进程,各进程可以交替使用(如磁盘)。
D. 通道分配技术:通道本身是 I/O 处理机,用于控制 I/O 传输,不属于“设备分配”分类中的一种分配技术,而是 I/O 控制方式的一部分。
9.采用SPOOLing技术的目的是( A )。
A. 提高独占设备的利用率
B. 提高主机效率
C. 减轻用户编程负担
D. 提高程序的运行速度
解析:
SPOOLing(假脱机)技术通过在磁盘上设置输入井和输出井,将独占设备(如打印机)改造为可供多个用户逻辑上共享的设备。多个进程可以将输出数据写入输出井,再由一个专门的守护进程(如打印守护进程)实际驱动物理设备输出。
这样一来,独占设备不再被单个进程长时间占用,而是被多个进程“时分共享”,从而显著提高了独占设备的利用率。
10.SPOOLing技术可以实现设备的( C )分配。
A. 独占
B. 共享
C. 虚拟
D. 物理
解析:
SPOOLing 技术通过磁盘缓冲区将独占设备(如打印机)改造成多个用户可以逻辑上同时访问的设备。这种改造后的设备被称为虚拟设备,而 SPOOLing 实现的是设备的虚拟分配——即用户感觉自己在独享设备,实际上是通过共享物理设备+磁盘空间实现的逻辑分配。
在部分教材和考试题目中,术语使用存在细微差别:
共享分配:指物理设备本身具备同时服务多进程的能力(如磁盘)。
虚拟分配:指通过软件将独占设备模拟成共享设备,SPOOLing 正是典型例子。
因此,这道题若强调“SPOOLing 技术实现的是”,很多题库的标准答案为 虚拟分配。
11.设备的打开、关闭、读、写等操作是由( D )完成的。
A. 用户程序
B. 编译程序
C. 设备分配程序
D. 设备驱动程序
解析:
设备的打开、关闭、读、写等具体 I/O 操作是由设备驱动程序完成的。设备驱动程序是操作系统内核中与具体硬件交互的模块,它接受上层(如文件系统或用户程序)发出的抽象 I/O 请求,将其转换为设备特定的命令序列(如向设备寄存器写入命令、读取状态、传输数据)。
12.下列关于设备驱动程序的描述,错误的是( C )。
A. 设备驱动程序应可以动态装卸
B. 设备驱动程序往往由生产设备的厂家提供
C. 设备驱动程序可使用系统调用
D. 设备驱动程序可实现请求I/O进程与设备控制器之间的通信
解析:
A 正确:现代操作系统(如 Linux、Windows)支持设备驱动程序动态加载和卸载(如 insmod、rmmod),无需重启系统。
B 正确:设备驱动程序通常由设备生产厂家提供,因为厂家最了解硬件的控制方式和寄存器细节。
C 错误:设备驱动程序本身运行在内核态,不能调用系统调用(系统调用是用户态程序进入内核的接口)。驱动程序直接调用内核函数(如内存分配、中断注册),而不是通过 syscall 方式。
D 正确:驱动程序确实负责实现请求 I/O 的进程与设备控制器之间的通信,将上层 I/O 请求转换为设备控制器能理解的命令。
13.引入缓冲技术的主要目的是( C )。
A. 改善用户编程环境
B. 提高CPU的处理速度
C. 提高CPU与设备之间的并行程度
D. 降低计算机的硬件成本
14.CPU处理数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用( C )。
A. 并行技术
B. 通道技术
C. 缓冲技术
D. 虚存技术
15.下列缓冲技术中,对于一个具有信息的输入和输出速率相差不大的I/O系统比较有效的是( A )。
A. 双缓冲技术
B. 环形缓冲技术
C. 多缓冲技术
D. 单缓冲技术
解析:
双缓冲技术的核心是在内存中设置两个缓冲区,当一个缓冲区中的数据正在被处理(或输出)时,另一个缓冲区可以同时用于输入。这种机制特别适用于输入和输出速率相差不大的场景,因为它能平衡两侧的速度差异,减少等待时间。
B 环形缓冲技术:适用于输入/输出速率波动较大、需要多块缓冲区的场景(如网络数据流)。
C 多缓冲技术:通常用于输入/输出速率差异很大的情况(如视频播放、高速数据采集),通过更多缓冲区吸收突发流量。
D 单缓冲技术:只有一个缓冲区,输入和输出无法重叠,当速率接近时容易造成频繁等待,效率较低。
16.为了使多个进程能有效地同时处理阵发性的输入和输出,最好使用( A )结构的缓冲技术。
A. 多缓冲
B. SPOOLing
C. 单缓冲区
D. 双缓冲区
17.一个含有6个盘片的双面硬盘,盘片每面有100条磁道,则该硬盘的柱面数为( C )。
A. 12
B. 250
C. 100
D. 1200
解析:
硬盘的柱面是所有盘片上相同磁道号的集合(即所有盘片同一半径的同心圆)。
题目给出:6个盘片 → 共 12 个磁面(每个盘片两面)。
每面有 100 条磁道 → 磁道号从 0 到 99。
柱面数 = 每个磁面上的磁道数 = 100(而不是磁面数或总磁道数)。
A 12(这是磁面数)
B 250(无意义)
C 100(正确)
D 1200(可能是 12 个磁面 × 100 条磁道,但这是总磁道数,不是柱面数)
18.设磁盘的转速为3000转/分,盘面划分为10个扇区,则读取一个扇区的时间是(B )。
提示:1分(m)等于60秒(s),1秒等于1000毫秒(ms)。
A. 20ms
B. 2ms
C. 3ms
D. 1ms
解析:
1. 先算转一圈需要的时间
转速 3000 转/分
⇒ 转一圈时间 =60 秒/3000=0.02 秒=20 毫秒
2. 读取一个扇区的时间(平均情况)
磁盘旋转一圈可读出 10 个扇区(假设扇区均匀分布)。
读出 1 个扇区的时间 =20 ms/10=2 ms
19.下列关于磁盘的描述中,正确的是( A )。
A. 减少磁盘的寻道时间可以显著改善系统性能
B. 当关掉电源后,磁盘存储的内容丢失
C. 磁盘属于字符设备
D. 磁盘的动作不局限于机械运动,可以无限快
20.下列关于Linux系统设备管理的描述中,不正确的是(B )。
A. 把设备作为特殊文件处理
B. 将存储设备称为字符设备
C. 设备名由主、次设备号构成
D. 设备驱动程序可动态装卸
解析:
在 Linux 系统中,设备分为字符设备和块设备两大类:
字符设备:以字符流方式传输数据,无缓冲区(如键盘、鼠标、串口)。
块设备:以数据块为单位传输,支持随机访问并有缓冲区(如硬盘、U 盘、SSD)。
存储设备(如硬盘)属于块设备,而不是字符设备。因此选项 B 的说法不正确。
二、判断题
1.计算机系统为每一台设备确定的一个用以标识它的编号,被称为设备的绝对号。(A)
A. 对
B. 错
解析:
在操作系统中,设备的绝对号是指系统为每一台物理设备分配的一个唯一的、固定的编号,用于在内核层面标识该设备(例如 Linux 内核中设备的 dev_t 类型,包含主设备号和次设备号)。用户程序通常不直接使用绝对号,而是通过逻辑设备名或相对号访问设备,由系统在设备分配时将逻辑名映射为绝对号。
2.现代计算机系统中,外围设备的启动工作都是由系统和用户共同来做的。(B)
A. 对
B. 错
解析:
在现代计算机系统中,外围设备的启动工作主要由操作系统负责,用户通常不直接参与设备启动过程。
3.用户程序应与实际使用的物理设备无关,这种特性称作设备独立性。(A)
A. 对
B. 错
4.共享分配技术适用于高速、大容量的直接存取存储设备,如磁盘等。(A)
A. 对
B. 错
解析:
共享分配技术允许多个进程同时或交替使用同一个设备,适用于高速、大容量、支持直接存取(随机访问) 的设备,如磁盘、固态硬盘等。这类设备可以将请求排队或分区域使用(如文件系统将不同文件分布在不同扇区),从而在硬件和软件的配合下实现资源共享。而独占设备(如打印机)则不适合共享分配。
5.利用共享分配技术可以提高设备的利用率,使得打印机之类的独占设备成为可共享的、快速I/O设备。(B)
A. 对
B. 错
解析:
共享分配技术适用于本身支持多进程同时或交替访问的设备(如磁盘),而打印机是独占设备,无法同时被多个进程直接使用。要将打印机改造成为可共享的设备,需要使用SPOOLing 技术(虚拟分配技术),而不是共享分配技术。SPOOLing 通过磁盘缓冲区(输出井)将独占设备逻辑上变为共享设备。
因此,题目张冠李戴,说法错误。
6.实现设备虚拟分配最成功的技术是SPOOLing。(A)
A. 对
B. 错
7.SPOOLing系统能实现设备管理的虚拟技术,即:将共享设备改造为独占设备。它由专门负责I/O的常驻内存的进程以及输入、输出井组成。(B)
A. 对
B. 错
8.采用SPOOLing技术情况下,可用1台计算机代替脱机技术需要的3台计算机。(A)
A. 对
B. 错
解析:
传统的脱机技术(如早期的卫星机)需要三台计算机:
一台用于将纸带上的数据输入到磁带上(输入机)
一台用于处理数据(主机)
一台用于将磁带上的结果输出到打印机(输出机)
SPOOLing(假脱机)技术在一台计算机(主机)上通过磁盘输入井、输出井和外围控制守护进程模拟了脱机输入/输出的过程,从而替代了另外两台外围计算机的功能。因此,SPOOLing 可用一台计算机完成脱机技术需要三台计算机才能完成的任务。
9.一个设备驱动程序可以控制同一类型的多个物理设备。(A)
A. 对
B. 错
解析:
设备驱动程序是控制某种类型设备的软件模块。一个驱动程序通过主设备号标识设备类型,使用次设备号区分同一类型的不同物理设备实例(例如两个相同的 USB 磁盘或两块相同型号的网卡)。驱动程序会根据次设备号选择操作对应的设备寄存器或地址,从而实现对多个相同类型物理设备的控制。
三、简答题
1、操作系统中设备管理的功能是什么?
操作系统中的设备管理(I/O 管理)是操作系统最核心的子系统之一,负责管理计算机系统中的所有硬件设备(如磁盘、键盘、打印机、显示器等),其主要功能可以概括为以下几个方面:
一、设备独立性(设备无关性)
功能:用户编程时使用逻辑设备名(如 /dev/printer),而不需要知道具体的物理设备(如 COM1)。操作系统负责将逻辑设备名映射到实际的物理设备。
目的:使用户程序与具体设备解耦,当设备变更(如更换打印机型号)时,无需修改用户程序。
二、设备分配与回收
功能:根据进程的请求和系统当前的设备使用情况,决定将哪个设备分配给哪个进程,并在进程结束时回收设备。
分配方式:
独占分配:设备一次只分配给一个进程(如打印机)。
共享分配:多个进程可以同时或交替使用设备(如磁盘)。
虚拟分配:通过 SPOOLing 技术将独占设备改造为逻辑上的共享设备。
三、设备驱动程序管理
功能:加载、卸载设备驱动程序,并提供统一的上层接口(如 read、write、ioctl)。
作用:驱动程序负责将抽象的 I/O 请求翻译为设备特定的命令序列,并处理设备的中断。
四、缓冲区管理
功能:在内存中设置缓冲区(单缓冲、双缓冲、环形缓冲、缓冲池),用于暂存数据。
目的:缓和 CPU 与 I/O 设备之间的速度不匹配,减少 CPU 等待 I/O 的时间,提高系统并行性。
五、设备控制与 I/O 操作
功能:通过设备控制器或通道向设备发出 I/O 指令,完成数据的输入输出。
控制方式:
程序循环检测方式(轮询)
中断驱动方式
DMA(直接存储器访问)方式
通道控制方式
六、虚拟设备(SPOOLing)管理
功能:利用磁盘作为缓冲区(输入井、输出井),将独占设备(如打印机)模拟为可共享的逻辑设备。
优点:提高了独占设备的利用率和系统吞吐量,实现了“脱机”输入输出的效果。
七、设备出错处理
功能:检测 I/O 操作中的错误(如设备未就绪、读写出错、介质损坏),并尝试恢复或向上层报告错误。
策略:重试、降级、热替换、记录日志等。
八、设备性能优化
功能:通过 I/O 调度(如电梯算法、CFQ)、预读、延迟写、缓存等手段,提高设备的访问效率。
应用:磁盘调度算法优化磁头寻道时间;SSD 的磨损均衡与 TRIM 管理。
九、提供统一的文件接口(针对块设备)
功能:将块设备(如磁盘)通过文件系统抽象为目录和文件,用户通过 open、read、write、close 等系统调用访问设备。
特殊处理:字符设备(如键盘)不通过文件系统缓存,直接进行 I/O。
十、支持设备的热插拔与电源管理
功能:在系统运行时动态检测设备的插入与拔出(如 USB 设备),并自动加载/卸载驱动程序。同时管理设备的低功耗状态(休眠、挂起)。
2、UNIX/Linux系统中主次设备号各表示什么含义?
一、主设备号(Major Number)
含义:表示设备的类型,即该设备是由哪一个驱动程序管理的。
作用:当应用程序访问设备文件时,操作系统(VFS)根据主设备号找到对应的设备驱动程序,并调用其提供的文件操作函数(如 read、write、open)。
特点:
同一类设备(如所有 SATA 硬盘、所有 USB 键盘)通常共享相同的主设备号。
主设备号与驱动程序一一对应(一个驱动程序可以支持多个同类型设备,通过次设备号区分)。
二、次设备号(Minor Number)
含义:表示同一类型设备中的具体哪一个设备实例,或者该设备的某个子功能/分区。
作用:驱动程序通过次设备号来区分不同的物理设备、分区或设备内部的逻辑单元,从而对具体的硬件进行操作。
特点:
次设备号可以表示设备序号(如 0 → 第一个硬盘,1 → 第二个硬盘)。
也可以表示设备的分区(如 sda1、sda2 使用相同的主设备号,不同的次设备号)。
总结
主设备号 → 标识驱动(设备类型)
次设备号 → 标识驱动管理的具体对象(第几个设备、哪个分区)
这种设计使得 Linux 内核可以动态管理设备:同一驱动程序(主设备号固定)可支持任意多个同类设备(通过不同的次设备号区分),设备文件与驱动程序的绑定非常灵活。
3、设备分配技术主要有哪些?常用的设备分配算法是什么?
一、设备分配技术的主要类型
根据设备的物理特性和使用方式,设备分配技术主要分为以下三种:
1. 独占分配技术
适用设备:打印机、磁带机、绘图仪等独占设备。
分配方式:将一个设备一次性分配给某个进程,由该进程独占使用,直到进程释放设备。
优点:管理简单,无冲突。
缺点:设备利用率低,可能造成进程长时间等待。
2. 共享分配技术
适用设备:磁盘、固态硬盘等共享设备(块设备)。
分配方式:多个进程可以同时或交替访问同一个设备(例如磁盘的 I/O 请求队列)。
优点:设备利用率高,系统吞吐量大。
缺点:需要复杂的请求调度算法(如电梯算法)。
3. 虚拟分配技术(SPOOLing)
适用设备:原本独占的设备(如打印机),通过软件改造为逻辑上的共享设备。
分配方式:用户进程将输出数据写入磁盘中的输出井,由一个独立的守护进程(如打印守护进程)实际控制物理设备输出。
优点:提高了独占设备的利用率,缩短了进程等待时间。
缺点:需要额外的磁盘空间和守护进程开销。
二、常用的设备分配算法
设备分配算法主要用于共享设备(如磁盘) 的 I/O 请求调度,以及独占设备的分配队列管理。常见算法如下:
|
算法名称 |
适用场景 |
核心思想 |
优缺点 |
|
先来先服务(FCFS) |
独占设备、磁盘调度 |
按请求到达顺序分配设备或处理 I/O 请求 |
公平简单,但性能差(磁头移动无优化) |
|
优先级调度 |
实时系统、有优先级需求的系统 |
高优先级进程优先获得设备 |
可保证重要任务,但低优先级可能饥饿 |
|
最短寻道时间优先(SSTF) |
磁盘调度 |
选择离当前磁头最近的请求先服务 |
提高平均寻道性能,但可能造成饥饿 |
|
扫描算法(SCAN / 电梯算法) |
磁盘调度 |
磁头单向移动,服务沿途请求,到尽头后折返 |
避免饥饿,性能较好,但两端请求等待时间长 |
|
循环扫描(C-SCAN) |
磁盘调度 |
单向移动服务请求,到尽头后快速返回起点再继续 |
使各区域请求等待时间更均匀 |
|
LOOK 与 C-LOOK |
磁盘调度 |
改进 SCAN,磁头移动到最远请求处即折返,不一定要到端点 |
更高效,减少无效移动 |
对于独占设备的分配,若多个进程同时申请,通常采用 FCFS + 优先级相结合的方式;若资源不足,进程会被阻塞并放入设备等待队列。
三、总结
分配技术:独占、共享、虚拟(SPOOLing)。
分配算法:FCFS、优先级、SSTF、SCAN、C-SCAN、LOOK 等(主要用于磁盘调度)。
核心目标:提高设备利用率、减少进程等待时间、保证公平性或实时性(根据系统需求权衡)。
4、SPOOLing系统的主要功能是什么?
SPOOLing 系统(Simultaneous Peripheral Operation On Line,假脱机系统)的主要功能是通过磁盘缓冲区(输入井/输出井) 和守护进程,将独占设备(如打印机、读卡机)改造为可供多个进程逻辑上共享的虚拟设备。其核心功能包括:
1. 输入/输出井管理(磁盘缓冲)
在磁盘上划分出输入井和输出井。
输入井:暂存需要从低速输入设备(如键盘、扫描仪)读入的数据。
输出井:暂存需要从高速输出设备(如打印机)输出的数据。
作用:缓和 CPU 与低速 I/O 设备之间的速度不匹配,避免进程直接等待物理 I/O。
2. 输入/输出守护进程(外围控制进程)
输入守护进程:负责将实际输入设备的数据预先读入输入井。
输出守护进程:负责将输出井中的数据取出,送往实际输出设备打印或传输。
特点:守护进程独立于用户进程运行,模拟了脱机输入/输出的效果。
3. 虚拟设备映射
用户进程操作的是虚拟设备(如 /dev/lp 的逻辑映像),而不是物理设备。
进程对虚拟设备的读写被转化为对输入井/输出井的读写(磁盘操作),由 SPOOLing 系统负责与实际物理设备的数据交换。
4. 共享与并行性提升
多个用户进程可以同时向输出井写入打印数据,而不需要互相等待物理打印机空闲。
输出守护进程依次处理输出井中的任务,使打印机(原本独占)在逻辑上成为多个进程共享的设备。
同时,CPU 与 I/O 设备可以并行工作:进程在磁盘缓冲区快速读写,而物理设备在后台异步完成实际 I/O。
5. 资源管理与调度
维护输出井/输入井中的任务队列(如打印队列)。
提供优先级调度或 FCFS 策略,决定守护进程处理任务的顺序。
在设备出现故障时,可保留任务并在设备恢复后继续处理。
5、一般I/O软件系统的层次是怎样的?
一般 I/O 软件系统采用分层结构设计,每一层隐藏底层硬件细节,向上层提供更抽象、更易用的接口。这种分层提高了模块化、可移植性和安全性。典型的层次结构(由低到高)如下:
1. 硬件层(I/O 设备 + 控制器/通道)
内容:物理设备(磁盘、键盘、打印机)、设备控制器、DMA 控制器、通道等。
功能:完成实际的信号传输、机械动作、数据存储或状态检测。
特点:直接与硬件打交道,由上层软件控制。
2. 中断处理程序
位置:内核最低层,紧贴硬件。
功能:
响应设备发出的中断信号。
保存被中断进程的 CPU 现场。
调用相应的设备中断服务例程(ISR)。
清除中断标志,恢复现场并返回。
说明:中断处理是异步 I/O 完成的关键机制。
3. 设备驱动程序
位置:内核中,每个设备(或设备类型)对应一个驱动程序。
功能:
向上层(如设备独立层)提供统一的接口(open、read、write、ioctl 等)。
将上层抽象的 I/O 请求转化为设备控制器能理解的命令序列(如读写寄存器、发送命令码)。
处理 I/O 的初始化、启动、错误重试、DMA 设置等。
特点:与硬件强相关,通常由设备厂商提供。
4. 设备独立层(设备无关 I/O 层)
位置:内核中,位于驱动程序之上。
功能:
设备命名与映射:将逻辑设备名(如 /dev/lp)映射到具体驱动程序。
设备保护:检查用户进程是否有权访问该设备。
缓冲管理:提供单缓冲、双缓冲、环形缓冲等,缓和 CPU 与设备速度不匹配。
错误处理:捕获驱动程序返回的错误,统一向上层报告(如 EIO)。
I/O 调度:对共享设备(如磁盘)的 I/O 请求进行排队与重排(如电梯算法)。
分配与回收:管理独占设备的分配与释放。
作用:使上层程序与具体设备类型解耦,实现设备独立性。
5. 用户级 I/O 软件(系统调用接口 + 库函数)
位置:内核最外层(系统调用接口)及用户空间库(如 stdio)。
内容:
系统调用:open、read、write、close、lseek、ioctl 等。
C 标准库:fopen、fread、printf、scanf 等(封装系统调用,增加缓冲)。
用户程序:直接调用库函数或系统调用来完成 I/O。
功能:为用户进程提供统一、方便的 I/O 操作方式。
6、设备驱动程序的主要功能是什么?它在系统中处于什么位置?
一、设备驱动程序的主要功能
设备驱动程序是操作系统中直接与硬件交互的软件模块,其主要功能包括:
设备初始化与配置
在系统启动或设备热插拔时,对设备控制器进行初始化(设置工作模式、分配中断、配置 DMA 等)。
接收上层 I/O 请求
接收来自设备独立层或文件系统的抽象请求(如 read、write、ioctl),并将其转换为设备控制器能理解的命令序列(如写入控制寄存器、设置数据传输长度、指定内存地址)。
启动 I/O 操作
按照设备协议向设备控制器的寄存器写入命令,启动数据传输(轮询、中断或 DMA 方式)。
处理 I/O 完成与中断
响应设备发出的中断信号,读取设备状态,判断 I/O 是否成功,并调用中断处理程序通知上层。
错误检测与恢复
监测设备运行中的错误(如介质错误、设备超时),尝试重试或向上层返回错误码(如 EIO)。
提供统一接口
实现内核定义的标准接口(如 struct file_operations 中的 .read、.write、.open、.release 等),使上层代码无需知道具体硬件细节。
支持设备的动态管理
支持设备的热插拔(如 USB 设备插入时自动加载驱动)、电源管理(挂起/唤醒)等。
二、设备驱动程序在系统中的位置
设备驱动程序处于操作系统内核的最底层,位于硬件与内核的其余部分之间。其具体位置如下(由低到高):

上方:设备驱动程序接收来自设备独立层(或直接来自系统调用层)的 I/O 请求。
下方:驱动程序直接与硬件控制器交互(通过读写 I/O 端口、内存映射寄存器、DMA、中断等)。
执行环境:驱动程序运行在内核态,可以访问内核地址空间和硬件资源。
7、为什么要引入缓冲技术?设置缓冲区的原则是什么?
一、为什么要引入缓冲技术?
引入缓冲技术的主要目的是解决 CPU 与 I/O 设备之间速度不匹配的矛盾,并提高系统的并行性和响应速度。具体原因包括:
缓和 CPU 与 I/O 设备的速度差异
CPU 的速度远高于 I/O 设备(如磁盘、打印机、键盘)。无缓冲区时,CPU 必须等待慢速 I/O 完成,导致 CPU 空闲等待。缓冲区允许 CPU 将数据快速写入内存缓冲区后继续执行,而设备在后台慢慢处理。
减少 I/O 中断频率
如果不使用缓冲区,每传输一个字节或一个字符就可能产生一次中断,系统开销很大。缓冲区可以累积一定数据量再触发中断(如 DMA 传输一整块数据)。
实现 CPU 与 I/O 设备并行工作
通过双缓冲或多缓冲,CPU 可以处理一个缓冲区中的数据,同时 I/O 设备填充或清空另一个缓冲区,实现输入-处理-输出的重叠。
缓解数据突发性
某些设备(如网络接口、声卡)的数据流量具有突发性。缓冲区可以吸收突发峰值,防止数据丢失。
简化数据格式转换
例如终端输入的行缓冲:用户输入一行后按回车,缓冲区中的一行数据再传给程序,避免每次按键都引发系统调用。
二、设置缓冲区的原则
缓冲区的大小、数量和位置(内存或设备内置)需要根据系统要求和设备特性来设计,主要遵循以下原则:
匹配速度差异
如果输入设备与输出设备的速度相差很大,通常需要设置较大的缓冲区(或多缓冲)来平滑流量。例如,磁盘到打印机的数据通道需要大缓冲区,因为磁盘快、打印机慢。
减少系统开销
缓冲区太小时,会导致频繁的中断和 I/O 操作,增加系统负担。缓冲区太大时,会浪费内存,且可能增加响应延迟(例如输入缓冲区过大,用户长时间看不到回显)。需要在效率和响应之间平衡。
考虑数据传输单位
块设备(如磁盘)的缓冲区大小通常是块大小的整数倍(如 512B、4KB)。字符设备(如终端)的缓冲区可以是字符行大小(如 1KB)。
支持双缓冲或多缓冲
当输入和输出速率接近且要求并行时,常用双缓冲(两个缓冲区交替使用)。
当速率相差很大或数据流具有突发性时,采用环形缓冲(多个缓冲区)或缓冲池。
满足实时性要求
对于实时系统,缓冲区不能过大,否则会引入不可接受的延迟。可能采用小缓冲区或零拷贝技术。
内存与设备资源约束
缓冲区通常设置在内存中(系统空间或用户空间),但某些设备有内置硬件缓冲区(如磁盘缓存、网卡 FIFO),设计时应尽量利用硬件缓冲以减少 CPU 干预。
8、处理I/O请求的主要步骤是什么?
处理一个 I/O 请求(例如用户程序调用 read() 读取磁盘文件)在操作系统中通常经历以下主要步骤。这些步骤横跨用户态、内核态,并涉及多个软件层次和硬件交互。
I/O 请求处理的主要步骤
1. 用户进程发起 I/O 请求
用户程序执行系统调用,如 read(fd, buffer, count)。
库函数(如 glibc)封装系统调用,陷入内核(通过 int 0x80、syscall 指令等)。
2. 系统调用接口层(系统调用处理)
CPU 切换到内核态,保存用户进程的上下文(寄存器、栈指针等)。
根据系统调用号,跳转到内核中对应的处理函数(如 sys_read)。
3. 文件系统层(针对块设备)
内核根据文件描述符 fd 找到对应的文件对象(struct file)和 inode。
判断操作是否合法(如权限检查、偏移量计算)。
如果需要从磁盘读取数据,文件系统层确定要读取的逻辑块号(或页号)。
4. 设备独立层(通用块层)
将文件系统的 I/O 请求转换为通用块 I/O 请求(struct bio)。
进行 I/O 调度(如合并相邻请求、按电梯算法排序)。
若使用缓冲区高速缓存(Page Cache),检查数据是否已在内存中:
若命中 → 直接拷贝到用户缓冲区,I/O 完成(跳过后续硬件步骤)。
若未命中 → 继续向下传递请求。
5. 设备驱动程序层
根据主设备号找到对应的设备驱动程序。
驱动程序将通用 I/O 请求转换为设备控制器能理解的命令(如读写特定寄存器、设置 DMA 地址、发送命令码)。
驱动程序可能将请求放入设备请求队列(如果设备支持排队,如 NCQ)。
6. 中断处理与 I/O 启动
驱动程序启动 I/O 操作(例如向磁盘控制器的命令寄存器写入“读”命令)。
若使用中断驱动方式,CPU 继续执行其他进程(非阻塞等待)。
若使用轮询方式,CPU 循环检查设备状态(较少用)。
7. 设备控制器执行 I/O
设备控制器独立完成与物理设备的数据传输(可能通过 DMA,直接与内存交换数据)。
传输完成后,设备控制器向 CPU 发送中断信号。
8. 中断处理与 I/O 完成
CPU 响应中断,保存当前进程的现场,跳转到对应的中断服务程序(ISR)。
ISR 读取设备状态,判断 I/O 是否成功,清除中断标志。
若 I/O 完成,则唤醒等待该 I/O 的进程(将其状态从阻塞变为就绪),并将数据从内核缓冲区拷贝到用户缓冲区(或通知上层数据已准备好)。
9. I/O 完成后的返回
系统调用层层返回,最终将结果(如读取的字节数)返回给用户进程。
CPU 切换回用户态,恢复用户进程的上下文,进程继续执行。
9、Linux系统中对设备怎样管理?
Linux 对设备的管理,可以理解为一套从内核到用户空间的精密协作体系。它最核心的思想就是"一切皆文件",并围绕此构建了层次清晰、高度模块化的管理架构。
这套架构主要由以下三个层面构成:
第一层:内核驱动模型——组织与抽象
这是设备管理的"骨架",负责在内核中建立统一的设备模型,将硬件信息与驱动逻辑分离。其核心概念是总线(Bus)、设备(Device)和驱动(Driver)。
总线(Bus):Linux内核抽象出的连接通道,如PCI、USB、I2C等。它负责匹配(match)设备和驱动,一旦匹配成功,就会调用驱动的probe函数来初始化硬件。还有一个特殊的platform总线,用于管理SoC上那些不依靠物理总线的"内存映射"设备。
设备(Device):代表具体的硬件。现代Linux通过设备树(Device Tree)来描述硬件信息(如寄存器地址、中断号)。在内核启动或驱动加载时,这些信息会被解析并注册到总线上。
驱动(Driver):控制硬件的软件代码。它只关注"如何操作",而具体的"操作对象"(硬件资源)由设备提供。这种分离设计使得同一个驱动可以轻松适配同一类型的不同设备。
类(Class):从功能角度对设备进行分类(如input、sound),方便用户空间按功能查找设备,与它们在总线上如何连接无关。
此外,内核通过sysfs文件系统(挂载在/sys目录),将这套复杂的设备模型树导出到用户空间。你可以在/sys/bus/、/sys/devices/等目录下,直观地看到系统中所有设备的总线归属、驱动绑定关系等。
第二层:设备文件系统——访问接口
这是用户程序和内核设备驱动之间的桥梁。它在/dev目录下为每个设备创建了一个设备节点(Device Node),这是一个特殊的文件。应用程序可以像操作普通文件一样,使用open(), read(), write()等系统调用,通过这个节点来与硬件设备交互。
设备节点主要分为两种类型:
字符设备(c):以字节流方式传输,无缓冲区,如键盘、串口。
块设备(b):以数据块为单位,支持随机访问,有缓冲区,如硬盘、U盘。
每个设备节点都由主设备号(Major Number)和次设备号(Minor Number)唯一标识。主设备号用于定位驱动程序,次设备号则用于区分该驱动管理的不同硬件实例。
第三层:用户空间管理——动态与智能
这是设备管理的"管家",负责动态、智能地处理设备插拔事件。其核心组件是udev。
在没有udev的早期,设备节点是静态创建的(用mknod命令),这无法处理热插拔设备。udev作为现代Linux默认的设备管理器,完美解决了这个问题。
它的工作原理是:
监听事件:作为守护进程(udevd)常驻后台,监听内核通过netlink套接字发出的uevent(设备事件)。
匹配规则:当收到设备添加/移除事件时,udev会根据预先定义的规则文件(位于/etc/udev/rules.d/)进行处理。规则文件非常灵活,可以基于设备的总线位置、厂商ID、序列号等属性进行匹配。
执行动作:根据匹配成功的规则,udev在/dev目录下动态创建或删除设备节点,并可以设置其文件权限、所有者,甚至创建有意义的符号链接(如/dev/disk/by-uuid/)或执行自定义脚本。
简单来说,devtmpfs在系统启动时负责创建最基本的设备节点,而udev则在此基础上进行精细化、动态化的管理。
四、应用题
1、假设一个磁盘有200个磁道,编号从0~199。当前磁头正在143道上服务,并且刚刚完成了125道的请求。如果寻道请求队列的顺序是:
86, 147, 91, 177, 94, 150, 102, 175, 130
问:为完成上述请求,下列算法各自磁头移动的总量是多少?
(1) FCFS (2)SSTF (3) 电梯法
答:
已知:
磁道数:0~199
当前磁头位置:143
刚刚完成了 125 道的请求 → 因此移动方向是从 125 到 143(向磁道号增加的方向移动)。
请求队列(按到达顺序):86, 147, 91, 177, 94, 150, 102, 175, 130
(1)FCFS(先来先服务)
按请求顺序依次服务,计算每次寻道距离的绝对值:
|
服务顺序 |
当前磁道 |
下一磁道 |
移动距离 |
|
初始 |
143 |
86 |
57 |
|
86 |
86 |
147 |
61 |
|
147 |
147 |
91 |
56 |
|
91 |
91 |
177 |
86 |
|
177 |
177 |
94 |
83 |
|
94 |
94 |
150 |
56 |
|
150 |
150 |
102 |
48 |
|
102 |
102 |
175 |
73 |
|
175 |
175 |
130 |
45 |
总移动量 = 57 + 61 + 56 + 86 + 83 + 56 + 48 + 73 + 45= 565
➡ FCFS = 565
(2)SSTF(最短寻道时间优先)
每次都选择离当前磁道最近的请求。
初始 143,队列 {86,147,91,177,94,150,102,175,130}
- 最近是 147(|147-143|=4)
移动 4 → 当前位置 147,移出 147
队列:86,91,177,94,150,102,175,130 - 最近是 150(|150-147|=3)
移动 3 → 当前位置 150,移出 150
队列:86,91,177,94,102,175,130 - 最近是 130(|130-150|=20)
移动 20 → 当前位置 130,移出 130
队列:86,91,177,94,102,175 - 最近是 102(|102-130|=28),比 86(44)近,比 94(36)近
移动 28 → 当前位置 102,移出 102
队列:86,91,177,94,175 - 最近是 94(|94-102|=8)
移动 8 → 当前位置 94,移出 94
队列:86,91,177,175 - 最近是 91(|91-94|=3)
移动 3 → 当前位置 91,移出 91
队列:86,177,175 - 最近是 86(|86-91|=5)
移动 5 → 当前位置 86,移出 86
队列:177,175 - 最近是 175(|175-86|=89),177(91)→ 选 175
移动 89 → 当前位置 175,移出 175
队列:177 - 最后 177(|177-175|=2)
移动 2 → 当前位置 177 - 总移动量 = 4 + 3 + 20 + 28 + 8 + 3 + 5 + 89 + 2= 162
➡ SSTF = 162
(3)电梯算法(SCAN,沿当前方向服务完再折返)
当前方向(从 125 → 143)是向磁道号增加的方向。
请求队列:86,147,91,177,94,150,102,175,130
大于等于 143 的请求:147,177,150,175 → 排序:147,150,175,177
小于 143 的请求:86,91,94,102,130 → 排序(反向,因为回到 0 方向后从大到小服务):130,102,94,91,86
步骤:
1. 从 143 向上 → 147(4), 150(3), 175(25), 177(2)
移动 4+3+25+2 = 34
2. 到达 177 后,调头向下,先到 130(177-130=47)
然后依次 130→102(28), 102→94(8), 94→91(3), 91→86(5)
移动 47+28+8+3+5 = 91
总移动 = 34 + 91 = 125
➡ SCAN = 125
最终答案:
FCFS = 565
SSTF = 162
电梯法(SCAN) = 125
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)