操作系统——输入输出IO管理

1 I/O管理概述

1.1 I/O设备

分类

按信息交换单位分:

(1)块设备:以数据块为单位,属于有结构设备,如磁盘,传输速率较高,可寻址,可随机读写

(2)字符设备:以字符为单位,属于无结构类型,如交互式终端机,打印机等,传输速率低,不可寻址,时常采用中断I/O方式

按传输速率分类:

(1)低速设备:如键盘,鼠标

(2)中速设备:如激光打印机

(3)高速设备:磁盘机,光盘机等

I/O接口

设备控制器位于CPU与设备之间

在这里插入图片描述

(1)设备控制器与CPU的接口,有三类信号线:数据线,地址线和控制线

(2)设备控制器与设备的接口,每个接口都存在数据,控制和状态三种类型的信号

(3)I/O逻辑,实现对设备的控制,对地址进行译码,并相应的对所选设备进行控制

主要功能:接收和识别CPU发来的命令;数据交换,如设备和控制器之间的数据,控制器和主存之间的数据;标识和报告设备的状态供CPU处理;地址识别;数据缓冲;差错控制

I/O端口

指设备控制器可被CPU直接访问的寄存器

  • 数据寄存器:实现CPU和外设之间的数据缓冲
  • 状态寄存器:获取执行结果和设备的状态信息
  • 控制寄存器:CPU写入,启动命令或更改设备模式

为实现CPU与I/O端口进行通信,有两种方法:

(1)独立编址:每个端口分配一个端口号,所有I/O端口形成I/O端口空间,普通用户程序不能访问

(2)统一编址(内存映射I/O):每个端口被分配唯一的内存地址,且不会有内存被分配这一地址,通常分配给端口的地址靠近地址空间的顶端

在这里插入图片描述

1.2 I/O控制方式

http://t.csdn.cn/tEgy1

设备管理主要任务之一是控制设备和内存或CPU之间的数据传送,外围设备和内存之间的输入输出控制方式有4种

在这里插入图片描述

1.2.1 程序直接控制方式

从外部设别读取的每个字,CPU需要对外设状态进行循坏检查,直到确定该字已经在I/O控制器的数据寄存器中

导致CPU长时间等待,效率低

1.2.2 中断驱动方式

一旦数据读入数据寄存器就通过控制线给CPU发送中断信号,表示数据准备好,然后等待CPU请求该数据

但是数据中的每个字在存储器和I/O控制器之间的传输都要经过CPU,还是会消耗CPU时间

1.2.3 DMA方式

在I/O设备和内存之间直接开辟数据交换通路,彻底解放CPU

特点:基本单位是数据块;传输数据直接从设备送入内存或相反;尽在传输数据的开始和结束CPU才干预,数据传送在DMA控制器的控制下完成

  • 命令/状态寄存器:接收从CPU发来的I/O命令,有关控制信息,或设备状态
  • 内存地址寄存器MAR:输入时存放把数据从设备传送到内存的起始目标地址;输出时,存放由内存到设备的内存源地址
  • 数据寄存器DR:暂存数据
  • 数据计数器DC:存放背刺传送的字节数

CPU会在开始时设备MAR和DC初值,然后继续其他工作

在这里插入图片描述

1.2.4 通道控制方式

I/O通道是指专门负责输入/输出的处理机,是DMA方式的发展,进一步减少CPU的干预,把对一个数据块的读写为单位的干预,减少为对一组数据块的读写及有关控制和管理为单位的干预,又可以实现CPU,通道和I/O设备三者的并行操作,有效的提高系统的资源利用率

I/O通道与一般处理机:通道指令的类型单一,没有自己的内存,通道程序放在主机的内存中,与CPU共享内存

I/O通道与DMA方式:DMA需要CPU控制传送的数据块大小和传送的内存位置,通道方式这些信息由通道控制;每个DMA控制器对应一台设备与内存传送数据,一个通道可以控制多台设备和内存的数据交换

1.3 I/O软件层次结构

在这里插入图片描述

(1)用户层I/O软件

实现与用户交互的接口,用户直接调用库函数对设备进行操作

(2)设备独立性软件

实现用户程序与设备驱动器的统一接口,设备命令,设备的保护及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间

设备独立性也称设备无关性,应用程序独立于具体使用的物理设备,引入了逻辑设备和物理设备的概念

