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演进之路的更多相关文章

  1. 第一章 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/ ...

  2. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  3. javaSE习题 第一章 JAVA语言概述

    转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...

  4. 第一章 –– Java基础语法

    第一章 –– Java基础语法 span::selection, .CodeMirror-line > span > span::selection { background: #d7d4 ...

  5. 第一章 java基本多线程技能

    第一章 java多线程技能 1 线程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理顺序时发生的活动:是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位. ...

  6. (基础篇 走进javaNIO)第一章-java的i/o演进之路

    Java 是由 SUN公司在 1995 年首先发布 的编程语 言和计算平 台.这基础技术 支持最新 的程序 ,包括 实用程序 .游 戏和业 务应用程序 .J ava 在世界各地 的 8.5  亿 多 ...

  7. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  8. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  9. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述

    第1章 Java程序设计概述1.1 Java程序设计平台 具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求. 可移植性 垃圾收集 提供大型的库  如果想要有奇特的绘 ...

随机推荐

  1. 给Oracle字段和表加注释

    给字段加注释 comment on column testtb17.AGE is '年龄';comment on column testtb17.CREATEDTIME is '创建时间';comme ...

  2. TCP为什么会出现 RST

    就目前遇到的情况而言,都是负载设备,或健康检查设备发送的. 为什么会出现 RST 因为具有周期性,我大概猜到了,是 lvs 对我的后端服务的健康检查导致的,联系了网络运营服务客服人员,我把.pcap给 ...

  3. Oracle列信息表 all_tab_columns中的data_length和data_precision字段区别

    Oracle列信息表 all_tab_columns中的data_length和data_precision字段区别 区别: 这两个属性都属于user_tab_columns视图,他们的含义:1,da ...

  4. JEECG Hibernate 自动更新 持久化

    Hibernate不调用update却自动更新 - 七郎 - 博客园http://www.cnblogs.com/yangy608/p/4073941.html hibernate自动更新持久化类的问 ...

  5. selenium grid用法

    一,selenium grid是什么? selenium是一个用于UI自动化测试的工具. selenium grid是selenium家族中的三大组件的一员.selenium grid有两个版本,gr ...

  6. 品优购商城项目(二)AngularJS、自动代码生成器、select2下拉多选框

    品优购商城想项目第二阶段 AngularJS.自动代码生成器.select2下拉多选框 完成了课程第三天.第四天的的任务. 1.学习了AngularJs前端的mvc分层思想,js部分分成control ...

  7. training 2

    Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.136 Average Precision (AP) @[ IoU ...

  8. iOS 控制输入框的字数?(textFliedView,textFlied等)

    //控制输入框的字数 - (void)textViewDidChange:(UITextView *)textView { NSInteger number = [textView.text leng ...

  9. 使用JSQLParser解析SQL中涉及到的表

    首先添加Maven依赖: <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId& ...

  10. ASP.NET全球化与本地化 c#多国语言的支持 (项目支持多国语言的开发)

    ASP.NET 2.0及以上的开发平台,为全球化本地化应用程序提供了工具,而且实现起来非常简单.以下内容是使用c#,按照帮助一步步做的,将为初学者提供详细的实现步骤. 一 几个必要概念 (一) 支持全 ...