计算机两大主要任务:IO操作和计算处理。许多情况下,主要是IO操作,计算处理只是附带的(而操作系统的两大任务是管理物理设备和为应用程序提供一个虚拟机器的抽象)。操作系统在IO方面的作用是管理IO操作和IO设备。

一、概述

I/O设备在功能与速度方面存在很大差异,所以需要采用多种方法来控制设备。这些方法形成IO子系统的核心,使得操作系统内核其他部分不必涉及复杂的IO设备管理。

IO设备技术呈现两个相矛盾的趋势:一方面,硬件与软件接口日益标准化,有助将设备集成到现有计算机和操作系统,另一方面,IO设备的多样性却又日益增长,甚至有的新旧版本区别很大,以至于很难集成。这种困难需要硬件和软件一起配合解决。操作系统内核设计成使用设备驱动程序模块的结构,而驱程为IO子系统提供了统一设备访问接口。

二、IO硬件

硬件自带有所谓控制器。处理器通过控制器来控制硬件。那么处理器如何向控制器发送命令和数据?简单而言,控制器有一些寄存器,处理器就是通过读写这些寄存器来与控制器通信,这又有2种方式,一是通过IO指令;二是通过内存映射:设备控制寄存器被映射到处理器的地址空间,处理器通过标准数据传输指令来执行IO请求。

具体来说是酱紫的:

1、轮询

主机不断读取寄存器的状态,以决定下一步动作。效率较差。

2、中断

控制器主动发出中断请求信号通知CPU。中断分优先级,多级中断。效率高。

3、直接内存访问

对于需要做大量传输的设备,例如磁盘,耗费CPU来观察寄存器太浪费,通常将任务下方给专用处理器,称之为直接内存访问(DMA)控制器。CPU向内存写入数据,然后就继续忙别的,DMA控制器接手进行数据传输,完了以后中断通知CPU。

三、IO应用接口

IO应用接口使得IO设备可以按统一的标准方式来对待。

具体来说,从不同的IO设备中抽象出通用类型,每个通用类型都可以通过一组标准函数(即接口)来访问。具体的差别被内核模块(设备驱动程序)所封装。设备驱动程序层的作用就是为内核IO子系统隐藏设备控制器之间的差异。



不利的因素是每种操作系统都有自己的接口标准,一个设备可能有多种驱动程序。

对应用程序而言,设备的许多差别都被操作系统所隐藏,设备可以分为几种类型:块与字符设备,网络设备,时钟与定时器等。

1、块与字符设备

比如磁盘,键盘,鼠标、打印机、声卡等。

2、网络设备

Socket接口

3、时钟与定时器

调度程序使用定时器(硬件)产生中断;操作系统也为用户进程提供了使用定时器的接口。

4、阻塞与非阻塞I/O

“当应用程序发出一个阻塞系统调用时,应用程序的执行被挂起,从操作系统的运行队列移到等待队列。在系统调用完成后,应用程序就移回运行队列,并在某个时刻继续执行并收到系统调用返回的值”。IO设备的执行时间不可预计,但操作系统为应用程序接口使用阻塞调用。

就是说,应用程序访问IO设备时,操作系统会让应用程序等待,直至IO设备返回结果。当然,操作系统不可能也陪着干等,它是让应用程序在一旁等候,然后自己继续为另一些程序服务。就好比到麦当劳点餐,收银员(操作系统调度程序)在你(应用程序)点完餐后,吩咐后台(IO设备)准备食物,然后让你移到一旁等候(挂起),接着她说:下一位点餐。

有关 同步异步、阻塞非阻塞,现在我也还不是十分清楚,可参考拙作:

http://blog.csdn.net/leftfist/article/details/41800463

四、IO内核子系统

内核提供了许多与IO有关的服务,如调度、缓冲、高速缓存、假脱机、设备预留及错误处理等。这些服务建立在硬件和设备驱动程序之上。IO子系统还负责保护自己免受错误进程和恶意用户的危害。

1、IO调度

就是确定一个合适的顺序来执行IO请求。调度能改善性能。

调度可由开发人员实现,也可以由操作系统分配。

IO子系统改善计算机效率的方法之一就是IO调度,另外一种方法是使用内存或磁盘上的存储空间技术,如缓冲、高速缓存、假脱机等。

2、缓冲