使用逻辑设备名的优点:增加设备分配的灵活性;易于实现I/O重定向,指I/O操作的设备可以更换,不必改变应用程序

设备独立性软件的主要功能:执行所有设备的公有操作;向用户层或文件层提高统一接口

(3)设备驱动程序

与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序

(4)中断处理程序

用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的线程后,返回到被中断的进程

1.4 应用程序I/O接口

I/O系统与高层之间的接口,根据设备类型不同,进一步分为若干接口

(1)字符设备接口

get:从缓冲区获取字符

put:将字符输出到缓冲区

in-control:提供一种通用的指令处理类型繁多的字符设备

还需要提供打开和关闭操作,实现互斥共享

(2)块设备接口

隐藏了磁盘的二维接口,变为一种线性徐磊

将抽象命令映射为低层操作

内存映射接口通过内存的字节数组来访问磁盘,而不提供读写磁盘操作

(3)网络设备接口

提供相应的网络软件和网络通信接口

通常为网络套接字接口

(4)阻塞/非阻塞I/O

系统的I/O接口还设计两种模式:阻塞和非阻塞

阻塞:进程调用I/O操作,进程就被阻塞,需要等待I/O操作完成,进程才唤醒继续执行

非阻塞:不阻塞进程,I/O调用返回一个错误返回值,轮询方式来查询I/O操作是否完成

大多数系统是阻塞I/O

2 设备独立性软件

2.1 高速缓冲与缓冲区

磁盘高速缓存

提高磁盘的I/O速度,指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息,因此磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块

高速缓存在内存中的两种形式:在内存中开辟一个单独的空间作为高速缓存,大小固定;把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘I/O时共享

缓冲区

设备管理子系统引入缓冲区的目的:

(1)缓和CPU和I/O设备间速度不匹配的矛盾

