操作系统学习笔记(二十四):I/O子系统

I/O特点

常见设备接口类型:

1、字符设备:键盘鼠标、串口

      a.以字节为单位顺序访问

      b.I/O命令通常使用文件访问接口和语义

2、块设备:磁盘、磁带、光驱

      a.均匀的数据块访问

      b.I/O命令通常使用文件系统接口,也可以使用内存映射访问

3、网络设备:以太网、无线、蓝牙

      a.格式化的报文交换

      b.I/O网络报文,通过网络接口支持多种网络协议。

同步与异步I/O:

1、阻塞I/O:发出请求后等待数据读出或写入完毕

2、非阻塞I/O:发出请求后不等待立即返回,返回值为成功传输的字节数

3、异步I/O:读数据时,使用指针标记好用户缓冲区,立即返回,稍后内核将填充缓冲区并通知用户;写数据内核写入完毕后通知用户

I/O结构

操作系统学习笔记(二十四):I/O子系统_第1张图片

操作系统学习笔记(二十四):I/O子系统_第2张图片

I/O数据传输

CPU与设备控制器的数据传输:

1、程序控制I/O:

      a. 通过CPU的in/out或者load/store传输所有数据

      b. 特点是硬件简答,编程容易,但是小伙CPU时间,适用于简单的小型的设备I/O

2、直接内存访问(DMA)

      a. 设备控制器可直接访问系统总线

      b. 控制器直接与内存湘湖传输数据

      c. 特点是设备传输数据不影响CPU,只需要CPU参与设置,适用于高吞吐量的I/O。

操作系统学习笔记(二十四):I/O子系统_第3张图片

I/O设备通知操作系统的机制:

1、CPU主动轮询:

     a. I/O设备在特定状态寄存器中放置状态和错误信息

     b. 操作系统定期检测状态寄存器

     c. 特点是简单,I/O操作频繁或不可预测时开销较大,并且延时较大

2、设备中断

     a. CPU在I/O之前设置任务参数

     b. CPU在发出I/O请求之后继续执行其他任务

     c. I/O设备处理I/O请求

     d. I/O设备处理完成时,触发CPU中断请求

     e. CPU接收中断,分发到相应中断处理例程

     f. 特点是处理不可预测事件事件效果好,但是中断较多时开销较高

操作系统学习笔记(二十四):I/O子系统_第4张图片

3、实际操作系统中一些高带宽设备可能结合了轮询和设备中断,第一次传入数据包之前采用中断,轮询后面的数据包知道硬件缓存为空。

磁盘调度

           通过优化磁盘访问请求顺序来提高磁盘访问性能。

1、寻道时间是磁盘访问最耗时的部分

2、同时会有多个在同一磁盘上的I/O请求

3、随机处理磁盘访问请求的性能表现很差

调度算法:

1、FIFO

2、SSTF(最短服务时间优先):选择离磁臂当前位置最近的请求执行

3、扫描算法:磁臂在一个方向上移动,访问所有未完成的请求,直到磁臂到达该方向上最后的磁道,也称电梯算法

4、循环扫描算法:限制为仅在一个方向上扫描

5、C-LOOK算法:磁臂先到达该方向上最后一个请求的位置,然后立即反转

6、N步扫描算法:一侧请求过多时,磁头会有粘着现象,后面磁道无法响应,将磁盘请求队列分成长度为N的子队列,按FIFO算法依次处理所有队列,扫描算法处理每个队列

7、双队列扫描算法:只有两个队列,交替使用扫描算法处理两个队列,新生成的I/O请求放入另一个队列中。

磁盘缓存

概念:

        缓存是数据传输双方访问速度差异较大时引入的速度匹配中间层。磁盘缓存是磁盘扇区在内存中的缓存区。类似于虚拟内存管理,只是方向相反。但是磁盘的访问频率是远低于虚拟存储中的内存访问频率,因此次磁盘缓存调度算法会比虚拟存储复杂。

单缓存与双缓存:

操作系统学习笔记(二十四):I/O子系统_第5张图片

        单缓存只有一个缓存区,任意时刻只有一端可以对缓存区进行操作,速度受到限制;双缓存包含两个缓存区,设备与用户进程可以分别操作一个缓冲区,当一个缓冲区1写完并且缓冲区2读完了,可以将两个缓冲区交换,继续操作。

访问频率置换算法:

        在一段密集磁盘访问之后, LFU算法的引用计数会增加到很大,之后的变化无法反应当前的引用情况。因此该算法考虑磁盘访问的密集特征,对密集引用不计数,在短周期内使用LRU算法,在长周期中使用LFU算法。

操作系统学习笔记(二十四):I/O子系统_第6张图片

        具体实现过程为,维护一个特殊栈(LRU的要求),栈中缓存块被访问时移到栈顶。与LRU不同是栈被分为三个区域:新区域、中间区域和旧区域。如果该块在新区域中,引用计数不变,否则,引用计数加1,在旧区域中找计数最小的块置换出去。这样就将LRU与LFU结合在一起,并且避免了密集访问的影响。

 

你可能感兴趣的:(操作系统学习:清华大学学堂在线)