概述:4月29号面试,腾讯会议,八股、项目、智力题、手撕各个方面都有问到,面试体验很好
面试流程:
1.面试官自我介绍
2.自我介绍
3.new和malloc区别(性质/原理/大小/失败)
4.面向对象三大特性
5.虚函数表放在哪(常量区)
6.基类和子类的构造和析构顺序(构造先基类后子类,析构相反)
7.讲一下map的实现?具体细节?(红黑树,细节不知道,可能是想让讲key/value?)
8.move的实现和原理(答的比较含糊,将一个对象的资源转移到另一个对象上,原理应该是修改对象的指针)
9.如果不是指针呢?比如move的是结构体对象,有指针也有int?(提了下移动拷贝,继续问怎么赋值,沉默)
10.是栈赋值还是堆赋值(堆)
现在的理解:move本质上是将一个左值参数强制转换为右值引用,告诉编译器参数类型的变换,从而允许在移动语义中使用,还没有进行实际的数据移动和拷贝,move后就是调用移动构造或者移动赋值函数,针对结构体内部堆内存的指针进行拷贝,相当于动态分配的资源被转移,而其他的非指针变量还是普通拷贝
11.进程空间布局(代码区-常量区-全局区-静态区-堆区-文件映射区-栈区)
12.区是怎么理解的(内存段,存储代码或者数据)
13.页表是管理什么的(虚拟内存和物理内存映射关系)
14.进程线程协程的区别(从资源和切换上答)
15.linux下进程和线程的调度有区别吗(没有区别,都用task_struct表示,看成一个任务进行调度)
16.栈和堆有什么区别(系统/用户,空间大小,访问效率)
17.栈为什么比堆的效率高(说了系统支持,提供指令,堆需要两次内存访问,这里面试官不满意)
18.栈内存和堆内存都要找到内存地址,怎么对比速度(还是答指令,然后面试官开始提示)
19.CPU多级缓存设置的目的是什么(考虑局部性原理,将经常使用的内存保存在CPU缓存中使用)
20.那栈和堆,是不是和CPU多级缓存是类似的(还是没答上,应该就是栈是连续的,缓存命中率高)
21.并发和并行有什么区别(多个任务切换执行/多个任务同时执行)
22.阻塞IO和非阻塞IO区别(等待缓冲时是阻塞还是返回错误)
23.动态链接和静态链接的区别(运行时链接库/编译时复制库)
24.epoll的实现(将需要监听的fd保存在内核中的一个红黑树中,监听到事件时返回对应的fd)
25.epoll与select的区别(内核红黑树、异步回调、只返回有事件fd)
26.边缘触发和水平触发(事件发生后只通知一次/只要有数据没读写完就再次通知)
27.怎么判断事件有没有读写完(读写时会给定数据的真实长度,返回值是真正读写成功的数据长度)
28.没读写完会产生什么错误码(EAGAIN)
29.TCP四次挥手
30.客户端timewait过多怎么办(端口复用、强制关闭,还有个设置timewait的数量没答出来)
31.一个数据包从网卡到应用层的收包过程(讲了下各层的数据包)
32.对这个过程中的reuseport有了解吗(没有,后面查了是内核会在多个套接字之间分发传入的连接请求,每个套接字都可以独立地处理连接,可以充分利用多核系统的性能优势,提高并发性能)
33.这个过程中软中断是那一部分(答在应用层以下的过程都是软中断,不满意)
34.应用层到内核缓冲区读数据会有软中断吗(不确定,先说有又说没有,最后让我回去了解软中断)
现在的理解(可能不正确):网卡接收到数据包时触发硬中断,通知内核有数据包到达,内核接收到硬中断通知后触发软中断,通过网络中断处理程序从内存中找到数据包,根据数据包的协议类型进行逐层解析和处理,最后把数据放在socket的缓冲区中,然后内核唤醒用户程序,用户需要读取数据时主动发起系统调用,不属于软中断
35.内核在什么情况会发送RST(答建立了错误的连接;实际上是连接异常时,包括这种情况)
36.怎么判断是错误的连接(序列号和确认号)
37.HTTPS完整的握手流程(答了RSA的握手)
38.具体有哪几种算法(当时没记算法名字,RSA和ECDHE)
39.HTTP Session复用(当时没记,Session id和Session tickle)
40.HTTP长连接(发送一次请求和响应后不断开)
41.QUIC了解过吗(讲了下解决TCP队头阻塞、连接块,端口迁移)
42.为什么QUIC连接更快(忘记具体的,只说连接次数少)
43.还了解QUIC的其他的知识吗(无)
44.智力题:100个硬币中有1个硬币与其他质量不同,给一个天平称多少次可以判断异常硬币的轻重(2次)
45.挑一个印象深刻的项目讲一下(讲了实验室的项目,不是C++相关的)
46.回到另一个C++项目,配置模块注册配置变更回调函数是什么流程(main函数之前定义配置项作为全局变量,初始化时调用构造函数时注册回调函数,当之后对配置项进行修改时调用这些回调函数进行通知)
47.多线程下回调函数如何通知配置变更(使用单例模式,只有一个配置管理类,多个线程共享所有配置项)
48.一个线程修改配置,另一个线程使用配置怎么处理(互斥锁)
49.有性能测试吗,有对比其他服务器比如Nginx吗(ab测试,没对比)
50.服务器接收和响应的数据流是怎么样的,从accept开始(accept是单独一个协程,有新连接就建一个新协程)
51.为什么用协程(切换开销小,配合非阻塞实现异步)
52.定时器用什么实现(set)
53.支持主线程调度任务减少开销是什么意思(调度器线程执行完调度任务后也用来执行任务)
54.手撕:hot100中的合并区间
55.反问
总结:面试官非常好,花了很长时间和我面试,各个方面都有问到,会给一定的提示。整体感觉面的还行,回答的都很简洁,有少量问题没有了解,然后对于部分问题的深度知识不够,项目方面还需要对比
#软件开发2024笔面经##我的实习求职记录#