默默学Netty(一)IO基础

xiaoxiao2021-02-28  26

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。


参考地址

UNIX网络编程IO模型

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

转载请注明原文地址: https://www.6miu.com/read-2250230.html

最新回复(0)