BIO、NIO、IO多路复用、epoll实现IO多路复用

BIO和NIO详解
BIO(BIO是阻塞的,多个怎么获取操作通道传来的信息?创建多个线程。线程创建太多,会导致cpu频繁晶振切换线程执行,影响效率不好,根本原因不是线程,而是阻塞)

NIO(非阻塞的,你不必等待,那么一个线程就可以了,但是要循环去获取多个,假如有1000个客户端连接,每循环一次就要调用1000次,而不是每一次都有数据过来,我只想要有数据过来的数据,其余的去轮训read就造成了系统调用的浪费,假如只有一个连接有数据过来,而他刚好在轮训的最后一次,前面999次read系统调用都是没有意义的O(1000),最好做到即便1000个客户端只有一个到达,我去循环获取也只要一次就获取到了,循环内O(1),就是你只把有数据的给我轮训就行了。)

IO多路复用(假如有1000个客户连接,我都拿过来,一次性通过select/poll传递给内核,内核去轮训把我要的有数据的连接返给我,我再轮训获取所有的干货。相对与NIO来说,循环是在内核中,避免了NIO循环的用户态和内核态的频繁切换,而用户态和内核态的切换是很耗性能的,看起来完美了,但是还有小瑕疵,每次都要传1000个客户的fds,能不能上次传过的就不要传了,你只传新的)

epoll实现IO多路复用(epoll_create 开辟内存空间,epoll_ctrl把要监听是fd5 accept添加到该内存空间,然后epoll_wait阻塞等待,如果客户端事件来了,就把对应的从空间内的fd5 accept复制到另一个专门为epoll wait的空间,返回给程序,程序拿到数据知道你是要连接,epoll_ctl对fd9注册下一次监听,重新epoll_wait。也就是如果有1000个客户,这个内存空间就会有1000个文件描述符,客户端事件来了,对应的客户端事件就会被epoll_wait拿到。简单来说就是:程序每次循环找的是o(发生事件fd的数量)的EPOLL_WAIT,每一个fd o(发生事件fd的数量)通过epoll_ctl添加到内核。)

你可能感兴趣的:(IO)