影石 Insta360 移动端一面凉经:计算机基础、设计模式与 Agent 项目追问
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
计算机基础:进程 / 线程 / 操作系统
- 进程和线程分别是什么?
- 你刚说进程间通信有共享变量,那还有什么通信方式?
- 线程的通信方式呢?
- 你知道死锁吗?
- 互斥是什么意思?
- 死锁的问题应该怎么解决?
- 什么是虚拟内存?
- 虚拟内存的实现技术有哪些?
计算机基础:网络
- 简单介绍一下网络的七层结构
- TCP 在哪一层?
- HTTP 呢?
- 介绍一下 TCP 和 UDP 的特点和区别
- UDP 为什么比 TCP 传输速度更快?
- TCP 是怎么保证可靠的?
- 有了解过 TCP 的流量控制吗?
- 聊聊 HTTP 和 HTTPS 的区别
数据结构
- 数组和链表的区别
- 数组和链表插入删除的时间复杂度
- 栈和队列的区别
- 栈和队列的插入删除性能
设计模式
- 有了解过设计模式吗?
- 你刚提到依赖倒置,它是什么意思?
- 里氏替换呢?
- 单例模式是什么意思?
- 开发中用过哪些设计模式?
- 整体的设计模式呢,比如 MVC / MVP / MVVM 有了解吗?
项目经验
- 这个岗位是客户端开发,你之前有客户端开发相关经验吗?
- 简单介绍一下实习期间你自己做的事情
- 介绍一下整个项目的背景,具体是个什么东西?
- 你这里写的三层架构,之前是什么架构?还是从 0 到 1 设计的?
- 三层架构是你设计的吗?有没有思考过设计目的是什么,缺失某一层会导致什么问题?
- 意图分类层具体是由什么做的、具体怎么做的?用什么筛选的?
- 路由决策层这一块,核心也是大模型对吧?
- 执行监控层具体是怎么做的?它记录的是工具的执行过程吗?失败原因这些是工具的吗?执行监控的主体是什么,也是大模型还是固定的脚本 / 工作流?这个表是谁来填的?
- 业务系统接入 Agent 具体是怎么做的?
- 实习过程中遇到过什么困难?是什么东西的读写操作?
- 视频智能理解平台和智能商家点评推荐平台,是在什么背景下做的?
算法题
- LeetCode 209「长度最小的子数组」(滑动窗口,现场手写)
《参考解析》
-
虚拟内存与它的实现技术,按「解决了什么问题」来讲:虚拟内存是操作系统给每个进程提供的独立连续地址空间抽象,程序用的是虚拟地址,由 MMU 查页表映射到物理页框。它解决四件事——进程隔离、内存扩充(不常用的页换出到磁盘,可以跑超过物理内存的程序)、内存保护(越界访问会被拦下)、内存共享(多进程映射同一物理页)。实现技术包括分页(固定大小的页与页框、页表映射)、分段(按逻辑段划分,段长可变)、段页式(先分段、段内分页)、请求分页(用到才调入,配合缺页中断与页面置换算法 LRU/FIFO/Clock/LFU),以及 TLB 快表加速地址转换。面试里最容易卡住的是「实现技术」这一问,把上面这套名词说全,再补一句缺页处理流程(陷入内核 → 查外存 → 有空闲页框就调入、没有就按置换算法淘汰 → 更新页表与 TLB → 重新执行指令)就很完整。
-
死锁与互斥,四条件加三种策略:死锁是多个线程互相持有对方需要的资源而永久阻塞,产生要同时满足互斥、持有并等待、不可剥夺、循环等待四个条件。互斥指资源访问的排他性——同一时刻一个资源只能被一个线程占用,其余线程必须等待,这是四个条件里唯一通常不能被破坏的(资源本身性质决定)。解决死锁三条路:预防(一次性申请全部资源、申请不到就释放已占资源、按固定顺序申请资源)、避免(银行家算法,分配前判断是否进入不安全状态)、检测与恢复(定期检测,出现后剥夺资源或终止线程)。工程上最常用的三板斧是一致加锁顺序、
tryLock带超时、缩小锁粒度,回答时把这三条落到自己写过的代码上最有说服力。 -
TCP 的可靠性、流量控制与 UDP 为什么快,是同一组知识点:可靠性靠序列号与 ACK 确认、超时重传与快速重传(收到三个重复 ACK 立即重传)、校验和、以及连接管理(三次握手四次挥手)。流量控制是端到端的,接收方在 ACK 里带上接收窗口 rwnd,发送方据此调整发送速率,窗口为 0 时停发并启动坚持定时器定期探测,避免死锁;拥塞控制是全局的,靠慢启动、拥塞避免、快速重传、快速恢复判断网络是否被压垮——两者最容易被问混,一句话区分:「防止接收方被压垮 vs 防止网络被压垮」。UDP 快的原因是没有握手、不等 ACK、不重传、无流量与拥塞控制、首部只有 8 字节(TCP 至少 20 字节),代价是不保证到达与顺序,所以直播、语音、DNS 用它。
-
HTTP 与 HTTPS 的区别,顺带纠正一个常见口误:HTTP 明文传输、默认 80 端口、无需证书;HTTPS 在 HTTP 与 TCP 之间加了 TLS,默认 443,需要 CA 证书验证服务器身份,握手耗时与 CPU 开销更大。TLS 握手流程是客户端发支持的加密套件与随机数、服务端选套件并回随机数与证书、客户端验证证书后生成预主密钥并用服务端公钥加密发送、双方用预主密钥派生会话密钥,之后的通信走对称加密(非对称只用来安全地协商密钥)。要注意 HTTP 本身没有握手,握手是 TCP 的三次握手,HTTPS 是在 TCP 握手之后再加一次 TLS 握手;把这两件事混在一起讲是这道题的典型失分点。
-
依赖倒置、里氏替换与三种架构模式,答概念要落到代码:依赖倒置(DIP)指高层模块与低层模块都依赖抽象,抽象不依赖细节;代码上的体现是面向接口编程、由容器注入实现(Spring 的 DI 就是它的落地),好处是替换实现和写测试都不用改调用方。里氏替换(LSP)指子类对象能替换父类出现且程序行为不变,实践约束是子类不能改变父类已承诺的行为(不能收窄入参、不能放宽返回值、不要抛父类没有的异常)。MVC 里 Controller 处理输入、View 可以直接读 Model(Spring MVC 是典型);MVP 里 View 与 Model 完全解耦、都通过 Presenter 通信(Android 早期常用);MVVM 靠 ViewModel 与双向数据绑定自动同步(Vue、Jetpack Compose、WPF)。用「谁和谁解耦、靠什么同步」这一条线串起来,比背定义清楚得多。
-
三层架构的目的与缺层后果,是这场面试最有区分度的一问:意图分类层的目的是把候选工具从几十个收敛到三五个,减少无关描述对模型的干扰,同时把便宜的关键词召回放在前面、把贵的模型选择放在后面(关键词召回用 BM25 或倒排索引,再让模型在候选中精排);缺了它,模型要从几十个工具里盲选,慢且不准。路由决策层负责把用户意图变成可执行计划(调哪些工具、什么顺序、参数怎么填),并做白名单、权限、风险与隐私校验;缺了它,多步骤任务会乱序执行,也没有安全边界。执行监控层记录每次工具调用的名称、参数、开始与结束时间、耗时、结果与错误信息,形成可追溯的调用链,支撑失败定位、性能分析与成本统计;缺了它,出问题只能靠猜。这里最容易答错的是执行监控的主体——它由执行引擎(代码)在调用前后自动写表,不是大模型填的,大模型只负责规划与生成回答。
-
LeetCode 209 长度最小的子数组,滑动窗口模板要背熟:数组元素为正整数,用左右指针维护一个窗口,右指针向右扩、累加和,当和大于等于 target 时不断右移左指针并更新最小长度,直到和小于 target;复杂度 O(n)。边界要处理:没有任何子数组满足时返回 0。讲的时候主动说明为什么可以滑动——元素为正意味着窗口和随左指针右移单调不增,这是滑窗成立的前提;如果数组里有负数,就得改前缀和加单调队列或二分。写完记得手动跑一个
target = 7, nums = [2,3,1,2,4,3](答案是 2)的用例。 -
「这个岗位是客户端开发,你有相关经验吗」这类问题,如实说 + 给迁移能力:没有就直接说没有,然后补两句能迁移的东西——C/C++ 或 Java 的语言基础、操作系统与网络的底子是同一个、做过的项目里有哪些客户端相关的工作(界面渲染、异步任务、缓存与网络请求),以及愿意补的方向(Android 的四大组件与生命周期、iOS 的 RunLoop 与内存管理、跨端框架的渲染机制)。项目类问题被连续追问时,不要越答越虚:先给结论(是什么架构、谁设计的、为什么这么设计),再给边界(我负责哪部分),答不上来的细节就停在事实层面,说清当时的取舍,比临时编一个设计目的更安全。