同步/非同步 阻塞/非阻塞

  1. 同步非同步是指当内核态数据准备好之后,线程是否需要等待数据从内核态拷贝到用户态
  2. 阻塞/非阻塞是指用户询问内核数据是否准备好的时候会不会等待,阻塞的时候就一直等待,不继续执行。非阻塞时也要进行轮询操作

    io的分类

  • 阻塞IO
  • 非阻塞IO
  • IO多路复用
  • 异步IO
  • 事件驱动IO

socket通信主要有两个方面

  1. 网络数据到达网卡,进入内核态
  2. 数据从内核态拷贝到用户态

阻塞IO

发起系统调用后,线程在两个阶段都会被阻塞,直到数据到达完毕,并从内核态拷贝到用户态。
image.png

非阻塞IO

发起系统调用之后,线程第一个阶段不会被阻塞,如果数据没有到达的话,就会直接返回结果。但是这种方法需要用户不断进行轮询。当数据到达以后,就可以从内核态拷贝到用户态,这个步骤还是要阻塞的。
image.png

IO多路复用

主要意义在于单个线程可以监听更多的端口
用户发起select调用,此时会被阻塞。但select代替用户进行轮询,直到某个socket的数据到达完成,返回给用户进程。用户再发起数据调用,将数据从内核态拷贝到用户态,这个过程也是阻塞的。
image.png

select/epoll/poll

三个都是IO多路复用