缓冲区是用来保存两个设备之间或设备和应用程序之间所传输数据的内存区域。

这样做有三个理由:

1)数据流生产者与消费者之间的速度存在差异

2)协调传输数据大小不一致的设备

3)支持应用程序IO的复制语义。所谓复制语义,就是处理前先对数据进行复制,保证处理过程中不受数据源发生变化所影响。

3、高速缓存

高速缓存是可以保留数据副本的高速存储器。高速缓存副本的访问要比原始数据访问更高效。高速缓存与缓冲是两个不同的功能。

4、假脱机与设备预留

假脱机就是一种排队机制。

5、错误处理

操作系统可以预防许多硬件和应用程序的错误,这样就不会因为小的机械失灵导致系统崩溃。

6、IO保护

为了防止用户执行非法IO,定义所有IO指令为特权指令。用户不能直接发出IO指令,只能通过操作系统来进行。

另外,所有内存映射和IO端口内存位置都受到内存保护系统的保护,以阻止用户访问。但内核不能简单地拒绝所有用户访问, 因为有些软件需要直接访问内存映射来提高性能,内核采取锁机制来应对。

7、内核数据结构

内核需要保存IO组件使用的状态信息,可以通过若干内核数据结构如文件打开表等来完成。事实上,内核使用许多类似的结构来跟踪网络连接,字符设备通信和其他IO活动等。

操作系统采用面向对象的技术,采用统一结构来封装不同设备之间的差异。

五、把IO操作转换成硬件操作

现代操作系统通过对请求与物理设备控制器之间的多级表查找,可以获得巨大的灵活性。应用程序与驱动程序之间的请求传递机制是通用的。因此,不必重新编译内核也能为计算机引入新设备和新驱动程序。事实上,有的操作系统能够按需加载设备驱动程序,系统启动之时,系统先检测硬件总线以确定有哪些设备,接着操作系统就马上或等首次IO请求时装入所需的驱程。

以下是一个典型的文件读请求周期:

1)一个进程对已打开文件的文件描述符调用阻塞read()系统调用

2)内核系统调用代码检查参数是否正确。对于输入,如果数据已在高速缓存中,那么将数据返回进程并完成IO请求

3)否则执行物理 IO请求。此时进程从运行队列移到设备的等待队列,并调度IO请求。最后IO子系统对设备驱动程序发出请求。根据操作系统的不同,该请求可能通过子程序调用或内核消息传递

4)设备驱动程序分配内核缓冲区空间以接收数据,并调度IO。最后设备驱动程序通过写入设备控制器寄存器来对设备控制器发送命令。

5)设备控制器控制设备硬件以执行数据传输

6)驱动程序可以轮询检测状态和数据,或动过DMA将数据传入到内核内存。假设为DMA,当传输完成后产生中断

7)中断处理程序通过中断向量表收到中断,保存必要的数据,并向内核设备驱动程序发送信号通知,然后从中断返回。

8)设备驱动程序接收到信号,确定IO请求是否完成,确定请求状态,并向内核IO子系统发送信号,通知请求已完成

9)内核将数据返回代码传递诶请求进程的地址空间,将进程从等待队列移到就绪队列,阻塞解除,进程继续执行

总结:进程请求 -》内核检查,返回或物理IO请求 - 向设备驱动请求 - 设备驱动程序调度IO - 设备控制器数据传输 - 通知设备驱动 - 内核 - 进程

六、流

流是设备驱动程序和用户级进程之间的全双工连接。

流由流开始 + 若干流模块 + 控制设备驱动程序结尾 组成。它们都有一对队列:读队列和写队列。队列之间使用消息传递进行数据传输。队列会缓冲消息,而且没有足够缓冲空间就不会接收消息,是为流控制。

如图。从流开始,消息不断复制一直到驱动程序结尾和设备。

使用流的好处是流可以提供一个框架,以便以模块化以及递增的方式编写设备驱动程序和网络协议。模块可以为不同的流以及不同的设备所使用。

七、性能

IO是影响系统性能的重要因素之一。

执行设备驱动程序代码,以及随之出现的进程阻塞和调度,上下文切换,这些都增加了CPU或者高速缓存的负担。虽然现代计算机每秒能处理数千个中断,但是中断处理仍然是相对费时的任务,IO暴露出内核中断机制的任何效率缺陷。

