I/O简介
用户空间是常规进程所在区域。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简介的更多相关文章
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- mysql获取随机字符串和随机数的方法
在我们开发的过程中,我们可能会需要在表中随机生成一些数据以供我们进行相应的测试. 就像我之前发的“mysql创建存储过程向数据表中加入规定条数的数据” 那么我们应该怎样生成随机的字符串和随机数字呢? ...
- shiro权限管理入门程序
最近在学shiro,觉得入门程序还是有用的,记下来防止遗忘,也可供大家参考. package cn.itcast.shiro.authentication; import org.apache.shi ...
- CSS: hover选择器的使用
用法1:这个表示的是:当鼠标悬浮在a这个样式上的时候,a的背景颜色设置为黄色 a:hover { background-color:yellow; ...
- css 两端对其
大段的文字直接写会有不整齐的现象 所以ui小姐姐就会和我们讲你能不能把两端对其呀 ps里面就可以呀 okok 那就两端对其好了 text-align:justify 效果为⬇️⬇️⬇️ 上面是 ...
- 安卓外派(Android外派)提供安卓程序员外派业务(北京动点,可签合同)
北京动点飞扬长年提供安卓工程师外派业务. 平均技术情况如下: 1.2~3年以上Android平台开发经验 2.熟练掌握java技术,熟悉面向对象编程设计 3.熟悉Android应用开发框架及Activ ...
- ssm 出现 Method threw 'org.apache.ibatis.binding.BindingException' exception.Invalid bound statement (not found)……
运行数据库的增删改查时出现 500状态码 并且提示 Method threw 'org.apache.ibatis.binding.BindingException' exception.Invali ...
- JS 单线程
js单线程阻塞实例setTimeout(function () { while (true) { } }, 1000);setTimeout(function () { alert('end 2'); ...
- js的柯里化currying
转载:http://www.zhangxinxu.com/wordpress/2013/02/js-currying/ 我自己的理解柯里化就是这样的,(1)必须返回匿名函数,(2)参数复用. 1. 参 ...
- hibernate 的API使用
1.Query对象:不需要写sql语句,但需要hql语句,和sql很类似 (1)sql和hql区别:sql操作表和表字段,hql操作实体和实体属性 (2)使用: 2.Criteria对象:不需要写语句 ...
- 【XAF问题】不能将值NULL插入列"Oid"
一.问题 1. 不能将值NULL插入列"Oid" 二.解决方法 解决方法:删表,oid不能为空,继承的对象变了