IO

IO系统管理的主要对象是IO设备和相应的设备控制器。其主要任务是,完成用户提出的IO请求,提高IO效率,以及提高设备的利用率。并能为更高层的进程方比那使用这些设备提供手段。

IO系统的基本功能

  • 隐藏物理设备的细节

    设备类型很多,他们之间的很多方面都有差异。像他们产生和接受数据的速度,传输方向、粒度、数据的表示形式及可靠性等方面。为了对这些设备进行控制,通常都为他们配置相应的设别控制器。这是一种硬件设备,其中包含有若干个用于存放控制命令的寄存器和存放参数的寄存器。用户通过这些命令和参数,可以控制外部设备执行所需要的操作。

    因为对不同的设备,需要使用不同的命令和不同的参数。比如,对磁盘的操作,需要给出是读指令,还是写指令。还要给出数据位置,包括磁盘的盘面号、磁道、扇区号等。由此可见,如果要程序员自己去直接面向设备编程,是很困难的。

    因此,需要IO系统对设备加以抽象,隐藏掉设备的具体实现细节,仅向上层进程提供少量的、抽象的读写命令。

  • 与设备无关

    这个是在隐藏物理设备细节的基础上,又做了一个抽象。把物理上的设备,映射成逻辑设备。比如要是打印机,对应的/dev/printer ,而不必要指明是哪一台打印机;另外,页可以有效的提高OS的可移植性,增加新的设备驱动程序,以方便新的IO设备的安装。系统可以为新IO设备自动安装和寻找驱动程序,从而做到即插即用。

  • 提高处理及和IO设备的利用率

    很多设备之间是相互独立的,能够并行操作的。处理机和设备之间也可以并行操作。因此,需要尽可能的将cpu和设备并行操作,以提高利用率。

    一方面是cpu能快速响应用户的IO请求,是设备尽快的运行起来;另一方是减少每一个设备在运行期间对cpu的干预时间。

  • 对设备进行控制

    对设备的控制是驱动程序的功能。目前对设备控制有以下方式:

    1. 程序轮训方式
    2. 中断的可编程方式
    3. 直接存储器访问方式
    4. 通道方式

    对于低速设备可采用中断可编程方式,例如键盘、打印机等终端低速设备。低速传输基本单位是字节。

    高速设备,可采用直接存储方式。例如 磁盘、光盘等。高速传输单位是数据块。

    IO通道可以使对IO操作的组织和数据传输,都能独立运行而无需CPU的干预。为了方便高层和用户,IO软件屏蔽了这些差异,向高层提供统一的操作接口。

  • 确保对设备的正确共享

    设备的共享分为两种:

    1. 独占设备:进程互斥访问。比如打印机、磁带机等
    2. 共享设备:一段时间内可以允许多个进程同时访问设备。比如对磁盘的读
  • 错误处理

    设备的错误也可以分为临时性错误和持久性错误

    临时性错误:可以通过重试操作进行修正

    持久性错误:需要向上报告

    对错误的处理,应该尽可能的在接近硬件的层面上进行,在低层软件上能够解决的错误就不向上层报告。上层调用是无感知的。对于那些低层软件解决不了的错误才能向上 层报告,让高层处理解决。

IO系统层次结构

用户层IO软件

用户程序,用户可以直接调用该层所提供的、于IO操作有关的库函数对设备进行操作

设备独立性软件

用户实现用户程序和设备驱动器的统一的接口、设备命名、设备的保护以及设备的分配和释放等

设备驱动程序

与硬件之直接相关,用于具体实现对设备发生的操作指令,驱动设备工作的驱动程序

中断处理程序

保护被中断进程的cpu现场环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的现场后,再返回到被中断的进程

IO系统中各种模块之间的层次视图

IO系统的上下接口

  1. 系统接口:它是向上提供设备进行操作的抽象IO命令,方便上层使用。有的系统在用户层面提供了 IO操作有关的库函数,供用户使用。在上层系统中有文件系统、虚拟存储器系统以及用户进程等
  2. 软件/硬件(RW/HW)接口:
  3. IO系统的分层:

中断处理程序:它处于IO系统的底层,直接与硬件交互。

设备驱动程序:IO系统的次底层,是进程和设备控制器之间的通信程序。主要功能就是将上层发来的抽象IO请求转换成对IO设备具体的命令和参数,并把它载入设备控制器中的命令和参数寄存器中。由于设备之间的差异很大,每类设备的驱动程序也都不相同,所以设备驱动程序是由设备厂商提供。因此,系统中每增加一个新的设备时,都需要厂家提供新的驱动程序。