为了改善IO效率,可以采用一些原则:

1)减少上下文切换

2)减少设备和应用程序之间传递数据时在内存之间的数据复制次数

3)通过使用大传输,智能控制器,轮询,以减少中断频率

4)通过采用DMA智能控制器和通道来为主CPU承担简单数据复制,以增加并发

5)将处理原语移入硬件,允许控制器内的操作与CPU和总线内的操作并发

6)平衡CPU,内存子系统,总线和IO的性能

操作系统学习笔记:I/O输入系统的更多相关文章

  1. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  2. 操作系统学习笔记5 | 用户级线程 && 内核级线程

    在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...

  3. 深挖计算机基础:趣谈Linux操作系统学习笔记

    参考极客时间专栏<趣谈Linux操作系统>学习笔记 核心原理篇:内存管理 趣谈Linux操作系统学习笔记:第二十讲 趣谈Linux操作系统学习笔记:第二十一讲 趣谈Linux操作系统学习笔 ...

  4. Java学习笔记:基本输入、输出数据操作实例分析

    Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...

  5. alfs学习笔记-自动化构建lfs系统

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...

  6. 操作系统学习笔记4 | CPU管理 && 多进程图像

    操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件.而通过学习笔记3的简史回顾,操作系统通过多进程图像实现对CPU的管理.所以多进程图像是操作系统的核心图像. 参考资料: 课程:哈 ...

  7. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  8. 操作系统学习笔记(五)--CPU调度

    由于第四章线程的介绍没有上传视频,故之后看书来补. 最近开始学习操作系统原理这门课程,特将学习笔记整理成技术博客的形式发表,希望能给大家的操作系统学习带来帮助.同时盼望大家能对文章评论,大家一起多多交 ...

  9. ucore操作系统学习笔记(二) ucore lab2物理内存管理分析

    一.lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源. 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管理.最初没有操作系统 ...

  10. 操作系统学习笔记10 | I/O、显示器与键盘

    从这一部分开始介绍操作系统的设备驱动,操作系统通过文件系统的抽象驱动设备让用户能够使用显示器.键盘等交互工具.并讲解printf和scanf是如何实现敲下键盘将字符显示到屏幕上的. 参考资料: 课程: ...

随机推荐

  1. 深入Linux内核架构——进程管理和调度(下)

    五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...

  2. 宝塔apache配置

    apache配置 <VirtualHost *:80> ServerAdmin webmaster@example.com DocumentRoot "/www/wwwroot/ ...

  3. .NET Core 文件的上传与下载

    1.前言 文件导入导出是简单且常用的功能,以下示例实现了文件上传与下载的几种方法,如有不妥的地方,欢迎指正.小白一枚,在往目标前进. 2.1.文件上传    --    纯文件 <form ac ...

  4. 【Codeforces 1108E1】Array and Segments (Easy version)

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 枚举最大值和最小值在什么地方. 显然,只要包含最小值的区间,都让他减少. 因为就算那个区间包含最大值,也无所谓,因为不会让答案变小. 但是那些 ...

  5. 可编辑div的createRange()

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // 在元素的指定位 ...

  6. wps左侧显示目录

    单击视图----文档结构图,在下拉选项中选择靠左即可,如图所示

  7. Linux(Centos6.5)+Nginx+PHP-fpm+Mysql配置

    第一步:准备安装包 1.从[](http://nginx.org/en/download.html).下载nginx 源码包 //NOTE! 下载稳定版本 2.从[](http://php.net/d ...

  8. Poj1704:staircase nim【博弈】

    题目大意:有一个无限长的一维的棋盘,棋盘上N个格子放置着棋子.两个人轮流操作,每次操作能选择其中一个棋子向左移动,但不能越过其它棋子或者两枚棋子放在同一格中,最后不能操作的人算输,问先手是否必胜? 思 ...

  9. bzoj 2721[Violet 5]樱花 数论

    [Violet 5]樱花 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 671  Solved: 395[Submit][Status][Discuss ...

  10. JPA框架下使用纯粹的原生SQL

    最近遇到一个需求,查询数据库中对应表的字段是动态的,项目使用的框架使用JPA+Spring Boot,JPA自带原生SQL支持的传入参数是强类型的,无法用于查询语句的字段更改,因为插入字符串的话带有单 ...