【第三章:BAT等名企面试真题解析8讲】第14节:腾讯面试真题解析之epoll
前言
如果说虚函数是C++面试常考问题,那么epoll则是C++后台开发方向面试必问问题。以我的面试经验总结来说,epoll相关是出现频次最多的面试题。因为如果涉及高性能服务器开发方面,epoll是非常常用的系统调用,在很多的开源项目当中epoll都是核心技术,例如Nginx和Redis等等。本节我将结合腾讯面试真题讲解eopll的相关知识点。
IO多路复用
如果要理解epoll,首先需要知道Linux下的IO多路复用技术。I/O多路复用的本质是使用select,poll或者epoll函数,挂起进程,当一个或者多个I/O事件发生之后,将控制返回给用户进程。以服务器编程为例,传统的多进程(多线程)并发模型,在处理用户连接时都是开启一个新的线程或者进程去处理一个新的连接,而I/O多路复用则可以在一个进程(线程)当中同时监听多个网络I/O事件,也就是多个文件描述符。select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。
IO多路复用优点:
1.相比基于进程的模型给程序员更多的程序行为控制。
2.IO多路复用只需要一个进程就可以处理多个事件,单个进程内数据共享变得容易,调试也更容易。
IO多路复用缺点:
1.业务逻辑处理困难,编程思维不符合人类正常思维。
2.不能充分利用多核处理器。
select
select最早出现在1984年在BSD里的实现,是最早的IO多路复用的API。简单来说就是讲需要监听的文件描述符通过select系统调用交给内核,当select返回时,再讲所有的文件描述符返回,通过遍历一遍文件描述符就知道哪些文件描述符上有读写事件发生,进行相应的处理。函数原型如下:
#include <sys/select.h> int select(int nfds,fd_set *readset,fd_set *writeset,fd_set *exceptset, struct timeval *timeout);
nfds参数指定被监听的文件描述符的总数;readset,writeset,exceptset参数分别是可读,可写和异常事件对应的文件描述符集合;而fd_set结构体由一个整形数组组成,该数组每一位标记了一个文件描述符,该数组的上限有宏FD_SETSIZE指定;timeout是select的超时时间。
select机制的缺点
- 每次调用select,都需要把监听的文件描述符集合fd_set从用户态拷贝到内核态,从算法角度来说就是O(n)的时间开销。
- 每次调用select调用返回之后都需要遍历所有文件描述符,判断哪些文件描述符有读写事件发生,这也是O(n)的时间开销。
- 内核对被监控的文件描述符集合大小做了限制,并且这个是通过宏控制的,大小不可改变(限制为1024)。
poll
1997年出现了poll系统调用,和select类似,poll也是在指定时间内监听多个文件描述符。
函数原型:
#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);
优化:poll改变了文件描述符集合的描述方式,通过一个pollfd数组向内核传递需要关注的事件,没有描述符个数的限制.
typedef struct pollfd {
int fd;
shor
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> 《收割BAT:C++校招学习路线总结》,专刊共计17节。专刊分为五大主要内容,包括后台开发学习路线、简历制作,面试技巧、BAT等名企面试真题解析和工作学习常用工具。本专刊将介绍我在技术成长过程当中的经验,通关BAT的面试技巧,并结合亲身经历的面试真题由浅入深的讲解后台开发方向的重点问题,让你们的求职之路更加顺畅。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

