duyue6002 / Blog

:pencil2: Write here
http://duyue6002.github.io/Blog/#/
5 stars 1 forks source link

[网络]同步I/O #3

Open duyue6002 opened 5 years ago

duyue6002 commented 5 years ago

同步阻塞

一个进程要等另一个进程做完才能进行,在等待数据到处理数据的两个阶段,整个进程被阻塞。

同步非阻塞

需要一直轮询CPU是否有空。

I/O多路复用

循环查询多个任务的完成状态,只要有任何一个任务完成,就去处理它。select调用内核级别的,select轮询相对非阻塞轮询区别在于——前者可以等待多个socket,实现同时对I/O端口监听,当其中任何一个socket数据准备好了,就返回进行可读,然后进程再进行recvform系统调用,将数据由内核拷贝到用户进程,这个过程是阻塞的。select调用后,会阻塞进程,与同步阻塞不同的是,此时的select不是等到socket数据全部到达再处理,而是有了一部分数据就会调用用户进程来处理。

select、poll、epoll函数不断轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。用户进程调用了select后,整个进程会被block。kernel监听所有select负责的socket,当任何一个socket数据准备好了,select会返回,用户进程再调用read操作,将数据从kernel拷贝到用户进程。

同步非阻塞方式把多个I/O请求丢到后台,一个进程里服务大量的并发I/O请求。

同步、异步区别:同步是主动等待消息通知,异步是被动接收消息通知,通过回调、通知、状态等方式被动获取消息。

I/O多路复用在阻塞到select阶段时,用户进程主动等待并调用select函数获取数据就绪状态消息,其进程状态为阻塞。

信号驱动式I/O

允许socket进行信号驱动I/O,安装信号处理函数,进程继续进行不阻塞。

异步I/O

不是顺序执行,进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,用户态进程可以去做别的事情。socket数据准备好,内核直接复制数据给进程,内核向进程发送通知。两个阶段,进程都是非阻塞的。内核发送“信号”通知。