面试经验4-21
今天学习的是IO的多路复用。
一、什么是流?
流是一个可以进行IO操作的内核对象。文件,管道,套接字等等都是流,流的入口是文件描述符。
二、阻塞和非阻塞:阻塞不占用cpu的时间片,非阻塞忙轮询占用cpu和系统资源。阻塞等待的缺点:对于多个I/O请求的问题,同一时刻只能处理一个流的阻塞监听。
三、多路I/O,既能阻塞等待,不占用CPU资源,又可以同时监听多个IO请求。
四、如何处理多个I/O任务。select和epoll。select只能告诉有I/O的状态的变化,但不能告诉你哪些是活跃的连接,监听的IO数量有限,默认是1024。epoll只关心活跃的连接,不需遍历全部描述符集合,能够处理大量的链接请求(系统可以打开的文件数目 /proc/sys/fd/file-max查看)。select好处是平台无关,epoll是linux独有的。
五、使用epoll:
创建,控制,等待epoll。
epoll_create(size), size代表监听的数目。内部会建立一个红黑树,根节点叫epfd。epoll_create返回一个epoll句柄。
epoll_ctr用来控制epoll,传入epfd,op(EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL),fd,event(struct epoll_event, EPOLLIN,EPOLLOUT)。成功返回0,失败返回-1。使用epoll_event之后,就会在红黑树上建立一个节点。
epoll_wait:传入epfd,epoll_event, maxevents, timeout.返回的是有多少个active的IO请求。
六、单线程多路I/O的优点:可以用一个单进程来监听多个客户端读写状态的模型,不需要1:1的线程数量关系。并且,不浪费cpu资源,对cpu的利用率比较高。缺点:虽然可以监听读写状态,但是在同一个时间内,只能处理一个客户端的读写操作。实际上的读写业务并发为1。多个客户端访问server,业务是串行执行。大量的请求会有排队延迟现象。这是一种可以用在实际生产中的机制。
七、单线程多路I/O复用+多线程业务工作池。优点:将业务处理的部分分离出来,能够减少客户端访问Server导致的业务串行执行会有大量请求拍短的延迟时间。问题:实际的读写业务并发为(依赖于main thread的write/read出口),知识业务流程的并发为worker pool线程数量,加快了业务处理的并行效率。
八、单线程多路I/O+多线程多路I/O复用。main thread用来监听listenFd,等连接创建好之后把ConnFd发给别的I/O复用thread。这样的好处是I/O操作的并发量上来了。因为main thread把创建好的fd没有加入到自己的I/O复用中,而是加入到别的I/O复用中了。当然,缺点是成本成倍增加。