zoukankan      html  css  js  c++  java
  • java io 模型重点讲述

    java io 模型重点讲述

    bio(阻塞)

    同步IO 接受请求与处理请求用同一条线程,当需要维持多条连接时就要用多线程,一条线程一个连接。这样太耗性能了。

    nio (异步非阻塞)

    为了解决BIO的使用线程一个连接的问题,不能想出一个办法就是:用一个线程负责接收并放到一个list里,然后不断地遍历这个连接池去读取数据。这样的代码如果在jvm里运行的话性能也不是很高,所以把这个工作交了给系统内核去做。
    linux-epoll 或 windows-select 函数去负责。
    与aio类似,不同之此在于,aio回调完成事件时,数据已经复制到应该用程序中了(jvm),而noi还需要通过API去系统的接收区中读。接收缓冲区的选用很重要。
    缓冲区类型主要有三种:jvm,jvm外,文件映射(mappedbytebuffer)。noi主要选择还是jvm外的缓冲区。
    一个好缓冲区的影响性能的因素有:同时读写,动态扩容大小。
    它决定了异步通讯的稳定性和高效率性。nio的一个实现框架是netty,他设计了一套接口bytesbuf,compositebytebuf实现类,可以按需求去实现自己的bytesbuf实现类。

    aio

    应用程序线程会向系统注册一个socket请求,以及一个回调方法,继续执行下去。socket接受区的数据监控交给系统,当数据到达接收区,系统就将接收区的数据读到应用程序的缓冲区中,再回调用注册的方法去读取数据。
    aio 在linux上没有真正的实现,而在windows上才是真正的实现了异步IO模型。当系统有数据会触发应用的回调事件读取数据没有任何阻塞。

  • 相关阅读:
    TCP—为什么是AIMD?
    虚拟机是怎么实现的?
    漫谈linux文件IO
    关于大型网站技术演进的思考
    大公司里怎样开发和部署前端代码
    spawn-fcgi 代码介绍
    使用python传参form-data格式的txt请求接口
    实战scrapy抓取站长图片数据
    通过requests和lxml模块对网站数据进行爬取
    centos7.5下安装jenkins
  • 原文地址:https://www.cnblogs.com/wolf12/p/8988506.html
Copyright © 2011-2022 走看看