用户空间和内核空间
用户空间:用户程序的运行空间
内核空间:Linux 内核的运行空间
用户空间和内核空间完全隔离。当进程运行在内核空间时就处于内核态,当进程运行在用户空间时就处于用户态
IO
用户空间发起IO调用,内核空间执行IO,获取数据后复制数据到用户空间,完成IO
同步阻塞IO
用户空间发起read请求,等待数据;
内核空间接收到数据,将数据拷贝到用户空间;
用户空间读到数据,返回,阻塞解除。
同步非阻塞IO
用户空间发起read请求,如果没有读到数据,立即返回并循环调用read请求;
内核空间接收到数据,将数据拷贝到用户空间;
用户空间读到数据,返回。
异步阻塞IO(IO多路复用)
用户空间发起read请求,并返回;
用户空间调用select、poll、epoll等方法等待接收数据;
内核空间接收到数据,发送消息到用户空间,进程发起read请求;
内核空间将数据拷贝到用户空间;
用户空间读到数据,返回。
异步非阻塞IO
用户空间发起read请求,并返回;
内核空间等待接收数据;
内核空间接收到数据,将数据拷贝到用户空间;
内核空间发送消息到用户空间;
用户空间读到数据,返回。
epoll
相比于select、poll,epoll采用epoll_ctl添加等待事件维护socket的等待队列,避免频繁地将用户进程加入到Socket等待队列;socket收到数据后,select需要将socket列表拷贝到用户空间,并遍历每一个socket确定哪一个socket存在数据,并对而socket数量限制。而epoll只关注rdlist,不需要遍历所有socket,也没有socket数量限制。