(2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制

(3)解决基本数据单元大小(即数据粒度)不匹配的问题

(4)提高CPU和I/O设备之间的并行性

实现方法:

(1)采用硬件缓冲器,成本高

(2)采用内存中的缓冲区

缓冲技术的分类:

(1)单缓冲

在内存中设置一个缓冲区

假定从磁盘把一块数据输入到缓冲区的时间为T,操作洗将缓冲区的数据传送到用户区的时间为M,CPU对数据的处理时间为C

当T>C,一个数据传送工程耗时M+T

T<C,一个数据传送过程耗时M+C

所以单缓冲的每块数据处理用时为max(C,T)+M

在这里插入图片描述

(2)双缓冲

先装填到缓冲区1,满了才装填到缓冲区2

假设工作区空,一个缓冲区满,一个空

若T<C+M,一个数据传送过程耗时M+C

若T>C+M,一个数据传送过程耗时T

所以双缓冲区处理一块数据的用时为max(C+M,T)

在这里插入图片描述

在这里插入图片描述

若只有单缓冲,则任意时刻都只能实现单方面的数据传送

(3)循环缓冲

包含多个大小相等的缓冲区,有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,构成一个环形

用于输入输出,还需要两个指针in,out。in指向可以输入数据的第一个空缓冲区,out指向可以提取数据的第一个满缓冲区

(4)缓冲池

多个系统公用的缓冲区组成,按使用状况分为:空缓冲队列,装满输入数据的缓冲队列,装满输出数据的缓冲队列

还有:用于收容输入数据的工作缓冲区,提取输入数据的工作缓冲区,收容输出数据的工作缓冲区,提取输出数据的工作缓冲区

在这里插入图片描述

在这里插入图片描述

2.2 设备分配和回收

设备分配是指根据用户的I/O请求分配所需的设备。设备的使用方式:

(1)独占式使用设备

(2)分时式共享使用设备

(3)以SPOOLing方式使用外部设备:实现了虚拟设备功能,可以将设备同时分配给多个进程,实质上实现了对设备的IO操作的批处理

设备分配的数据结构

设备控制表DCT:一个表就表征一个设备,表项就是设备的属性;请求设备没有得到满足的进程,其PCB按某种策略排成一个设备请求队列,设备队列队首指针指向该请求队列队首PCB

在这里插入图片描述

控制器控制表COCT:有一个表项存放指向相应通道控制表CHCT的指针,一个通道可以为多个设备控制器服务

通道控制表CHCT:有一个指针指向CHCT提供服务的设备控制器信息的表

系统设备表SDT:整个系统只有一张

在这里插入图片描述

设备分配策略

(1)设备分配原则:应根据涉笔特性,用户要求和系统配置情况

(2)设备分配方式:

静态分配:主要对独占设备的分配,在用户作业开始执行前,由系统一次性分配该作业的全部设备,不会死锁但效率低

动态分配:进程执行过程中根据执行需要进行,提高效率,但是可能造成死锁

(3)设备分配算法:常见的有先请求先分配,优先级高者优先等

设备分配的安全性

(1)安全分配方式:进程发出I/O请求后便进入阻塞态,直到I/O完成才唤醒,不会死锁,但是CPU和I/O设备是串行工作

(2)不安全分配方式:进程发出I/O请求继续工作,甚至发出多个请求,请求的设备被另一进程占用才进入阻塞态,优点是一个进程可同时操作多个设备,使进程推进迅速,缺点是可能死锁

逻辑设备名到物理设备名的映射

系统中的逻辑设备表LUT包括逻辑设备名,物理设备名和设备驱动程序入口地址;当进程用逻辑设备名请求分配设备,系统为他分配一台相应的物理设备,并在LUT中建立一个表目,当以后进程再利用该逻辑设备名请求I/O操作时,系统通过查找LUT来寻找对应的物理设备和驱动程序

LUT设置方式:

(1)整个系统一张,LUT不允许具有相同的逻辑设备名,主要适用于单用户系统

(2)每个用户一张LUT,为该用户建立一个进程,建立一个LUT也放进进程的PCB中

2.3 SPOOLing技术(假脱机技术)

缓和CPU和I/O设备速度的矛盾,引入脱机输入输出技术,是一项将独占设备改造成共享设备的技术,利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上

(1)输入井和输出井

在磁盘上开辟两个存储区域,输入井模拟脱机输入时的键盘,用于收容I/O设备输入的数据,输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据

一个进程的输入输出数据保存为一个文件,所有进程的数据文件链接成一个输入输出队列

(2)输入缓冲区和输出缓冲区

输入缓冲区暂存由输入设备送来的数据,再传送到输入井

输出缓冲区用于暂存从输出井送来的数据,再传送到输出设备

(3)输入进程和输出进程

用于模拟脱机输入输出时的外围控制机

CPU需要输入数据时,直接从输入井读入内存;输出数据先从内存送到输出井,等输出设备空闲再将输出井中的数据经过输出缓冲区送到输出设备

共享打印机就是SPOOLing技术的实例

假脱机管理进程完成的任务:

(1)在磁盘缓冲区中为之申请一个空闲盘块,并将要打印的数据送入其中暂存

(2)为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到假脱机文件队列上

SPOOLing系统的特点:提高了I/O速度;将独占设备改造为共享设备(实际上没有为任何进程分配设备);实现了虚拟设备功能(每个进程认为自己独占设备)

在这里插入图片描述

3 磁盘和固态硬盘

http://t.csdn.cn/WPMu8

磁盘地址用“柱面号-盘面号-扇区号”表示

磁头能否移动:固定头磁盘,活动头磁盘

磁盘能否更换:固定盘磁盘,可换盘磁盘

在这里插入图片描述

3.1 磁盘的管理

磁盘初始化

低级格式化(物理格式化):把磁盘划分扇区,为每个扇区使用特殊的数据结构,填充磁盘

分区

系统还要将自己的数据结构记录到磁盘上

第一步:将磁盘分为由一个或多个柱面组成的分区(即c盘等形式的划分),每个分区的起始扇区和大小都记录在磁盘主引导记录的分区表中

第二步:对物理分区进行逻辑格式化,即创建文件系统,初始文件系统数据结构存储到磁盘上,包括空闲空间和已分配的空间以及一个初始为空的目录

为提高效率,系统把多个相邻的扇区组合在一起,形成一簇(Linux称为块),一簇只能放一个文件,文件占用的空间只能是簇的整数倍

引导块

计算机启动时需要运行一个初始化程序(自举程序),它初始化CPU,寄存器,设备控制器和内存等;接着启动操作系统;所以自举程序要找到磁盘上的操作系统内核,加载到内存,并转到起始地址开始运行

自举程序通常存放在ROM中,而ROM中又只保留很小的自举装入程序,将完整功能的引导程序保存在磁盘的启动块,具有启动分区的磁盘称为启动磁盘或系统磁盘

即顺序是:

ROM的自举装入程序—>磁盘的启动块—>操作系统

坏块

简单磁盘:可手动处理,在FAT表上标明,程序不会使用

复杂磁盘:控制器维护坏块列表,在出厂低级格式化就已经初始化,在使用过程中不断更新;还会保留一些块最为备用,控制器可以采用备用块来代替坏块,这种方案称为扇区备用

3.2 磁盘调度算法

一次磁盘读写操作由寻找时间,旋转延迟时间和传输时间决定

(1)寻找时间Ts

设有n条磁道,m为与磁盘驱动器速度有关的常数,约0.2ms,磁臂的启动时间s约为2ms

Ts=m*n+s=0.2*n+2

(2)旋转延迟时间Tr

磁头定位到磁道的扇区所需的时间,磁盘的旋转速度为r

Tr= 1 2 r \dfrac{1}{2r} 2r1

(3)传输时间Tt

磁盘读出或写入数据经历的时间,取决于每次读写的字节数b和磁盘的旋转速度,N是一个磁道上的字节数

Tt= b r N \dfrac{b}{rN} rNb

寻道时间与磁盘调度算法有关,而延迟时间和传输时间都与磁盘旋转速度有关

常见的磁盘调度算法

(1)先来先服务FCFS算法

最简单的算法,具有公平性,但是大量进程时性能较差

(2)最短寻找时间优先算法SSTF

选择与当前磁头所在磁道距离最近的磁道,但是会产生饥饿现象

(3)扫描算法SCAN/电梯调度算法

在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,即规定了磁头运动的方向,且必须走到方向的尽头才能调换方向

在这里插入图片描述

(4)循环扫描算法C-SCAN

在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求

避免了SCAN算法偏向处理接近最里或最外的磁道的访问请求

在这里插入图片描述

(5)LOOK调度和CLOOK调度

SCAN和C-SCAN必须遵循从盘面的一端到另一端

还可以改进为磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点

在这里插入图片描述

在这里插入图片描述

除了减少寻找时间,减少延迟时间也是提高磁盘传输效率的重要因素,可以对盘面扇区进行交替编号,对磁盘片组中的不同盘面错位命名

因为磁头读写一个物理块后需要短暂的处理时间才能开始读写下一块

所以盘面上按扇区交替编号连续存放,则连续读写多条记录时能减少磁头的延迟时间;同柱面不同盘面的扇区若能错位编号,连续读写相邻两个盘面的逻辑记录时也能减少磁头延迟时间

在这里插入图片描述

寻找时间和延迟时间是能减少的,但是传输时间无法改变

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验二 进程管理   Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C++ 运行库来说,这一调用发生在应用程序的main() 函数返回之后。 1. 创建进程 CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 2-1详细地列出了每个参数的类型和名称。   表2-1 CreateProcess() 函数的参数 参数名称 使用目的 LPCTSTR lpApplivationName 全部或部分地指明包括可执行代码的EXE文件的文件名 LPCTSTR lpCommandLine 向可执行文件发送的参数 LPSECURIITY_ATTRIBUTES lpProcessAttributes 返回进程句柄的安全属性。主要指明这一句柄是否应该由其他子进程所继承 LPSECURIITY_ATTRIBUTES lpThreadAttributes 返回进程的主线程的句柄的安全属性 BOOL bInheritHandle 一种标志,告诉系统允许新进程继承创建者进程的句柄 DWORD dwCreationFlage 特殊的创建标志 (如CREATE_SUSPENDED) 的位标记 LPVOID lpEnvironment 向新进程发送的一套环境变量;如为null值则发送调用者环境 LPCTSTR lpCurrentDirectory 新进程的启动目录 STARTUPINFO lpStartupInfo STARTUPINFO结构,包括新进程的输入和输出配置的详情 LPPROCESS_INFORMATION lpProcessInformation 调用的结果块;发送新应用程序的进程和主线程的句柄和ID   可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。 然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。 接着是CreateProcess() 函数调用所需要的三个通常使用缺省值的参数。第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。 CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区。以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。 2. 正在运行的进程 如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。通常,这种进程使用主线程来指示它的存在。当主线程结束时,调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。 首先可查看的进程特性是系统进程标识符 (PID) ,可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess() 相似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用。其他的可显示当前进程信息的API函数还有GetStartupInfo()和GetProcessShutdownParameters() ,可给出进程存活期内的配置详情。 通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在CreateProcess() 中的参数以启动应用程序。在创建应用程序时可使用的另一个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山是哪个青山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值