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.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- 使用excel估计GARCH模型参数——以GARCH(1,1)为例
本文的知识点:使用excel求解GARCH模型的系数,以GARCH模型为例,主要采用的是极大似然估计法MLE. 同时给出了R语言的输出结果作为对照验证. 参考了:http://investex ...
- 用jQuery实现参数自定义的文字跑马灯效果
一,明确需求 基本需求:最近在工作中接到一个新需求,简单来说就是实现一行文字从右到左跑马灯的效果,并且以固定的时间间隔进行循环. 原本这是一个很容易实现的需求,但是难点是要求很多参数得是用户可自行设置 ...
- 前端UI框架选择区别对比推荐
UI选择务必慎重,货比三家. 弱水三千只取一瓢:弱水三千只取一瓢,源起佛经中的一则故事,警醒人们在一生中可能会遇到很多美好的东西,但只要用心好好把握住其中的一样就足够了 老牌构建于jQuery框架之上 ...
- [python]python2与python3版本的区别
python2和python3的区别 区别: print函数 整数相除 Unicode 异常处理 xrange map函数 不支持has_key print函数: Python 2: print是语句 ...
- 20175317 《Java程序设计》第四周学习总结
20175317 <Java程序设计>第四周学习总结 教材学习内容总结 第四周我学习了教材第五章的内容,了解了子类与继承的知识,学到了以下内容: 明白了什么是子类与父类.类的树形结构. 子 ...
- [LeetCode]题15:3Sum
第一次解: res = [] nums.sort() if len(nums)<3:return [] for i in range(len(nums)-2): left = i+1 right ...
- 『TensorFlow』函数查询列表_数值计算
基本算术运算 操作 描述 tf.add(x, y, name=None) 求和 tf.sub(x, y, name=None) 减法 tf.mul(x, y, name=None) 乘法 tf.div ...
- 活动代码页437--修改windows的系统编码
1.首先查看系统编码 win+R打开运行,输入cmd回车,打开命令提示符窗口,输入chcp回车,会查询当前系统的活动代码页,它指明了当前系统使用的编码: 或者,打开cmd后,点击cmd窗口左上角图标, ...
- wincc项目移植和复制解决办法
wincc项目复制 wincc项目不支持直接复制,部分的后台数据库在活跃状态,直接复制wincc项目,会提示跳过活跃状态的数据库,当跳过活跃数据库时,复制的项目也是无效的.在wincc项目管理器中打不 ...
- Centos 7 搭建DNS笔记
bindind的程序包 bind-libs:被bind和bind-utils包中的程序共同用到的库文件: bind-utils:bind客户端程序集:提供了,dig , host, nslookup等 ...