第一章 Java的IO演进之路
Unix中5种IO模型
就网络通信而言,一次数据读入可以分为两个阶段,首先等待数据从网络中到达,到达后需要复制到内核的缓冲区中,第二个阶段是从内核的缓冲区复制到进程的缓冲区,复制到进程的缓冲区才算读取完毕。推广到所有IO,一次完整的IO读入分为两个阶段
- 等待数据准备完毕
- 把准备好的数据读到进程的内存空间
各种IO模型的区别在于当一个进程读取的数据没有准备好的时候该进程如何应对。
阻塞式IO
等待数据准备阶段,进程会一直阻塞,直到数据准备好或者抛出异常。调用recvfrom默认是阻塞式调用,当fd对应的数据没有准备好recvfrom会一直阻塞。

非阻塞式IO
recvfrom的非阻塞式调用,recvfrom对应的fd如果没有准备好数据,会返回EWOULDBLOCK,代表数据没有准备好,请求数据的进程不会阻塞而是立即返回。代表数据没有准备好。

IO复用模型
如果一个进程同时对多个fd感兴趣,可以把多个fd注册到select方法上,当注册的fd有数据准备好select会通知调用线程。广义而言这是一个阻塞模型,不同于阻塞IO,IO复用模型阻塞在select上,阻塞式IO阻塞在recvfrom上。
select的缺点在于如果轮询的文件描述符不够多,调用select的代价大于直接调用recvfrom的代价。且select能够同时监听的文件描述符的数量受限于内核的参数。
信号驱动IO模型
当数据没有准备好的时候,调用进程直接返回。等数据准备好的时候通过一个信号通知调用进程。这种模型应该也是一种非阻塞的模型,毕竟在没有读到数据的时候进程没有阻塞。区别于上述非阻塞模型,这种模型只需要询问一次数据是否准备好,然后只需要等待信号通知而后再次调用recvfrom,而上述非阻塞模型需要在没有获得数据的时候一直循环读数据。
异步IO
比信号驱动模型更高级,信号驱动模型中,进程在收到通知的是可以开始一个IO操作,异步IO模型中收到的通知是数据以及读取完毕。

- 只有最后一种IO模型是异步的,前四种模型在真正的IO操作中会阻塞进程,异步IO收到信号后数据以及读到进程缓冲区了
- 同步IO指在IO请求过程中进程阻塞,这个IO请求指的是在数据以及准备好了后真正执行recvfrom
IO多路复用
早期的IO多路复用技术采用select系统调用,由于select的一些固有缺陷如能够监听的最大文件数受限,后来采用epoll。其优点在于
- 注册的fd不受限制,select默认最大能够注册的文件描述符为1024个
- 效率不会因注册fd增多而降低。select会线性的扫描所有注册的fd,当注册的fd过一次线性扫描的时间会增加。epoll是一种“伪异步”,epoll依据fd上回调函数来实现。
第一章 Java的IO演进之路的更多相关文章
- 第一章 Java的I/O演进之路
I/O基础入门 Java的I/O演进 第一章 Java的I/O演进之路 1.1 I/O基础入门 1.1.1 Linux网络I/O模型简介 根据UNIX网络编程对I/O模型的分类,UNIX提供了5中I/ ...
- Java基础知识二次学习-- 第一章 java基础
基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...
- javaSE习题 第一章 JAVA语言概述
转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...
- 第一章 –– Java基础语法
第一章 –– Java基础语法 span::selection, .CodeMirror-line > span > span::selection { background: #d7d4 ...
- 第一章 java基本多线程技能
第一章 java多线程技能 1 线程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理顺序时发生的活动:是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位. ...
- (基础篇 走进javaNIO)第一章-java的i/o演进之路
Java 是由 SUN公司在 1995 年首先发布 的编程语 言和计算平 台.这基础技术 支持最新 的程序 ,包括 实用程序 .游 戏和业 务应用程序 .J ava 在世界各地 的 8.5 亿 多 ...
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- 深入Java虚拟机读书笔记第一章Java体系结构介绍
第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...
- Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述
第1章 Java程序设计概述1.1 Java程序设计平台 具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求. 可移植性 垃圾收集 提供大型的库 如果想要有奇特的绘 ...
随机推荐
- [原]error LNK2005:"XXX已经在 XXX.obj 中定义 使用 /FORCE(强制文件输出)暴力解决
参考:https://blog.csdn.net/LG1259156776/article/details/80828720 https://blog.csdn.net/cai18381306175/ ...
- Linux_CentOS软件安装yum
在 Linux 操作系统下,几乎所有的软件均通过 RPM 进行安装.卸载及管理等操作.RPM 的 全称为 Redhat Package Manager ,是由 Redhat 公司提出的,用于管理 Li ...
- libfacedetection 人臉識別
计算相似度,然后比对 QVector<cv::Point> vec_point1 = facedetect_frontal_surveillance4(face_img.clone()); ...
- netty5客户端监测服务端断连后重连
服务端挂了或者主动拒绝客户端的连接后,客户端不死心,每15秒重连试试,3次都不行就算了.修改下之前的客户端引导类(NettyClient,参见netty5心跳与业务消息分发实例),新增两个成员变量,在 ...
- 转 linux下ClamAV使用
linux下ClamAV使用 第一步:Clamav下载http://www.clamav.net/downloads#yuminstall wget –y第二步:创建clamav用户和组groupad ...
- 【436】Solution for LeetCode Problems
Coding everyday. ^_^ 1. Two Sum 重点知识:指针可以存储数值,通过 malloc 新建数组 int* returnSize:Size of the return arra ...
- snmp oid 和厂商对应关系
<node oid="default" name="Unknown" type="workstation"/><node ...
- WebSocket接收音频,并推送到声卡上
使用信息 import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableM ...
- 今天被这个BDE错误搞了半天,不过终于好了,分享一下
今天正编译程序时,突然就报了这个错误出来,重启电脑都没用,多亏网上高手指教,先把解决方案列于下,供受此累得朋友查阅,自己也留底供查找:"Shared memory conflict ($21 ...
- Swift 4.0 + Ipad开发项目中值得注意知识点
1.注意Xib的约束和代码的约束,注意适配问题: 2.设置view的frame可以使用view.frame.maxX实现布局: 3.UIStackView在xib中的使用,可以很好的实现约束,布局和屏 ...