用户空间是常规进程所在区域。JVM就是常规进程,驻守于用户空间。用户空间是非特权区域,在该区域执行的代码不能直接访问硬件设备。

  内核空间是操作系统所在区域。内核代码有特别的权利:它能与设备控制器通讯,控制着用户区域进程的运行状态等。所有I/O都直接或间接通过内核空间。

  当进程请求I/O操作,它执行一个系统调用将控制权移交给内核。当内核以这种方式被调用,它随即采取任何必要的比州,找到进程所需数据,并把数据传送到用户空间内的指定缓冲区,内核试图对数据进行高速缓存或与读取,因此进程所需数据可能已经在内核空间李。若这样,该数据只需简单的拷贝出来即可。若数据不在内核空间,则进程被挂起,内核着手把数据读进内存。

阻塞式I/O

  在Linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是: 

    1. 等待数据从网络中到达。当所有等待数据到达时,它被复制到内核中的某个缓冲区。

    2. 把数据从内核缓冲区复制到应用程序缓冲区。

  当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始没有到达,这时候kernel就要等待足够的数据到来。而在用户进程这边,这个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才会解除block的状态,重新运行起来。

非阻塞式I/O

  Linux下,可以通过设置socket使其变成non-blocking,当对一个non-blocking socket执行操作时,流程如下

  

  当用户进程发出read操作时,若kernel中的数据还没准备好,它并不会block用户进程,而是立刻返回一个error。从用户进程角度来讲,它发起了一个read操作后,并不需要等待,而是马上得到一个结果。用户进程判断结果是一个error时,它就知道数还没准备好,于是他可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次受到了用户进程的system call,那么它马上就讲数据拷贝到了用户内存,然后返回。因此,用户进程的第一个阶段不是阻塞的,需要不断主动的询问kernel数据好了没,第二个阶段依然是阻塞的。

I/O多路复用

  IO multiplexing,有事也称event driven IO,select/epoll的好处就是单个process可以同时处理多个网络连接的I/O。IO复用同阻塞IO本质一样,只不错利用了select系统调用,由内核来负责本来是请求进程该做的轮询操作。基本原理是select/epoll这个function会不断轮询负责所有socket,当某个socket有数据到达了,就通知用户进程。

  当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。IO复用与非阻塞IO的流程差不多,而且还需要使用两个system call(select和recvfrom)。但select的优势在于它可以同事处理多个connection。若连接数不是很高的话,使用select/poll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。

信号驱动式IO

  

异步I/O

  工作机制是告知内核启动某个操作,并让内核在整个操作完成后通知我们。

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

I/O简介的更多相关文章

  1. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  2. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  3. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  4. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  5. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  6. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  7. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

  8. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  9. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

  10. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

随机推荐

  1. oracle(2)

    create table aaa( id number, name varchar2(100) ); select decode((select max(id) from aaa),null,'x', ...

  2. NET的基本用法

    NET的基本用法 NET [ ACCOUNTS | COMPUTER | CONFIG | CONTINUE | FILE | GROUP | HELP | HELPMSG | LOCALGROUP ...

  3. dataguard从库数据库丢失恢复例子(模拟丢失数据文件)

    准备工作,使用如下脚本进行数据库的全备份[oracle@localhost ~]$ more rman_backup.sh #!/bin/sh RMAN_OUTPUT_LOG=/home/oracle ...

  4. JS(JavaScript)的初了解2(更新中···)

    1.parseInt()    整数型 字符串中的数字取整 遇到第一个是非数字的字节就结束了. 2.parseFloat 浮点型 字符中的数字取整数和小数,有两个小数点的话第二个小数点无效第二个小数点 ...

  5. linux基础之grep

    grep: Global search REgular expression and Print out the line 作用: 文本搜索工具,根据用户指定的模式对目标文本逐行进行匹配检查,打印匹配 ...

  6. GIT 私有仓库 github项目提交失败 master -> master (non-fast-forward)

    https://blog.csdn.net/fightingforcv/article/details/52073182 https://blog.csdn.net/u014135752/articl ...

  7. Linux查看服务器硬件配置命令

    一.查看服务器硬件信息 dmidecode|grep "System Information" -A9|egrep "Manufacturer|Product|Seria ...

  8. postman(七):运行集合,看所有请求执行结果

    当在一个collection中录好接口测试用例后,可以利用postman提供的“Run collections”功能来批量执行集合下的所有请求 点击顶部菜单中的[Runner]   或者也可以直接在想 ...

  9. hdu6129 Just Do It!

    多校时找规律做过... 题意,给你一个数列a[1], a[2], a[3], a[4], ... , a[n],操作一次后变为a[1], a[1] ^ a[2], a[1] ^ a[2] ^ a[3] ...

  10. 2015-10-21 C#1

    C#(一) 一.C#的数值类型 byte----字节型 short---短整型 int------整型 long----长整型 char----字符型 float----单精度型 double--双精 ...