概述
在java1.4之前,java对IO操作并不友好.主要问题如下:
- 没有数据缓冲区,IO性能存在问题
- 没有C和C++中的Channel概念
- 同步阻塞IO,通常会导致通信线程长时间阻塞
- 支持字符集有限,硬件可移植性不好
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多路复用技术进行处理.
- 服务器需要同时处理多个处于监听状态或多个连接状态的套接字
- 服务器需要同时处理多种网络协议的套接字
目前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时
主要类:
- 异步IO操作缓冲区 ByteBuffer
- 异步IO操作管道Pipe
- 各种IO操作的Channel
- 各种字符集的编码能力和解码能力
- 实现非阻塞IO操作的多路复用器 Selector
- 文件通道FileChannel
- 基于流行Perl的正则表达式类库
缺点
- 没有统一的文件属性
- API能力比较弱,列入目录的级联操作和递归遍历
- 底层存储系统一些高级API无法使用
- 所有文件操作都是同步阻塞调用,不支持异步文件读写操作
JDK1.7时
支持AIO异步IO.提供批量获取文件属性的API,实现通道功能
最后
以上就是干净铅笔为你收集整理的第一章:Netty之路: IO演变的全部内容,希望文章能够帮你解决第一章:Netty之路: IO演变所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复