我只是想开个饭店—— JavaIO模型的演变

  Java的IO。。。真的是我所见过的高级语言中。最最复杂的。。。

  

  看着这个图我也是醉了。

  但是不知不觉间,java的IO已经更新到了NIO.2了,IO库早已经不止是这个样子了,那么这个过程中,它们经历了怎么样的变化呢?在了解Java的IO之前,我们先来看看几种模型。

咱就是提供独家服务

  在jdk没有推出NIO之前,java使用的IO模型都是BIO(Block Input Output)模型。那么什么是BIO模型呢?

  简单来说就是一对一的服务。好比新开了一家餐厅,来了一位客人,就买一张桌子放到餐厅里面去(应该没有这么蠢的老板吧。。orz.....),来了一千位客人,就放一千张桌子……

    “我去,餐厅不够大啊。。。。怎么破?”

  这个时候只能任性了……

    “买买买!咱再租一个场地,开个新店!”

  这就是传统的BIO模型,相当“任性”的模型,服务端会使用一个Acceptor线程监听客户端的连接,每当一个客户机向服务端发起一个链接,服务端就创建一个线程( Thread),当并发访问量增大,只能通过“买买买”的方法解决问题了。

  那么问题来了,T^T.

  “刚刚是做梦呢!我们真的好穷啊。”

开窍的老板

  “咱搞个排号不就完事了么?”

  咱就这么多桌子,事先都买好了,每次客人坐满了之后,之后来的客人只能在外面等着了(没办法,谁让咱的饭菜就是这么好吃!)。

  这便是伪异步IO模型了。当客户端发起一个请求个服务端,服务端将请求封装成一个任务(Task)放入之前已经准备好的线程池(Thread Pool)。当并发请求数量超过线程池规定的大小时,迟一点发起的线程只能默默在队列中等待线程池中的资源了。

  相比BIO模型,这个模型已经提升了很多性能了。

  但是。。他还是伪异步IO模型!也许是名气太大了。越来越多的客人慕名而来。门口的等地区要挤爆了啊~~如果每桌的客户吃饭的时间又比较长(IO是阻塞的,需要等待IO执行完毕才会释放资源),咱根本hold不住啊!

是时候,展现我们的智慧了

  我们更新了餐厅的排号系统,为了让有限的空间释放出最大的能量,我们也是蛮拼的。我们开始意识到客人是喜欢我们的食物的,那么让客人能及时地享用我们的食物才是最重要的(PM们,明确的需求分析很重要啊!)。

  我们把排号系统放到了网上,大家可以点外卖啊。客人们事先点好需要的食物,我们把食物做好后送到客人面前(服务很贴心,有木有!)。在这个期间,客人们可以去做自己的事情,而不会因为等待时间过长而感到烦躁。

  是的,这就是New IO,java在1.4版本之后,提供了新的IO库,当然在jdk1.7中,NIO已经被升级到NIO.2了。客户端发出请求后,请求会立即返回。当服务端准备好数据后,就会把数据送回客户端。(可以看下我上一篇的博客《Please Call Me NIO》)

总结

  这里简单分析了几个IO模型,接下来,我会结合一些代码继续写几篇blog。

  最后,但愿世界上没有这么无脑的餐厅~

时间: 2024-12-25 07:04:37

我只是想开个饭店—— JavaIO模型的演变的相关文章

JAVA-IO模型(BIO,NIO,AIO)

基本概念 阻塞和非阻塞 阻塞是进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待, 直到有东西可读或者可写为止 非阻塞是如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 同步和异步 同步是指的是用户操作后等待或者轮询的去查看操作是否就绪 异步是指用户某动作操作后便开始做其他动作,而当这个动作操作完成的时候用户会得到这个动作完成的通知 IO模型 同步阻塞IO(JAVA BIO): 在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成

基本I/O模型与Epoll简介

5种基本的I/O模型:1)阻塞I/O ;2)非阻塞I/O; 3)I/O复用(select和poll);4)信号驱动I/O(SIGIO);5)异步I/O(POSIX.1的aio_系列函数). 操作系统中一个输入操作一般有两个不同的阶段: 第一:等待数据准备好.第二:从内核到进程拷贝数据.对于一个sockt上的输入操作,第一步一般是等待数据到达网络,当分组到达时,它被拷贝到内核中的某个缓冲区,第二步是将数据从内核缓冲区拷贝到应用程序缓冲区. 一.           阻塞I/O模型 请求无法立即完成

第3章 文件I/O(5)_五种I/O模型

6. I/O处理方式(5种I/O模型) (1)阻塞I/O模型:若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回.如:终端.网络设备的访问.整个过程分为两个阶段: ①阶段一是等待数据就绪,网络I/O的情况就是等待远端数据陆续抵达:磁盘I/O的情况就是等待磁盘数据从磁盘上读取到内核态内存中. ②阶段二是数据拷贝,出于系统安全,用户态的程序没有权限直接读取内核态内存,因此内核负责把内核态内存中的数据拷贝一份到用户态内存中.理解这两个阶段非常重要,后续I/O模型的演变都是针

模型选择的一些基本思想和方法

原文:http://cos.name/2015/08/some-basic-ideas-and-methods-of-model-selection/ 作者:高涛  编辑:王小宁 0. 引言 有监督学习是日常使用最多的建模范式,它有许多更具体的名字,比如预测模型.回归模型.分类模型或者分类器.这些名字或来源统计,或来源于机器学习.关于统计学习与机器学习的区别已经有不少讨论,不少人认为机器学习侧重于目标预测,而统计学习侧重于机制理解和建模.个人更加直观的理解是,统计学习侧重于从概率分布来描述数据生

Java输入输出流

1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

【转载】Java输入输出流-IO

转自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核

学习笔记-java IO流总结 转载

1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

Java总结输入流输出流

学习Java的同学注意了!!!  学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494  我们一起学Java! 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件

Entity Framework 教程——概述

Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是entity framework的各个重大版本 版本 功能 EF 3.5 提供database first功能 EF 4.0 POCO( Plain Old CLR Object / POCO )支持,延迟加载,可测试性改进.可自定义代码生成和 Model First 工作流. EF 4.1 在Nug