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.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- pageUtil分页工具
分页工具: https://www.cnblogs.com/ggq-insist-qiang/articles/10095603.html
- Bugku-CTF之域名解析(听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag)
Day 7 域名解析 50 听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag
- oracle中number数据类型简单明了解释
NUMBER (p,s) p和s范围: p 1-38 s -84-127 number(p,s),s大于0,表示有效位最大为p,小数位最多为s,小数点右边s位置开始四舍五入,若s>p,小数点右侧 ...
- oracle 连接问题汇总
遇到的情况: 1/后台配置完好,若是连其他的库都是好的,当连接另外的库时,始终连接不上,这是需要考虑到服务端安装文件tnsnames文件中服务名在客户端的安装文件tnsnames文件中是否存在
- [转载]Linux 16进制查看命令、工具
转自:https://blog.csdn.net/chenglian_999/article/details/4672177 2009年10月14日 21:45:00 chenglian_999 阅读 ...
- 3、zabbix配置入门
Zabbix模板 zabbix组件: zabbix-server zabbix-database zabbix-web zabbix-agent zabbix-proxy ...
- Codeforces Round #495 (Div. 2) D. Sonya and Matrix
http://codeforces.com/contest/1004/problem/D 题意: 在n×m的方格中,选定一个点(x,y)作为中心点,该点的值为0,其余点的值为点到中心点的曼哈顿距离. ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- 微信小程序计算器模拟后续
今天按着自己的思路又重打了一遍 wxml没什么说的,就是分块起名,显示数字和结果的作为屏幕,数字键盘一行四块 <view class="onTop"> <view ...
- js的Timer方法
如显示时间: <script> //获取时间 function mytime(){ var a = new Date(); var b = a.toLocaleTimeString(); ...