JavaNIO-通道06 Linux 网络IO模型

2019-07-25  本文已影响0人  贪睡的企鹅

1 Linux 网络IO模型

读取网络数据过程

/** 获取SocketChannel**/
SocketChannel socketChannel = serverSocketChannel.accept();
/** 读取客户端发送数据 **/
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
socketChannel.read(byteBuffer);
System.out.println(new String(byteBuffer.array()));
image

对于一次IO访问,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的缓冲区,最后交给进程。所以说,当一个read操作发生时,它会经历两个阶段:

正式因为这两个阶段,linux系统产生了下面五种网络模式的方案: 阻塞 I/O(blocking IO),非阻塞 I/O(nonblocking IO), I/O 多路复用( IO multiplexing), 信号驱动 I/O( signal driven IO),异步 I/O(asynchronous IO)

阻塞IO

同步阻塞IO通常表示当用户进程(java进程)底层调用操作系统recv()/recvfrom()函数接收数据。用户进程会在内核空间准备数据,内核空间拷贝到用户空间这两个过程都是阻塞的。

image
流程

非阻塞I/O模型

非阻塞I/O模型通常表示当用户进程(java进程)底层调用操作系统recv()/recvfrom()函数接收数据。内核空间数据没有准备好时会返回一个错误表示不接收处理,应用进程需要不断的询问直到内核空间数据准备好后接收处理,将内核空间数据拷贝到用户空间中返回成功

image
流程

I/O多路复模型

I/O多路复用实际上就是用select, poll, epoll监听多个io对象在内核缓存数据的准备过程,当io对象有变化(有数据)的时候就通知对应IO的用户进程。

image
流程

信号驱动IO

image

异步 I/O

image

(1)用户进程发起read操作之后,立刻就可以开始去做其它的事。

(2)而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。

(3)然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

2 同步、异步、阻塞、非阻塞

同步与异步:描述的是用户线程与内核的交互方式,同步指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍然继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞与非阻塞:描述是用户线程调用内核IO操作的方式,阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

上一篇 下一篇

猜你喜欢

热点阅读