得物 软件开发-C++ 一面

1. 有一个进程一直在吃内存,你要输入什么指令怎么排查?

使用 top 命令,然后在交互界面按下 Shift + M ,可以将进程按内存使用率(%MEM)从大到小进行排序,从而快速定位吃内存的进程PID。也可以使用:ps aux --sort=-%mem | head 直接输出。

2. 如何查看CPU的状态?

  1. top 或 htop:实时查看CPU的整体负载(Load Average)及各进程的CPU占用率。
  2. mpstat -P ALL 1:查看每个具体CPU核心的使用状态。
  3. vmstat 1:查看系统的上下文切换次数、运行队列和CPU空闲率。

3. 如果你的云服务器内存不足,你要怎么办?

  1. 定位原因:通过 top 排查,判断是正常业务高峰还是代码存在内存泄漏。
  2. 释放缓存:如果是缓存(buff/cache)占用过高,可使用 echo 3 > /proc/sys/vm/drop_caches 清理缓存(生产环境慎用)。
  3. 增加Swap分区:如果未配置,可临时创建Swap文件,将不常用的内存页交换到磁盘,防 OOM。
  4. 服务调优/扩容:限制大户(如MySQL/Redis)的最大内存占用配置,或直接对服务器升级配置。

4. 除了 top,如果你怀疑某个进程频繁进行系统调用导致性能瓶颈,怎么排查?

可以使用 strace 命令去追踪进程的系统调用。例如使用 strace -c -p <PID> 可以统计该进程在一段时间内各类系统调用(如 read, write, futex 等)的发生次数和耗时分布。这对于排查死锁、频繁的网络I/O或磁盘读写瓶颈非常有效。

5. 简述一下进程的上下文切换(Context Switch),它为什么会影响性能?

上下文切换是指CPU从一个进程(或线程)切换到另一个进程时,需要保存当前进程的运行状态(CPU寄存器、程序计数器等),并加载新进程状态的过程。性能影响: 切换过程本身需要消耗CPU时钟周期;更严重的是会导致 CPU Cache(如 L1/L2 缓存、TLB 快表)的命中率瞬间下降,因为新进程的数据可能不在缓存中,从而引发性能损耗。频繁的上下文切换通常由过多的线程竞争锁或过于频繁的 I/O 阻塞引起。

6. C++新特性在你的项目里用到了哪些?

主要使用了 C++11/14 的新特性:

  1. 使用 auto 关键字进行类型自动推导。
  2. 使用智能指针(std::shared_ptr/unique_ptr)接管动态内存,避免泄漏。
  3. 使用 std::thread, std::mutex, std::condition_variable 实现并发与同步。
  4. 使用 Lambda 表达式作为回调函数。
  5. 使用了右值引用和 std::move 实现移动语义,减少深拷贝开销。

7. std::shared_ptr 的线程安全性是怎么样的?

shared_ptr 的线程安全性分为两个层面:

  1. 引用计数的增减是线程安全的:由于底层采用了原子操作(atomic),多个线程同时拷贝同一个 shared_ptr 对象(增加引用计数)或销毁该对象时,不会导致计数错乱。
  2. 管理的底层对象和智能指针自身的读写是不安全的:如果多个线程同时对同一个 shared_ptr 实例进行赋值(改变其指向),或者对它指向的原生对象进行读写,都存在竞态条件,需要额加互斥锁进行保护。

8. C++程序的内存分区模型是怎样的?BSS段和Data段的区别?

C++程序在内存中通常分为五个区:栈区、堆区、全局/静态存储区、常量区、代码段。其中,全局和静态变量存放在全局/静态存储区,该区又细分为 Data 段和 BSS 段:

  • Data段:存放已初始化且初始值不为0的全局变量和静态变量,占用可执行文件空间。
  • BSS段:存放未初始化或初始化为0的全局变量和静态变量。它在可执行文件中不占实际空间,仅记录所需大小,由操作系统在加载时自动清零。

9. 多线程编程中,自旋锁(Spinlock)和互斥锁(Mutex)有什么本质区别?应用场景是什么?

  • 互斥锁:当获取不到锁时,线程会陷入休眠(挂起,释放CPU),等待锁可用时由操作系统唤醒。这涉及内核态的用户上下文切换,开销较大。适合锁持有时间较长的场景。
  • 自旋锁:当获取不到锁时,线程不会休眠,而是通过 CPU 的忙等待(死循环检测)来不断尝试获取锁。这避免了上下文切换,但会浪费CPU。适合临界区极短、锁很快就能被释放的场景。

10. 你使用 gdb 的过程是

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

查看25道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务