默默学Netty(一)I/O基础
Java早期版本对IO支持并不完善,直至JDK1.4陆续开始支持IO。
I/O模型简单可分为:
- 阻塞I/O模型
- 非阻塞I/O模型
- I/O复用模型
- 信号驱动I/O模型
- 异步I/O模型
阻塞I/O模型
以read为例,应用进程recvfrom到内核空间系统调用,如果无数据报,则挂起应用进程。直至有数据报,在内核空间系统调用I/O模块将数据报放到PageCache中,再从PageCache复制到应用缓冲。
非阻塞IO模型
应用线程recvfrom到内核时,若无数据则直接返回一个EWOULDBLOCK错误,轮询调用看内核是不是有数据到来。
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复用模式的差别在于此模式使用进程SIGIO信号的方式,待有数据后通过信号回调通知应用进程调用recvfrom读取数据。
异步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。
参考地址
版权声明:本文为博主原创文章,未经博主允许不得转载。转载请标明出处:
https://blog.****.net/caohao1210
https://blog.****.net/caohao1210/article/details/80889209