设备独立性软件:是在设备驱动的基础上又增加的一层抽象层,屏蔽了具体的多个设备驱动程序。实现了IO系统操作和设备无关性。提高了设备的可适应性和可扩展性。使他们能应用于许多类型的设备,而且在每次增加新设备或替换老设备时,都不需要对IO软件进行修改,这样就方便了系统了更新和扩展。设备独立性软件的内容包括设备命名、设备分配、数据缓冲、和数据高速缓冲一类软件

IO介绍-上的更多相关文章

  1. 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍

    事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...

  2. Netty之WebSocket和四种IO介绍

    Netty简介 一.什么是netty? 高性能 事件驱动 异步非堵塞 基于NIO的客户端,服务器端编程框架 稳定性和伸缩性 二.Netty的使用场景 高性能领域   多线程并发领域   异步通信领域 ...

  3. Select、Poll、Epoll、 异步IO 介绍

    一.概念相关介绍 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的net ...

  4. websocket 与Socket.IO介绍

    一  websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的 ...

  5. Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架

    一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...

  6. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  7. ORACLE数据库异步IO介绍

    异步IO概念 Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能.它是Linux 2.6 版本内核的一个标准特性,当然我们在2.4 版本内核的补丁中也可以找到它.AIO 背 ...

  8. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...

  9. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  10. mysql在高内存、IO利用率上的几个优化点 (sync+fsync) 猎豹移动技术博客

    http://dev.cmcm.com/archives/107 Posted on 2014年10月16日 by liuding | 7条评论 以下优化都是基于CentOS系统下的一些优化整理,有不 ...

随机推荐

  1. Flutter Forward 活动正式发布

    2023 年 1 月 25 日,Flutter 团队将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播,敬请期待! 活动将于北京时间 1 月 25 日 22:30 开始 ...

  2. Linux调度器:进程优先级

    一.前言 本文主要描述的是进程优先级这个概念.从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级.realtime优先级.归一化优先级 ...

  3. 17 Transformer 的解码器(Decoders)——我要生成一个又一个单词

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  4. 云原生周刊:Prometheus 3.0 Beta 发布|2024.09.16

    开源项目推荐 Kuma Kuma 是一个现代化的基于 Envoy 的服务网格,能够在每个云平台上运行,支持单区域或多区域部署,兼容 Kubernetes 和虚拟机.凭借其广泛的通用工作负载支持,以及对 ...

  5. 云原生爱好者周刊:使用 AWS 开源的 FireCracker 来创建和管理 K8s 集群

    开源项目推荐 KubeFire 这个项目比较有创意,它使用 AWS 开源的轻量级虚拟化项目 FireCracker 来创建和管理 Kubernetes 集群,摒弃了传统的 qcow2 和 vhd 等虚 ...

  6. linux 配置apache的虚拟主机

    基于web的开发,若没有配置虚拟主机,一直在浏览器输入localhost/projectname有点复杂 特别是类似thinkphp框架的,一大串:localhost/php/tp5/public.. ...

  7. 一次彻底掌握数据中心级的JVM调优实战经验

    出现内存溢出的场景通常发生在应用程序中存在内存泄漏.对象生命周期过长.对象频繁创建但未能及时回收等问题.以下是几个真实的业务场景,结合内存溢出问题,并从多个角度提出优化方法,来提高内存使用效率. 场景 ...

  8. antdesign vue 步骤条a-step按审核人员节点排序显示逻辑

    一.需求内容 目前审核人员角色有:学术.法务.售后,串行执行审核流程. 审核流程:发起/修改审核->审核节点 审核节点规则:学术->法务->售后,每个节点均可以审核或修改. 审核状态 ...

  9. JS 本地存储 localStorage 操作总结

    现在前端做数据存储,跨页面传值,localStorage是一个很好的方式,以键值对的方式存储,也方便取值赋值,下面说一说使用方法和一些常见的使用技巧. 1.存值共有3种方式,localStorage相 ...

  10. IntelliJ IDEA 设置背景图片 随机快捷更换背景图片(附高清4K背景图N张)

    前言 开发过程枯燥乏味,何不为自己工作中添加点乐子呢,除了主题模板,我们可以设置IntelliJ IDEA 的背景图片,换个背景图,换个心情. IntelliJ IDEA 设置背景图片 注意: 必要的 ...