网络IO会涉及到同步,异步,阻塞,非阻塞等几个概念。一个网络IO读取过程是数据从 网卡 到 内核缓冲区 到 用户内存 的过程。同步和异步区别在于数据从内核到用户内存的过程是否需要用户进行等待。
Unix环境下经典的IO模型包括:同步阻塞,同步非阻塞,IO复用,信号量驱动,异步非阻塞 这5种。
同步阻塞:网络编程中,读取客户端数据需要调用recvfrom。默认情况下这个调用会一直阻塞到数据接收完毕,是个同步阻塞的IO。
同步非阻塞:这种编程中将socket设置成O_NONLOCK即可,只对于网络IO有效,对于磁盘IO无效。是一个不断主动轮训获取的过程的方式。
IO复用:是一种进程预先告知内核的能力,让内核发现进程指定的一个或多个IO条件就绪,然后通知进程,使得进程能在一连串的事件进行等待。
多路复用涉及到:select,poll和epoll。select和poll原理基本相同:
select单个进程打开fd的数量是有限的,select受限于FD_SIZE。poll通过pollfd数组向内核传递需关注的事件,避开文件描述符限制。
select和poll包括大量的fd数组的被整体复制于用户态和内核态空间地址之间,开销随着fd数量增加而增加。
多路复用中的事件驱动是epoll实现的:
信号量驱动:在事件完成之后,通过信号量通知进程。
但是Linux信号量队列是有限的,如果超出了的信号数据是无法读取的。
异步非阻塞:
这种方式是内核处理好数据,不需要用户进程来获取,而是直接发送到用户进程中。
有BIO,NIO,AIO。
一般不用了解,直接上Netty就可以了。