华为暑期实习通用软开一面
1、 自我介绍
2、 选一个项目进行介绍(webserver)
3、 项目的亮点
答:实现了一个proactor模型,和一个半同步/半反应堆的线程池。实现了小根堆的时间堆处理非活动连接
4、 介绍一下小根堆的原理:
答:堆是用数组实现的完全二叉树,没有使用指针,根据数组的下标构建堆。小根堆的根节点数据是最小的数据,每个节点的数据都比其子节点小。底层是一个数组,通过元素交换,形成小根堆。在stl中是优先级队列
5、 epolloneshot如何确保一个套接字只会被一个线程处理?
答:epoll底层是红黑树和一个就绪队列(链表)。
如果某个socket注册了该标志,则其注册监听的事件在触发一次后再也不会触发,除非重新注册监听该事件类型。
当有epoll_wait()请求时,内核通过对epitem链表的遍历,获取事件发生的文件描述符信息,并返回给相应的应用程序。如果该文件描述符的EPOLLONESHOT标志被设置,那么在事件处理后,该文件描述符会被标记为不可用,并从epoll队列(就绪队列)中删除。注意,从就绪队列里删除则该fd不会被添加到
此时需要再次调用epoll_ctl()函数重新添加该文件描述符的事件。如果该文件描述符的EPOLLONESHOT标志未被设置,则在事件处理完毕后,该文件描述符会继续保持在epoll队列中等待下一次事件的到来。
6、 C++中的多态是怎么实现的?
答:父类有一个虚函数指针和虚函数表,如果子类也会有一个虚函数指针和虚函数表,如果子类重写了父类的虚方法,子类的虚函数表就会更新自己重写过的函数。在传入基类指针时,通过类首部的虚函数表指针找到该类自己的虚函数表,调用虚函数表中的对应方法即可。对于A的实例化,如a1,a2都指向的同一块虚函数表。
7、 C++中的static关键字
答:C/C++共有:
修饰全局变量,该变量只在同一文件中的函数可见
修饰函数,该函数只在同一文件中调用
修饰局部变量,该变量的值不会因为函数终止而销毁
C++独有:
修饰类的数据成员,该数据成员为所有类共有且只有一个实例。
静态成员函数只能访问静态成员变量和全局变量。因为非静态成员变量只有实例化后才能访问。
手撕:力扣第二题 两数相加