java输入输出 -- I/O模型简述
一、简介
本文向大家介绍五种I/O模型。分别是阻塞I/O、非阻塞I/O、I/O复用、信号驱动式I/O、异步I/O等。内容参考《UNIX网络编程》,大家想进深入学习网络编程,建议去读读这本书。
二、模型介绍
(一)、阻塞I/O模型
阻塞I/O是最简单的I/O,一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。

上图中,应用进程通过系统调用 recvfrom 接收数据,但由于内核还未准备好数据报,应用进程就阻塞住了。直到内核准备好数据报,recvfrom 完成数据报复制工作,应用进程才能结束阻塞状态。
这里简单解释一下应用进程和内核的关系。内核即操作系统内核,用于控制计算机硬件。同时将用户态的程序和底层硬件隔离开,以保障整个计算机系统的稳定运转(如果用户态的程序可以控制底层硬件,那么一些病毒就会针对硬件进行破坏,比如 CIH 病毒)。应用进程即用户态进程,运行于操作系统之上,通过系统调用与操作系统进行交互。上图中,内核指的是 TCP/IP 等协议及相关驱动程序。客户端发送的请求,并不是直接送达给应用程序,而是要先经过内核。内核将请求数据缓存在内核空间,应用进程通过 recvfrom 调用,将数据从内核空间拷贝到自己的进程空间内。大致示意图如下:

阻塞 I/O 理解起来并不难,不过这里还是举个例子类比一下。
例1:假设大家日常工作流程设这样的(其实就是我日常工作的流程
java输入输出 -- I/O模型简述的更多相关文章
- JAVA常见面试题问题简述(持续更新中)
JAVA常见面试题问题简述 1. springcloud和dubbo的区别 ①相比之下springcloud 的社区会更加活跃,解决问题的速度也会越来越快,dubbo相对来说如果碰到没有解决的问题,就 ...
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...
- java 输入输出 io
学习JAVA 输入输出篇 java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner.实例程序:一,利用 Scanner ...
- Java对象的内存模型(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- Java虚拟机:内存模型详解
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...
- Java多线程与并发模型之锁
这是一篇总结Java多线程开发的长文.文章是从Java创建之初就存在的synchronized关键字引入,对Java多线程和并发模型进行了探讨.希望通过此篇内容的解读能帮助Java开发者更好的理清Ja ...
- java虚拟机的内存模型
一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...
- I/O模型之四:Java 浅析I/O模型(BIO、NIO、AIO、Reactor、Proactor)
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- 【UML】Java代码与UML模型相互转换方法
最近重温了一下设计模式,看到大家的博客里面都是Java代码+UML视图,UML表达整体框架,然后再秀出具体的代码,点面结合.一目了然.所以也研究了一下Java代码与UML模型相互转换方法. 一.常用的 ...
随机推荐
- 小程序can't read property 'push' of undefined
在某些情况下是因为没有初始化,所以初始化一下就好了
- 4)抽象方法不能为private,final或者static,为什么?
抽象方法的最实质的意 义在于被未来的子类覆盖实现掉.它自己是个空方法.private的实质意义在于本类其他方法调用它.你自己是个空方法,别人调用你有什么用?所以 abstract和private在一起 ...
- linux process cycle
As already discussed, a new process is created through fork() and if a new executable is to be run t ...
- OpenFOAM中的基本变量快速认知【转载】
转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102vsf9.html label 实际上就是整型数据的变体,int,OF对它进行了包装,以适应32或64位系 ...
- mysql 对返回的值是null进行判断和重新赋值
SELECT IFNULL(sum(c.tax_data),) ,IFNULL(SUM(c.fiscal_ret),) FROM corp_tax c WHERE c.industry_id = 使用 ...
- Windows下的apache maven安装与配置
去到官网http://maven.apache.org/download.cgi下载压缩包我选择的是二进制zip压缩文件. 解压并配置压缩文件的目录到MAVEN_HOME环境变量,添加解压文件下的bi ...
- fidder监控请求响应时间和请求IP
1.增加监控请求的详情时间 在CustomRules.js的class Handlers中增加 //添加请求的响应时间 public static BindUIColumn("Time T ...
- socket_timeout
https://github.com/pika/pika/blob/03542ef616a2a849e8bfb0845427f50e741ea0c6/docs/examples/using_urlpa ...
- 008-多线程-JUC集合-Queue-LinkedBlockingQueue
一.概述 LinkedBlockingQueue是一个单向链表实现的阻塞队列.该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素.链接队列的吞吐量 ...
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_12-SpringSecurityOauth2研究-JWT研究-生成私钥和公钥
3.6.3 JWT入门 Spring Security 提供对JWT的支持,本节我们使用Spring Security 提供的JwtHelper来创建JWT令牌,校验JWT令牌 等操作. 3.6.3. ...