I/O设备

IO设备的类型

分为三类:人机交互类外部设备:打印机、显示器、鼠标、键盘等等。这类设备数据交换速度相对较慢,通常是以字节为单位进行数据交换的

存储设备:用于存储程序和数据的设备,如磁盘、磁带、光盘等。这类设备用于数据交换、速度较快。

网络通信设备:用于与远程设备通信的设备,如各种网络接口、调制解调器、其速度介于两者之间。

                                           ​

IO控制方式

程序控制I/O:处理器代表一个进程给io模块发送一个io命令,该进程进入忙等待,直到操作完成

中断驱动I/O:处理器代表进程向io发送命令,如果来自进程的io指令是非阻塞的,那么处理器继续执行进程的后续指令。如果io指令时阻塞的,那么处理器执行来自操作系统的指令,将当前进程设置为阻塞态并且调度其他进程。

直接存储器访问(DMA):一个DMA模块控制内存和io模块之间的数据交换。为传送一块数据,处理器给DMA模块发送请求,并且只有当整个数据块传送结束后,它才能被中断。

DMA: 在io设备和内存之间开辟直接的数据交换通路,彻底解放CPU。有利于系统总线与存储器进行双向数据传送。其基本单位是数据块,整块数据的传送是在DMA控制器的控制下完成的,仅仅在传送一个或多个数据块的开始和结束的时候,才需要CPU干预。所传送的数据,也是直接从设备送入内存的,反之相同。

操作系统的IO设计

在设计io机制的时候,两个最重要的目标是效率和通用性。

本地外围设备的组织:硬件->调度和控制->设备I/O->逻辑I/O->用户进程

通信端口的组织:硬件->调度和控制->设备I/O->通信结构->用户进程

文件系统的组织:硬件->调度和控制->设备I/O->物理组织->文件系统->目录管理->用户进程

逻辑IO:逻辑io模块把设备当作一个逻辑资源来处理,它并不关心实际控制设备的细节。逻辑io模块代表用户进程管理的一般io功能,允许用户进程根据设备标识符以及诸如打开、关闭、读、写之类的简单命令与设备打交道。

设备IO:请求的操作和数据(缓冲的数据、记录等)被转换成适当的IO指令序列、通道命令和控制器命令。可以使用缓冲技术来提高利用率。

调度和控制:io操作的排队、调度实际上发生在这一层,处理中断、收集并报告io状态。这一层是与io模块和设备硬件真正发生交互的软件层。

                                           ​

设备独立性: 用户在编程序时使用的设备与实际设备无关。一个程序独立于分配给它的某类设备的具体设备,即在用户程序中只需要指明IO使用的设备类型即可。 其优先包括:方便用户编程、使程序运行不受具体机器环境的限制、便于程序移植。

I/O缓冲

使用缓冲的原因

  1. 缓和CPU与IO设备间速度不匹配的矛盾
  2. 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
  3. 解决基本数据单元大小不匹配的问题
  4. 提高CPU与IO设备之间的并行性

缓冲是用来平滑IO需求的峰值的一种技术,但是当进程的平均需求大于io设备的服务能力的时候,缓冲再多也不能让io设备与这个进程一直并驾齐驱。但是在多道程序设计环境中,多种io活动和多种进程活动的时候,缓冲是提高系统效率和单个进程性能的一种方法。

缓冲

缓冲:在输入请求发出前就开始执行输入传送,并且在输出请求发出一段时间之后才开始执行输出传送。【预输入,缓输出】

面向块的设备:将信息保存在块中,块的大小是固定的,传送过程中一次传送一块。如磁盘和USB

面向流的设备:以字节流的方式输入输出数据,没有块结构。如终端、打印机、通信端口、鼠标等等。

单缓冲

当用户进程发出IO请求的时候,操作系统给该操作分配一个位于内存中系统部分的缓冲区。

面向块:输入传送的数据被放到系统缓冲区中,当传送完成的时候,进程把该块移到用户空间,并立即请求另一块。需要数据的设备或处理器从缓冲区中拿走数据。这样能够期望这块数据最终会被使用。

最终用时为MAX(C,T)+M。(c:处理器处理时间,m:数据传输到用户区的时间,t:输入到缓冲区的时间。)

加速比为: (T+C)/(MAX(C,T)+M)

优势在于能够提高系统速度,并且操作系统可以进行进程交换。但是增加了操作系统的逻辑复杂度。交换逻辑也会受到影响。

面向流:每次传送一行的方式或者每次传送一个字节的方式使用。传送行的方式输入要挂起,输出不用。传送字节的方式采用生产者/消费者模型。

双缓冲

也称缓冲交换。给操作系统分配两个系统缓冲区,在一个进程往一个缓冲区中传送数据(取数据)的同时,操作系统清空(或者填充)另一个缓冲区。

