同步/非同步 阻塞/非阻塞
- 同步非同步是指当内核态数据准备好之后,线程是否需要等待数据从内核态拷贝到用户态
- 阻塞/非阻塞是指用户询问内核数据是否准备好的时候会不会等待,阻塞的时候就一直等待,不继续执行。非阻塞时也要进行轮询操作
io的分类
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 异步IO
- 事件驱动IO
socket通信主要有两个方面
- 网络数据到达网卡,进入内核态
- 数据从内核态拷贝到用户态
阻塞IO
发起系统调用后,线程在两个阶段都会被阻塞,直到数据到达完毕,并从内核态拷贝到用户态。
非阻塞IO
发起系统调用之后,线程第一个阶段不会被阻塞,如果数据没有到达的话,就会直接返回结果。但是这种方法需要用户不断进行轮询。当数据到达以后,就可以从内核态拷贝到用户态,这个步骤还是要阻塞的。
IO多路复用
主要意义在于单个线程可以监听更多的端口
用户发起select调用,此时会被阻塞。但select代替用户进行轮询,直到某个socket的数据到达完成,返回给用户进程。用户再发起数据调用,将数据从内核态拷贝到用户态,这个过程也是阻塞的。
select/epoll/poll
三个都是IO多路复用