我只是想开个饭店—— 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。

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

时间: 11-28

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

基本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也对块传输提供支持,在核

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

SPICE简史

SPICE简史 如今,每一天都有不知其数的半导体芯片设计公司与设计验证工程师,在用着电路仿真软件SPICE.SPICE广泛应用在仿真模拟电路(例如运放Op Amp,能隙基准稳压电源Bandgap Reference,数模/模数转换AD/DA等),混合信号电路(例如锁相环PLL,存储器SRAM/DRAM,高速输入/输出接口high-speed I/O),精确数字电路(例如延时,时序,功耗,漏电流等),建立SoC的时序及功耗单元库,分析系统级的信号完整性,等等.作为最早的电子设计自动化软件,它今天仍

对弈类游戏的人工智能(5)--2048游戏AI的解读

前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对应上. 于是有了想法, 想把它作为一个实例来进行解读, 从而对之前偏理论的文章做个总结. 承接上四篇博文: (1). 评估函数+博弈树算法 (2). 学习算法 (3). 博弈树优化 (4). 游戏AI的落地 可能有些人会疑惑? 2048并非对弈类类型? 传统的博弈树模型是否能应用于此? 客官莫急, 让我们来一

Java实现多线程生产者消费模型及优化方案

生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 */class Resource { private String name; private int count = 1; //计数器,记录有多少只烤鸭被生产及消费 private boolean flag = false; //停止标记 public synchronized void set