它的执行时间是MAX(C,T),加速比是 (T+C)/MAX(C,T)。 如果C<=T,则有可能使得面向块的设备全速运行,反之也能确保处理器的效率,不需要等待IO。因此性能能够有所提高,但是复杂性也提升了。

面向流:每次传送一行的io,用户进程不需要为输入输出挂起程序。对于每次传送一个字节的操作,双缓冲并没有特别的优势。都采用生产者/消费者模型。

                                           ​

循环缓冲

如果该进程需要爆发式地执行大量的IO操作,仅仅有两个缓冲是不够的,在这种情况下,通常使用多于两个的缓冲区的方案来缓解不足。当使用两个以上的缓冲区的时候,这组缓冲区自身被当作循环缓冲区。

                                           ​

缓冲池

由多个系统公共的缓冲区组成,缓冲区按其使用情况可以形成三个队列:空缓冲队列、装满输入数据的缓冲队列和装满输出数据的缓冲队列。还包括了四个缓冲区:收容输入数据、提取输入数据、收容输出数据、提取输出数据的工作缓冲区。

当输入程序需要输入数据的时候,从空缓冲队列对首使用一个空缓冲区,作为收容输入的工作缓冲区,然后装入数据,装满后再挂到输入队列队尾。当计算程序需要输入数据的时候,从输入队列取得一个缓冲区作为提取输入工作缓冲区,计算进程从中提取数据,数据用完后再放入到空缓冲队列。

磁盘调度

磁盘性能参数

寻道时间:磁头定位到磁道所需要的时间

旋转延迟:磁道定位之后,磁盘控制器开始等待,直到适当的扇区旋转到磁头处的时间。

存取时间:寻道时间+旋转延迟,即达到读或写的位置所需要的时间。

传输时间:磁头定位完成,磁头通过下面旋转的扇区,执行读操作或写操作所需要的时间。

                                           ​

                                           ​

总的存取时间=存取时间(寻道时间+旋转延迟)+传输时间

                                           ​

计算:

                                           ​

磁盘调度策略

磁盘访问产生性能差异的原因可以追溯到寻道时间。如果扇区访问请求包括随机选择磁道,则性能就特别低。为提高性能,需要减少花费在寻道上的时间。

 
 

名称

说明

注释

RSS

随机访问

用于分析和模拟

FIFO

按顺序处理队列中的项目

最公平的调度,如果大量进程竞争一个磁盘,这种技术在性能上往往接近于随即调度。

PRI

根据进程优先级来

在磁盘队列管理之外控制,不能优化磁盘的利用率

LIFO

后进先出

局部性最好,资源利用率最高

SSTF

最短服务时间优先,移动道数最少

利用率高,队列小

SCAN

仅沿一个方向移动,在途中满足请求。到达后反方向扫描

服务分布比较好

C-SCAN

限定在一个方向上,到达之后,回到起始段重新扫描

服务变化较低

N-step-SCAN

把请求队列分成长度为N的子队列,每一次SCAN扫描,如果此时由新请求,则放到新队列中

服务保证

FSCAN

两个子队列

负载敏感

 
 
 
 

                                           ​​                                           ​

                                           ​

硬盘高速缓存

一个硬盘高速缓存是内存中为磁盘扇区设置的一个缓冲区,包含有磁盘中某些扇区的副本。当出现一个请求某一特定扇区的IO请求时,首先进行检测,以确定该扇区是否在cache中。

主要考虑的问题有两个:

  1. 缓存数据与用户空间交换的问题:数据传送、共享内存指针
  2. 置换策略:LRU LFU

最新文章

  1. Visual Studio 2015 移动跨平台开发初体验
  2. pureftp在centos下与MySQL搭配使用
  3. Servlet从本地文件中读取图片,并显示在页面中
  4. U3D使anim,unity,prefab文件不显示乱码
  5. kafka 0.8.x producer Example(scala)
  6. RNA seq 两种计算基因表达量方法
  7. 把Java对象转为xml格式
  8. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
  9. qt调用simsimi api实现小黄鸡
  10. ubuntu16.04搭建ftp服务器
  11. eclipse 启动报内存溢出的问题out of memory!
  12. Linux的sleep()和usleep()
  13. 【Android 应用开发】BluetoothAdapter解析
  14. BZOJ_1391_[Ceoi2008]order_最大权闭合子图
  15. 0 Python学习计划
  16. C++ GetComputerName()
  17. iOS - 国内注册境外 Apple id 账号
  18. 微信支付app的各种坑
  19. SQL Server 中系统视图sysobjects中type字段的说明
  20. boost::noncopyable介绍

热门文章

  1. MTSP问题
  2. [LC] 93. Restore IP Addresses
  3. C - Line-line Intersection Gym - 102220C(线段相交)
  4. Docker系列五: docker-compose部署Docker容器
  5. Object.prototype.toString.call(obj).slice(8,-1)
  6. Android library 传入本地maven仓库
  7. 让java不再难懂
  8. TCP并发、GIL、锁
  9. deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
  10. 多版本firefox共存