大疆 智能驾驶-C++ 一面凉经
1. 创建线程的方法有哪些
答案:在 Linux/C++ 开发里,常见的线程创建方式主要有 pthread_create 和 std::thread。如果再往工程实践上说,很多项目里并不会直接频繁创建线程,而是通过线程池复用工作线程,业务只负责投递任务。pthread_create 更贴近系统接口,控制粒度更细;std::thread 是 C++ 标准库封装,写法更现代,也更容易和 RAII 风格结合。线程创建本身并不只是“拉起一段代码执行”,还涉及线程入口、参数传递、栈空间、调度实体注册以及结束后的资源回收。join 和 detach 也要分清,前者等待并回收,后者放弃显式管理,但会提高生命周期失控的风险。
代码:
#include <iostream>
#include <thread>
using namespace std;
void worker(int id) {
cout << "thread id = " << id << endl;
}
int main() {
thread t(worker, 1);
t.join();
return 0;
}
2. 线程优先级了解吗,操作系统是怎么调度它的
答案:线程优先级本质上是调度器分配 CPU 时间时参考的一个权重或等级。在 Linux 里,普通线程主要由 CFS 调度器管理,更强调公平性;实时线程则可能使用 SCHED_FIFO、SCHED_RR 这类策略,优先级语义更强。但优先级不是唯一因素,线程是否可运行、是否被阻塞、所在 CPU 的运行队列、亲和性设置、时间片消耗情况,都会影响最终调度结果。实际工程里更值得警惕的是优先级反转:高优先级线程被低优先级线程持有的锁卡住,而低优先级线程又被中优先级线程持续抢占,最终导致高优先级线程反而迟迟得不到执行机会。
3. 进程间通信里,讲一下共享内存
答案:共享内存是高性能进程间通信里很常见的一种方式。它的核心思路是让多个进程把同一段物理内存映射到各自的虚拟地址空间中,这样大家看到的虽然是不同虚拟地址,但底层实际访问的是同一份数据。它的优势是少拷贝、延迟低,尤其适合大块数据交换;问题在于同步完全要靠应用层自己设计,所以通常会配合互斥锁、信号量、原子变量或无锁环形队列。共享内存适合解决“数据共享”,但不自动解决“并发一致性”。
代码:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cstring>
#include <iostream>
using namespace std;
int main() {
int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);
char* addr = (char*)shmat(shmid, nullptr, 0);
strcpy(addr, "hello shared memory");
cout << addr << endl;
shmdt(addr);
shmctl(shmid, IPC_RMID, nullptr);
return 0;
}
4. 页表映射关系是什么,TLB 又起什么作用
答案:页表负责把虚拟地址转换成物理地址。CPU 访问内存时,会把虚拟地址拆成虚拟页号和页内偏移,虚拟页号通过页表查到物理页框号,再和偏移组合成最终物理地址。由于虚拟地址空间很大,现代系统一般采用多级页表来降低空间浪费。TLB 是地址转换的高速缓存。因为每次访存都去查多级页表开销太大,所以 CPU 会把常用映射缓存在 TLB 里。命中时转换很快,未命中才需要继续查页表。很多内存访问性能问题,本质上并不只是数据缓存 miss,也可能和 TLB miss 有关。
5. mm_struct 里通常有哪些关键信息
答案:mm_struct 是 Linux 内核里描述进程地址空间的核心结构之一。它通常包含进程地址空间的整体信息,比如页表根相关信息、虚拟内存区域组织、代码段/数据段/堆/栈的边界、内存使用统计,以及和地址空间布局有关的元数据。更细粒度的某一段虚拟地址区域,比如匿名映射、文件映射、栈区、动态库映射区,往往由 vm_area_struct 这一类结构进一步描述。所以可以把 mm_struct 理解成“整个地址空间的总控信息”,而不是单纯“页表指针”。
6. 页表存储在哪,CPU 是怎么知道当前该用哪张页表的
答案:页表本身是存放在内存里的,不是完整保存在 CPU 内部。CPU 通常只保存当前地址空间页表根的位置,比如在 x86 架构下会通过 CR3 这类寄存器指向页表根。当进程切换到另一个地址空间时,内核会更新这个寄存器,后续虚拟地址翻译就会按照新的页表体系来做。这也是为什么进程切换通常比同进程内线程切换更重,因为切换地址空间往往意味着页表根变化以及 TLB 相关开销。
7. 用户访问一块存储空间的完整过程是什么样的
答案:用户程序读写一个变量时,首先使用的是虚拟地址。CPU 发起访存后,会优先查 TLB;如果命中,就能快速得到物理页框号。如果 TLB 未命
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.