默默学Netty(一)I/O基础

Java早期版本对IO支持并不完善,直至JDK1.4陆续开始支持IO。
I/O模型简单可分为:

  • 阻塞I/O模型
  • 非阻塞I/O模型
  • I/O复用模型
  • 信号驱动I/O模型
  • 异步I/O模型

阻塞I/O模型

阻塞I/O模型
以read为例,应用进程recvfrom到内核空间系统调用,如果无数据报,则挂起应用进程。直至有数据报,在内核空间系统调用I/O模块将数据报放到PageCache中,再从PageCache复制到应用缓冲。

非阻塞IO模型

非阻塞I/O模型
应用线程recvfrom到内核时,若无数据则直接返回一个EWOULDBLOCK错误,轮询调用看内核是不是有数据到来。

I/O复用模型

I/O复用模型
linux提供select/poll,进程将一个或多个fd传给select/poll调用,线程挂起。select/poll顺序扫描fd是否就绪,数据就绪后,线程唤起recvfrom。
注:支持I/O多路复用的系统调用有select、pselect、poll、epoll,很长一段时间linux都用select做轮询和网络事件通知。select的一些固有缺陷导致了它的应用受到了很大的限制,最终linux不得不在新内核版本中使用epoll替代了select。(FD不再受一个进程打开数量限制、I/O效率不会随FD增多而降低、使用mmap减少了数据复制、epoll更加简单)

信号驱动I/O模型

信号驱动I/O模型
此模型为异步阻塞模式,与I/O复用模式的差别在于此模式使用进程SIGIO信号的方式,待有数据后通过信号回调通知应用进程调用recvfrom读取数据。

异步I/O模型

异步I/O模型
异步I/O有点结合上述两种模型,与信号驱动模式的差别在于通知给应用不在是合适可以读取数据,而是数据I/O已操作完成。

Java I/O发展

java在JDK1.0到1.3提供的IO都非常原始,很多UNIX网络编程的概念或者接口在I/O库中都没有体现,JDK1.4开始提供NIO开发API和库,在JDK1.7提供了升级,称为NIO2.0。


参考地址

  1. UNIX网络编程IO模型

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请标明出处:
https://blog.csdn.net/caohao1210
https://blog.csdn.net/caohao1210/article/details/80889209

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值