`

IO与操作系统关系(一)

阅读更多

1.liunx的内核态和用户态

         1.1).用户空间与内核空间

          liunx操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享

。空间分配如下图所示:

  有了用户空间和内核空间,整个linux内部结构可以分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间。如下图所示:

 

 1.2.需要注意的细节问题:

     1.2.1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。 

     1.2.2) Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。

   1.2.3) 内核态与用户态:

       1.当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。

      2.当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。 

        

     1.3) 进程上下文和中断上下文

       当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。

 

2.  IO分类

详细参考这篇博客: IO - 同步,异步,阻塞,非阻塞

 

2.1 阻塞blocking和非阻塞non-blocking IO,同步synchronous IO和异步asynchronous IO的区别在哪?

    下面先说明一下四种io:(前3种属于同步IO,第4种属于异步IO,同步与异步IO最大区别在于进程是否会block)

     blocking IO        阻塞IO 

     nonblocking IO   非阻塞IO
     IO multiplexing    非阻塞多路复用IO
     asynchronous IO 异步IO

    对于一个network IO 会经历两个阶段,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel):1 等待数据准备 (Waiting for the data to be ready) 2.将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)

2.2 blocking IO 阻塞IO 
在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:

1.当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。(用户态切换到内核态-准备数据)

2.对于network io来说,很多时候数据在一开始还没有到达,这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。(用户态-阻塞,内核态-准备数据中)

3.当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果(用户态-阻塞,内核态-拷贝数据到用户进程)

4.用户进程才解除block的状态,重新运行起来。(用户态-解除阻塞,内核态-数据返回完毕)
特点:blocking IO的特点就是在IO执行的两个阶段都被block了

 

2.3 non-blocking IO 非阻塞IO

linux下,可以通过设置socket使其变为non-blocking。java代码中修改如下:

服务端:

// 获得一个ServerSocket通道
ServerSocketChannel serverChannel = ServerSocketChannel.open();
// 设置通道为非阻塞
serverChannel.configureBlocking(false);

 客户端:

// 获得一个Socket通道
SocketChannel channel = SocketChannel.open();
// 设置通道为非阻塞
channel.configureBlocking(false);

 详细流程如下:

1.当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。(用户态 不阻塞------内核态-准备数据中)

2.从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是用户进程马上获取结果,如果结果是error,它就知道数据还没有准备好,于是它可以再次发送read操作。(用户态 不阻塞-------内核态-准备数据中)

3.一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。(用户态 进入阻塞-----内核态-拷贝数据回进程)
特点:用户进程其实是需要不断的主动询问kernel数据好了没有。

 

2.4 IO multiplexing 多路复用IO

IO multiplexing使用select,epoll机制,select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程(通过listener监听)。它的流程如图:

1.当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。(用户态-阻塞,内核态-准备数据中并通知)

2.这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。(用户态-阻塞,内核态-拷贝数据会用户进程)

特点:这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection

 

2.5 Asynchronous I/O 异步IO

linux下的asynchronous IO其实用得很少。先看一下它的流程:

用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

 

2.6 各个IO Model的比较如图所示:

经过上面的介绍,会发现non-blocking IO和asynchronous IO的区别还是很明显的。在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

 

 

 

   

 

分享到:
评论
1 楼 carlosfu 2016-01-06  
坐等  

相关推荐

    操作系统各种模拟程序.zip

    计算机操作系统各种模拟程序,使用C语言编写。 包括:磁盘存储器管理模拟,单任务系统,独占设备分配模拟,内存的动态分区分配,请求分页存储管理模拟,生产者消费者问题,时间片轮转调度,实现前趋关系并发,文件...

    IO system and File System

    介绍风河的vxworks的文件系统和IO子系统的ppt,包括IO操作,inode,文件描述符的关系。

    Java编程中的IO模型详解:BIO,NIO,AIO的区别与实际应用场景分析

    BIO是同步阻塞模型,特点是一对一的客户端与处理线程关系,适用场景是连接数量较小并且固定的,优点是编程简单,但对服务器资源要求高。NIO是同步非阻塞模型,它借助selector能以一对多的方式处理连接,优点是连接...

    Java之IO流学习总结

    File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断...

    使用资源管理器优化Oracle性能

    每个应用都看到地址从0开始的单独的一块内存,虚拟内存被分成4K 或8K的page,操作系统通过MMU(memory management unit)将这些page与物理内存映射起来,这个映射关系通过page table控制。  Raw device是没有文件...

    tam-drawio:一个提供TAM标记的drawio插件

    tam-drawio 提供TAM表示法的插件TAM是基于DIN 66200的UML2和FMC(基本建模概念)框图的子集-(数据处理系统操作;概念,工作关系,由Deutsches Institut Fur Normung EV(德国国家标准),1992年3月1日) 有关TAM...

    分步骤快速可控执行 IO 操作的轻便框架.zip

    可用于异步网络爬虫、异步操作相关数据库。内部封装 SQLAlchemy ORM 框架,数据模型可与 WEB 相关框架进行组合。框架也可处理同步函数,快速定位错误步骤。 爬虫(Web Crawler)是一种自动化程序,用于从互联网上...

    一个事件驱动的嵌入式控制器框架(基于STM32平台).zip

    Q-Controllers是一个事件驱动的应用代码框架,适用于低端单片机无法跑操作系统,但又要处理越来越复杂的代码构架的情况。 因为不依赖于操作系统,所以非常容易被移植到stm32之外的其他单片机上。即便不进行移植,...

    一个事件驱动的嵌入式控制器框架(基于STM32平台)

    Q-Controllers是一个事件驱动的应用代码框架,适用于低端单片机无法跑操作系统,但又要处理越来越复杂的代码构架的情况。 因为不依赖于操作系统,所以非常容易被移植到stm32之外的其他单片机上。即便不进行移植,...

    基于STM32平台一个事件驱动的嵌入式控制器框架

    Q-Controllers是一个事件驱动的应用代码框架,适用于低端单片机无法跑操作系统,但又要处理越来越复杂的代码构架的情况。 因为不依赖于操作系统,所以非常容易被移植到stm32之外的其他单片机上。即便不进行移植,...

    UNIX环境高级编程_第二版

    主编和翻译了多本操作系统教材和参考书,包括《UNIX操作系统教程》、《UNIX高级编程技术》、《UNIX环境高级编程》和《操作系统:设计与实现》等。 内容截图: 目录: 第1章UNIX基础知识 第2章UNIX标准化及...

    C++并行计算与异步网络引擎.rar

    作为万能异步客户端。... ...项目支持Linux,macOS,Windows,Android等操作系统。 Windows版以windows分支发布,使用iocp实现异步网络。用户接口与Linux版一致。 支持所有CPU平台,包括32或64位x86处

    STM32CUBEMx开发入门及应用

    第五个部分引入操作系统,带领读者利用组态软件STM32CubeMX集成的RreeRTOS操作系统来进行项目开发,例如利用操作系统简化逻辑关系,减轻代码工作量,利用FPU强大的浮点数据处理能力(DSP指令)优化系统运行效率等。...

    2023mysql常见面试题带答案

    缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便 数据保存在数据库 1)数据永久保存 2)使用SQL语句,查询方便效率高。 3)管理数据方便 什么是SQL? 结构化查询语言(Structured Query Language)简称...

    2023最新MySQL100道面试题-附答案解析

    缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便 数据保存在数据库 1)数据永久保存 2)使用SQL语句,查询方便效率高。 3)管理数据方便 2. 什么是SQL? 结构化查询语言(Structured Query Language)...

    MySQL面试题集锦pdf版本

    缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便 数据保存在数据库 1)数据永久保存 2)使用SQL语句,查询方便效率高。 3)管理数据方便 2. 什么是SQL? 结构化查询语言(Structured Query Language)...

    Netty应用说明笔记

    这个Bug与操作系统机制有关系的,JDK虽然仅仅是一个兼容各个操作系统平台的软件,但在JDK5和JDK6最初的版本中(严格意义上来将,JDK部分版本都是),这个问题并没有解决,而将这个帽子抛给了操作系统方,这也就是这...

    Linux IO编程

    掌握 Linux 中用户编程接口(API)及系统命令的相互关系 掌握文件描述符的概念 掌握 Linux 下文件相关的不带缓存I/O 函数的使用 掌握 Linux 下设备文件读写方法 掌握 Linux中对串口的操作 熟悉 Linux 中标准文件I/O ...

    计算机测控测控系统设计.pptx

    软件总体设计 软件平台:应用平台 操作系统、支持技术 软件结构:BS、CS 任务分解 数学模型、控制策略和控制算法 设计方法:结构化 软件结构框图,逐级细化 计算机测控测控系统设计全文共15页,当前为第6页。...

    micro-DB:自己动手写数据库-基于Java语言的简易关系型数据库

    每一个表存储成为一个物理磁盘文件,通过表数据变多,一个表对应的物理磁盘文件可以无限变大,全部读取到内存中肯定是不可取的,编写程序时应每次磁盘IO读取一个数据块,操作系统与磁盘一般以4k为以页的单位来交互的...

Global site tag (gtag.js) - Google Analytics