CVTE 应用软件研发一面:进程线程、死锁与并发设计
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
自我介绍与实习
- 自我介绍
八股
- 进程与线程的区别?
- 多线程与线程池的理解?
- 线程死锁的四个必要条件?
- 如何避免死锁?
- 如何安全设计并发编程的代码?
- 读写锁了解吗?
算法
- LeetCode 1056
反问
- 具体业务方向、做什么市场?(to 学校:希沃 / to 企业)
- 校招生进去后负责什么?
《参考解析》
-
进程与线程别只背「资源分配 vs 调度单位」:要落到具体差异——地址空间与页表是否独立、切换时保存与刷新什么、通信方式(管道/共享内存/消息队列 vs 共享变量加锁)、崩溃是否互相影响。加分点是把协程一起放进坐标轴:进程隔离强、线程共享轻量、协程在用户态调度、切换成本更低但要自己管阻塞。CVTE 是软硬件一体的公司,能顺带说一句「嵌入式/一体机场景里进程隔离带来的稳定性收益」会更贴业务。
-
线程池这道题高频,答参数和推演过程:核心线程数、最大线程数、空闲存活时间、任务队列、线程工厂、拒绝策略六件套要能一口气说出来;再补「任务先占核心线程、满了进队列、队列满了才扩到最大线程、再满走拒绝策略」这个执行顺序——记错顺序是面试里最常见的扣分点。参数怎么定:CPU 密集取核数附近,IO 密集按「核数 × (1 + 等待时间/计算时间)」估算,最后一定要落回压测,不要报一个凭感觉的数字。
-
死锁四条件是记忆题,避免死锁才是区分题:四个必要条件(互斥、请求并保持、不可剥夺、循环等待)背完立刻转到破环手段——统一加锁顺序(最实用)、
tryLock带超时并回退、把多把锁收敛成一次批量获取、缩小锁粒度或用无锁结构。再补两句工程侧的兜底:线上用jstack或线程 dump 定位死锁、加锁路径统一封装、监控锁等待时间。 -
「如何安全设计并发代码」是开放题,按层次答:① 能不可变就不可变、能不共享就不共享(线程封闭、局部变量);② 必须共享时选对工具——
AtomicXxx做计数、ConcurrentHashMap这类并发容器替代手动同步的HashMap;③ 锁的粒度与顺序统一,避免在锁内做 IO 和远程调用;④ 可见性用volatile、复合操作不能只靠volatile;⑤ 最后用压测与并发测试验证,别指望 review 看出来。 -
读写锁要答适用场景和代价:读多写少时
ReentrantReadWriteLock能让多个读并行,写独占;代价是写饥饿(读持续涌入时写线程可能长期拿不到锁)和实现更复杂,所以写比例不低时不如直接用互斥锁或换成更细的分段/无锁结构。能补一句「读写锁不保证读到最新数据的一致性语义,需要强一致时仍要加额外机制」会显得真用过。