第一章:Netty之路: IO演变

本文探讨了Linux的五种IO模型:阻塞、非阻塞、IO多路复用、信号驱动和异步IO,并详细介绍了IO多路复用技术中的epoll特性。在Java NIO方面,从JDK1.4到JDK1.7的演进,包括ByteBuffer、Pipe、Selector、FileChannel等,并指出其在API能力和异步IO上的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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,实现通道功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值