拼多多 客户端开发-C++ 一面 (暑期)

1. 阻塞和非阻塞有什么区别

答案:阻塞和非阻塞描述的是一个系统调用在资源暂时不可用时,调用线程会不会立刻被挂起。阻塞 IO 下,如果数据没准备好,线程会睡眠等待,直到条件满足再返回。非阻塞 IO 下,如果数据没准备好,系统调用会立刻返回错误码,比如 EAGAINEWOULDBLOCK,由调用方决定后续是重试、注册事件,还是先处理别的任务。很多人容易把阻塞/非阻塞和同步/异步混在一起说,但它们不是一回事。阻塞/非阻塞更偏调用方发起操作时的状态表现,而同步/异步更偏结果通知方式。

代码:

#include <fcntl.h>
#include <unistd.h>
#include <cerrno>
#include <cstdio>

int main() {
    int fd = 0; // stdin
    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);

    char buf[128];
    int n = read(fd, buf, sizeof(buf));
    if (n < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
        printf("no data now\n");
    }
    return 0;
}

2. 同步和阻塞有什么关系

答案:同步和阻塞不是同一个维度。同步强调的是调用发起后,结果由谁来主动等待和处理;阻塞强调的是线程在等待过程中会不会被挂起。比如同步阻塞很好理解,调用一个 read,线程一直等到数据返回。同步非阻塞也很常见,比如不断轮询 read,资源没准备好就先返回。异步则是你把操作交出去,等系统或框架后面通过回调、事件、通知把结果带回来。所以不能简单说“同步就是阻塞,异步就是非阻塞”,这两个概念经常被一起提,但并不等价。

3. MySQL 常见用的是什么版本,选版本时一般关注什么

答案:如果是现在的工程环境,常见会落在 MySQL 5.7 和 8.0 这两个大版本线上,很多新项目已经偏向 8.0。实际选版本时,重点关注的不只是“版本号新不新”,而是兼容性、默认字符集、执行计划稳定性、索引能力、权限模型、JSON 能力、窗口函数支持、线上运维工具链,以及和现有业务代码、驱动、备份方案的兼容情况。8.0 相比 5.7 在功能性上更完整,比如 CTE、窗口函数、数据字典、角色管理等都更成熟,但升级时也要留意保留字、默认配置变化和执行计划波动。面试里如果问这个,通常不是让你背版本发布时间,而是想看你有没有真实接触过数据库环境。

4. 除了 MySQL,用过哪些 MySQL 衍生或兼容数据库

答案:比较常见的有 MariaDB、Percona Server,以及一些面向分布式或云场景的兼容 MySQL 生态产品,比如 TiDB、PolarDB-X 这类。MariaDB 更像是 MySQL 分叉出来的一条兼容路线,Percona 更偏增强监控和性能诊断能力。TiDB 虽然不是简单的 MySQL 分支,但在协议和生态兼容上做得比较多,所以很多业务接入成本相对低。如果继续往下问,一般会聊兼容性边界,比如 SQL 方言、事务语义、执行计划、索引特性和运维方式,并不是“能连上驱动就算兼容”。

5. Git 怎么对比两个分支之间的不同

答案:最常见的是 git diff branchA..branchB 看代码差异,git log branchA..branchB 看提交差异,git diff --name-only 看变更文件列表。如果想看两个分支的共同祖先基础上分别改了什么,实际更常用的是三点语法,比如 git diff branchA...branchB,这样会基于 merge-base 做对比。真正开发里,对比分支差异不只是为了“看代码”,还经常用于排查某次回归到底是哪一批提交引入的、某个 hotfix 有没有完整进目标分支。如果面试继续追,往往会问 rebase 和 merge 的区别、cherry-pick 的适用场景,以及冲突是怎么产生的。

6. 除了 Git,还了解过哪些版本控制思路

答案:如果是现代开发,Git 几乎是主流,但从思路上看,版本控制可以分为集中式和分布式。集中式像 SVN,核心历史集中在中央仓库,本地能力相对弱;分布式像 Git,每个开发者本地就是一个完整仓库,历史、分支、合并都更灵活。真正区别不只是“命令不一样”,而是团队协作模型不同。Git 更适合分支开发、代码评审、离线提交和复杂合并场景,SVN 在权限管理和某些线性流程里也有它的优势。面试问这个,大多不是要你比较谁先进,而是看你对版本控制抽象有没有概念。

7. 协程了解吗,协程和线程的区别是什么

答案:协程可以理解成用户态的轻量执行单元,核心价值在于调度切换开销小,适合大量高并发但不一定同时占用 CPU 的任务。线程是操作系统调度单位,切换要进入内核态,开销更大,但可以真正利用多核并行。协程一般依赖用户态调度器,本质上更像“把一条线程里的执行流拆得更细”,适合 IO 密集型场景。如果面试继续问,通常会追协程是不是一定比线程快、协程遇到阻塞系统调用怎么办、C++20 协程和传统纤程库的区别。工程里协程的收益不只是“轻”,更关键是把异步逻辑写得更接近同步代码风格。

8. Linux 下查看当前进程占用多少 CPU 用什么命令

答案:常见命令有 tophtoppspidstat。如果只是快速查看,可以用 top -p pidps -p pid -o %cpu,cmd。如果想看更持续、更适合排查的数据,pidstat -p pid 1 会更方便。另外还要注意,CPU 占用率的含义和机器核心数有关,多线程程序在多核机器上看到超过 100% 并不奇怪。真正线上排障时,除了看进程总 CPU,还要进一步看线程级 CPU,通常会配合 top -H -p pid 或 perf 一起定位。

9. 如何杀掉一个进程,kill -9 为什么不能乱用

答案:最常见的是 kill pid,默认发 SIGTERM,表示请求进程优雅退出。如果进程不响应,才会考虑 kill -9 pid,也就是 SIGKILL,这个信号不能被捕获和处理,会直接被内核终止。kill -9不能乱用,是因为它跳过了资源清理逻辑,像临时文件、锁文件、共享内存、数据库连接、缓冲区刷盘都可能来不及处理。真正工程里,优先级一般是先查进程状态、线程状态和卡住

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

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

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

全部评论
pdd面试这问的比较广
点赞 回复 分享
发布于 昨天 23:01 辽宁

相关推荐

评论
点赞
收藏
分享

创作者周榜

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