我是靠谱客的博主 干净铅笔,最近开发中收集的这篇文章主要介绍第一章:Netty之路: IO演变,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在java1.4之前,java对IO操作并不友好.主要问题如下:

  1. 没有数据缓冲区,IO性能存在问题
  2. 没有C和C++中的Channel概念
  3. 同步阻塞IO,通常会导致通信线程长时间阻塞
  4. 支持字符集有限,硬件可移植性不好

Linux网络模型

Linux的内核将所有的外部设备看做一个文件夹操作,对于一个文件的读写都会调用内核系统命令,返回一个file description

根据Unix网络编程对IO模型分类,主要分为以下5种IO模型:

1.阻塞IO

最常用的IO模型,缺省情况下,所有文件操作都是阻塞的.

2.非阻塞IO

与阻塞IO不一样的地方是recvform从应用层到内核的时候,都会有单独的线程轮询检测EWOULDBLOCK状态来判断内核是否有数据来.

3.IO多路复用技术:select/poll

Linux所提供的select/poll中,进程将一个或多个fd传递给select或poll系统调用,阻塞到select操作上.系统就可以通过select/poll体制来检测多个fd是否处于就绪状态.

4.信号驱动IO模型: epoll

首先系统开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数.当数据准备就绪的时候,就会为该进程生成一个SIGIO信号,通过信号通知应用程序调用recvfrom来读取数据

5.异步IO

与信号驱动的区别: 信号驱动由内核通知我们何时开始一个IO操作;异步IO模型由内核通知我们IO操作何时已经完成

 

应用:

在IO编程过程中,当需要同时处理多个客户端介入请求,可以利用多线程或IO多路复用技术进行处理.

  1. 服务器需要同时处理多个处于监听状态或多个连接状态的套接字
  2. 服务器需要同时处理多种网络协议的套接字

目前IO多路复用的系统调用有select , pselect , poll, epoll 在Linux网络编程过程中,很长的有单时间都是用select做轮询和网络时间通知.但select的一些固有缺陷导致了它应用受到了很大的限制.最终Linux不得不在新的内核版本中寻找select替代品 ----- epoll:

Epoll特点:

        1.支持一个进程打开的socket描述符(FD)不收限制(仅仅受限于操作系统最大文件句柄数)

        2.IO效率不会随着FD数目增大而线性下降

        3.使用mmap加速内核与用户控件的消息传递

        4.API更加简单

Java NIO 演变

JDK1.4时

         主要类:

  1. 异步IO操作缓冲区 ByteBuffer
  2. 异步IO操作管道Pipe
  3. 各种IO操作的Channel
  4. 各种字符集的编码能力和解码能力
  5. 实现非阻塞IO操作的多路复用器 Selector
  6. 文件通道FileChannel
  7. 基于流行Perl的正则表达式类库

缺点

  1. 没有统一的文件属性
  2. API能力比较弱,列入目录的级联操作和递归遍历
  3. 底层存储系统一些高级API无法使用
  4. 所有文件操作都是同步阻塞调用,不支持异步文件读写操作

JDK1.7时

         支持AIO异步IO.提供批量获取文件属性的API,实现通道功能

最后

以上就是干净铅笔为你收集整理的第一章:Netty之路: IO演变的全部内容,希望文章能够帮你解决第一章:Netty之路: IO演变所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部