分页题目
后端开发工程师相关题目第 3 页
什么是线程安全?
线程安全指一段代码、对象或组件在多个线程同时访问时,仍然能够保持预期的正确性,不因为执行时序交错而产生脏数据、丢失更新、状态破坏或偶发异常。判断线程安全不能只看单次调用是否正确,而要看共享可变状态在并发读写下是否满足原子性、可见性和有序性,并通过不可变、线程封闭、同步、原子类或并发容器等手段建立可靠的并发语义。
如何在实际中判断是否会出现线程安全问题?
判断实际项目中是否会出现线程安全问题,核心不是先看有没有多线程,而是追踪共享可变状态是否被多个执行路径并发访问,以及访问是否包含读改写、检查后执行、跨字段一致性、对象发布等风险。实战判断要结合代码审查、并发入口梳理、锁边界分析、压测和线上偶发症状,而不是依赖一次本地复现。
单例模式如何实现,如何保证线程安全?
单例模式的核心目标是让一个类在进程内只暴露一个可访问实例,并控制实例创建时机。回答时应从构造器私有化、全局访问点、线程安全发布、延迟加载、反射和序列化破坏边界几个维度展开。常见实现包括饿汉式、同步懒汉式、双重检查锁、静态内部类和枚举单例,其中推荐优先说明静态内部类和枚举单例,再解释为什么双重检查锁必须配合 volatile。
如果要用线程安全的数据结构,有什么替代方案?
使用线程安全数据结构时,核心不是简单把 ArrayList、HashMap 换成带锁版本,而是先判断共享状态是否真的必须共享,再按读写比例、是否需要阻塞、是否需要顺序、是否有复合操作一致性来选型。Java 中常见替代方案包括 ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue、ConcurrentLinkedQueue、同步包装器、不可变快照、ThreadLocal、分段锁、Actor 或消息队列串行化,以及在跨进程场景下使用数据库或缓存的原子能力。
内核多线程模块的线程调度是怎么实现的?
Linux 内核多线程模块的线程调度通常不是模块自己实现调度器,而是模块创建多个内核线程后交给 Linux 统一调度。每个内核线程都有 task_struct,进入某个调度类,挂到 CPU 运行队列上,由 CFS、实时调度类或其他调度类根据状态、优先级、vruntime、CPU 负载和亲和性决定何时运行、抢占、阻塞、唤醒和上下文切换。模块开发者更关注线程创建、等待唤醒、停止退出、锁边界和不可睡眠上下文。
如何创建子进程?
创建子进程的核心方式是调用 fork():内核复制当前进程的进程描述信息,创建一个几乎相同但 PID 不同的新进程;父进程得到子进程 PID,子进程得到返回值 0。典型工程模式是 fork 后,子进程按需执行 exec 系列函数加载新程序,父进程使用 wait 或 waitpid 回收子进程退出状态,避免僵尸进程。Linux 中 fork 并不会立即完整拷贝父进程全部内存,而是依赖写时复制降低成本。面试回答应同时说明资源继承、文件描述符共享语义、信号处理、孤儿和僵尸进程、vfork 与 posix_spawn 的使用边界,以及多线程服务中 fork 后的工程风险。
常用的Linux指令有哪些?
这道题不适合只背命令清单,面试官更关注候选人是否能把 Linux 指令放进真实后端排障场景中:如何定位文件、查看日志、过滤文本、观察进程、确认端口、检查磁盘、调整权限、串联管道并形成稳定的排查路径。好的回答应按使用场景分类,并能说明每类命令解决什么问题、常见参数怎么用、出现异常时下一步怎么验证。
Linux 中如何用管道命令排查日志?
这类 Linux 日志排查题考察的不是背命令,而是能否在生产环境中安全、快速、可复现地定位问题。核心思路是先限定日志范围,再用管道逐步缩小:时间窗口、关键字、traceId、状态码、接口路径、调用方、异常栈,最后用统计命令判断问题规模和集中点。回答时要体现两个能力:一是熟练组合 tail、grep、awk、sed、sort、uniq、wc、xargs、less、journalctl;二是知道大文件、线上机器、权限、性能和误操作风险。
Linux查询在一个目录下的特定文件,是怎么查询的?
在 Linux 目录下查询特定文件,首选命令通常是 find,因为它按目录树实时遍历,能同时限定文件名、类型、层级、时间、大小、权限,并能对结果继续执行操作。locate 更适合基于索引的快速模糊查找,grep 更适合在已找到的文件内容中检索文本,三者边界不同,不能混用。
LRU 算法在操作系统中如何使用?
LRU 的核心思想是淘汰最近最少被访问的数据,在操作系统里主要用于页面置换、页缓存回收和内存压力下的缓存管理。但真正的系统通常不会实现严格 LRU,而是借助访问位、脏页状态、Clock、二次机会、活跃/非活跃链表等机制近似判断冷热,以降低维护成本并兼顾吞吐、延迟和写回开销。
在Linux里删除当前目录下七天前创建的所有文件会用到哪些命令?
核心命令通常是 find,用它限定当前目录、文件类型和时间条件,再用 -delete 或 -exec rm 执行删除。面试时要特别说明:Linux 中常用的 find -mtime 判断的是“修改时间”,不是严格意义上的“创建时间”;如果题目口语里说“七天前创建”,生产环境通常需要先确认到底是按创建时间、修改时间,还是业务生成时间清理。
知道如何查看线程的cpu内存等资源使用情况吗?
查看线程级 CPU、内存等资源使用情况,核心思路是先确认进程 PID,再进入线程维度观察。Linux 中线程本质上是轻量级进程,每个线程都有自己的 TID,因此可以用 top -H、ps -L、pidstat -t、/proc/<pid>/task/<tid>/ 等方式查看线程级 CPU、调度状态、上下文切换和栈。CPU 通常能定位到线程,但内存大多是进程级共享资源,不能简单拆给单个线程。
分表规则中,跨表查询+分页该怎么做?
跨表查询和分页的核心不是把单表 limit offset 原样套到每个分表,而是先判断能否命中分片键;能命中就路由到单表或少量表,不能命中才考虑广播查询、局部排序、全局归并。深分页会被分片数放大,工程上更推荐游标分页、二级索引表、异步宽表或搜索服务承接全局查询。
fork发生复制的时候子进程会复制什么?
fork 的本质不是把父进程的一切都物理复制一份,而是创建一个几乎相同的子进程执行上下文:内核为子进程建立新的进程描述符、PID、虚拟地址空间视图和资源引用关系;用户态内存通常通过写时复制延迟分裂;文件描述符表被复制但底层打开文件对象常被共享。因此面试回答要区分“逻辑复制”“引用共享”和“写时复制后才真正复制”。
线程最大数量和什么有关?
Linux 下线程最大数量不是一个固定常量,而是由多层约束共同决定:系统级的 threads-max 和 pid_max、用户级的 RLIMIT_NPROC、服务或容器的 pids 限制、单进程可用地址空间、物理内存与 overcommit 策略、每个线程的用户栈和内核对象开销,以及语言运行时的栈配置共同取最小值。能创建多少线程是一回事,系统能否高效调度这些线程又是另一回事。
消息队列如何保证消息不丢失?
消息队列不丢失不能只回答“开持久化、开确认、消费后再 ack”。更好的回答是把消息链路拆成 producer、broker、consumer 三段,逐段说明消息丢失产生的位置、对应可靠性机制、机制代价,以及至少一次、至多一次、恰好一次之间的取舍。
Mq-Bus 数据量太大延迟怎么办?
消息总线数据量过大导致延迟时,不能只回答加消费者,而要按生产端、broker、消费者三段定位瓶颈,再做止血和长期治理。核心思路是看 TPS、lag、分区倾斜、消费耗时、失败重试、资源水位;再用扩分区、提升消费并行度、批量处理、限流削峰、幂等、死信和容量规划形成闭环。
Kafka 为什么吞吐量高?
Kafka 的高吞吐不是单点优化,而是围绕日志追加模型构建的一整套链路设计:生产端批量发送和压缩降低请求次数与网络字节数,Broker 端用顺序写和 Page Cache 减少随机磁盘 IO,发送文件时利用零拷贝降低用户态与内核态拷贝成本,Topic 分区让读写并行扩展,消费者拉取模型让消费端按自身能力批量读取。同时,ISR、acks、副本数、刷盘策略等可靠性配置会影响吞吐,面试中要讲清这些设计如何共同减少 IO、网络、CPU 和锁竞争开销。
Token的安全怎么保护?
Token 安全的核心不是只把 Token 加密,而是从传输、存储、签发、使用、续期、撤销、审计全链路降低泄露、伪造、重放和越权风险。回答应先说明 HTTPS 是底线,再比较 Cookie 与本地存储风险,重点展开 HttpOnly、Secure、SameSite、短有效期、Refresh Token 轮换、权限范围、服务端撤销、重放防护和日志脱敏。
计算机网络知识体系面试中应该如何展开?
这类问题不是在考背诵协议名,而是在考候选人能否把计算机网络讲成一个有层次、有主线、能落到排障和工程实践的知识体系。高质量回答应先给出分层框架,再围绕 HTTP/HTTPS、TCP/UDP、DNS、连接生命周期、拥塞控制、流量控制和常见问题定位展开,避免想到哪里说到哪里。
session的原理?
Session 的核心是用服务端状态弥补 HTTP 无状态。服务端生成随机 session id 并保存会话数据,客户端通常用 Cookie 携带这个 id,后续请求由服务端查会话存储恢复用户身份、权限和临时状态。
Http 报文里有什么?
HTTP 报文是客户端和服务端交换应用层数据的基本格式。HTTP/1.x 报文由起始行、请求头或响应头、空行、消息体组成。请求报文的起始行叫请求行,包含方法、请求目标和协议版本;响应报文的起始行叫状态行,包含协议版本、状态码和原因短语。头部字段描述元信息,空行分隔头部和消息体,消息体承载实际业务数据。
http 协议 转 dubbo 协议怎么做的?
HTTP 转 Dubbo 的本质不是协议字节直接翻译,而是在网关或适配层把一个 HTTP 请求解析成一次 Dubbo RPC 调用。核心流程是:接收 HTTP 请求,按路由规则定位 Dubbo 接口、方法和版本,完成参数绑定和类型转换,通过注册中心或本地配置找到服务提供者,使用 Dubbo 客户端按 Dubbo 协议编码、序列化并发起调用,再把 Dubbo 响应、异常和超时结果转换成 HTTP 状态码与响应体。回答要围绕映射、发现、调用、治理和观测展开,而不是只说用网关转发。
TCP断开时有4次交互,而连接时有3次交互,多出来的一次是在做什么事情呢?
TCP 连接建立只需要双方确认彼此的发送能力和接收能力,因此三次握手即可完成双向能力确认;TCP 连接断开面对的是全双工连接的两个方向分别关闭,FIN 只表示一端不再发送数据,对端必须先 ACK 确认,等自己也没有数据要发送后再发 FIN。
有了解过debug的时候设置断点后程序会停下来的底层原理吗?
断点能让程序停下来,本质是调试器借助操作系统或运行时的调试接口接管目标进程,在指定位置制造 CPU、内核或虚拟机能识别的停顿事件。native 程序常见是软件断点、硬件断点和单步陷阱;JVM 等托管运行时还要通过 JDWP/JVMTI、字节码位置和线程栈帧模型来完成源码级调试。
HashMap 和 ConcurrentHashMap 的原理与区别是什么?
考察 Java 哈希表结构和并发容器实现,重点是桶结构、扩容、线程安全策略、弱一致迭代和 null 限制。
同题还出现在 1 个公司岗位
怎么选取合适的线程数?
选取合适线程数的核心不是背一个固定数字,而是先判断任务是 CPU 密集、IO 密集还是混合型,再结合机器核数、阻塞比例、线程池队列、延迟目标、吞吐目标和资源上限做估算,最后通过压测观察 CPU 利用率、上下文切换、队列堆积和响应时间来迭代调优。
设计朋友圈功能时,数据库表如何从简单到复杂演进?
朋友圈数据库设计可以按复杂度分层回答:最小可用版本先有用户、好友关系、动态、媒体、评论和点赞;进阶版本补可见范围、权限校验和删除模型;高并发版本再讨论时间线、读扩散与写扩散、冷热数据、索引、分库分表、幂等与一致性。面试时不要一上来就堆表,而是先说明业务读写路径:发动态、刷列表、看详情、评论点赞、删除和权限变化。
如何在大文件中找出出现频率最高的前100个内容?
大文件中找出现频率最高的前 100 个内容,本质是大数据 TopK 频次统计:先统计每个内容出现次数,再从频次结果中选 Top100。答案要根据内存是否能容纳全部去重内容,选择 HashMap 计数、小根堆、哈希切分、外部排序、分布式聚合或流式近似算法。
协程适合IO密集型还是计算密集型任务?
协程更适合 IO 密集型任务,核心原因是它能在用户态以较低成本挂起和恢复执行流,把等待网络、磁盘、RPC、数据库响应的时间让给其他任务;但协程并不会凭空提升 CPU 算力,计算密集型任务如果持续占满 CPU,仍然需要多线程、多进程、并行计算或任务切分配合调度。
操作系统的用户态和核心态问题?
用户态和内核态是操作系统用来隔离普通程序与高权限内核代码的两种运行状态,本质目的是保护硬件资源、内核内存和系统整体稳定性。回答时要把权限差异、CPU 特权级、进入内核态的路径、系统调用例子,以及模式切换和上下文切换的区别讲清楚。
Agent 多工具调度模块如何做冲突检测与解决?
这题考 Agent 多工具并发调度的工程治理,回答要说明冲突类型、预检查、执行中仲裁、补偿和审计闭环。
Agent 工具调用超时后如何设计降级方案?
这题考 Agent 工具调用可靠性设计,回答要围绕超时预算、重试、降级答案、异步继续、熔断和用户可见状态展开。
同题还出现在 1 个公司岗位
Agent 项目如何选择底层模型,依据和验证方法是什么?
这题考 Agent 项目的底层模型选型。答案要从任务类型、工具调用、结构化输出、上下文、延迟成本、安全、评测集、灰度和 fallback 路由来讲。
Agent 长期记忆功能如何设计、召回和持续优化?
这题考 Agent 长期记忆的生命周期,不是多用户隔离。答案要覆盖存什么、如何抽取、召回、更新、遗忘、删除、隐私授权和质量评估。
大模型幻觉在 Agent 服务化中会带来哪些问题,如何治理?
这题考大模型幻觉在 Agent 服务化中的生产风险。答案要聚焦错误工具调用、虚假状态、操作控制、权限、审计、dry-run、确认和事故闭环,而不是泛泛说 RAG 和提示词。
代码 Agent 的 RAG 检索索引如何同时设计语义、关键词、结构化和权限索引?
这题考代码 Agent 的 RAG 索引架构,不是泛泛讲向量库。回答要覆盖语义索引、关键词索引、结构化代码索引和权限索引如何协同检索、过滤、排序和增量更新。
RAG 检索召回无关内容时,如何从 query rewrite、混合检索、rerank、过滤和拒答机制处理?
这题考察候选人能否把 RAG 无关召回拆成可诊断、可治理、可评估的检索链路问题,而不是只说调提示词或换模型。
同题还出现在 1 个公司岗位
Agent 工具调用失败后,如何通过 trace 定位是意图识别、工具选择、参数生成还是工具服务本身的问题?
这题考的是 Agent 工具调用失败后的分层定位能力。好的回答不能只说看日志,而要把一次请求拆成意图识别、工具检索与选择、参数生成、执行前校验、工具服务调用、结果解释几个 span,并让每一层都有输入、输出、置信度、候选集、错误码、耗时和重试信息。定位时先判断用户意图是否被理解错,再看工具候选和最终选择是否合理,然后检查参数 schema、枚举、时间范围、权限上下文等是否正确,最后才归因到工具服务的网络、鉴权、超时、限流或业务错误。
Agent 系统可观测性平台应记录哪些 trace,LangSmith 和 Langfuse 如何用于调试与评估?
这题考 Agent 可观测平台该记录什么,以及如何把 trace 用于调试和评估。好的回答要覆盖请求级 trace、LLM 调用、工具调用、检索、记忆、planner、guardrail、人工反馈、成本延迟和评测结果,并说明 LangSmith 与 Langfuse 都可以承载调试和评估闭环,但选型应基于技术栈、部署合规、数据治理、评测流程、成本和集成方式,而不是简单说谁更强。
图纸类视觉内容没有文本描述时,如何依托视觉特征、多模态 Embedding 和向量检索实现精准召回?
这题考无文本图纸检索系统设计:要能从图纸预处理、视觉和多模态 embedding、向量索引、混合召回、重排、评估和工程更新链路讲清楚如何提高精准召回。
大模型 Function Call 为什么会产生工具调用幻觉,工程上如何用 schema、权限、校验和反馈闭环降低误调用?
这题考 Function Call 的工程治理能力:工具调用幻觉不只靠 prompt 解决,还要靠工具契约、调用门禁、参数校验、执行反馈、回退策略和评测闭环共同降低。
同题还出现在 3 个公司岗位
Agent 中 Function Call、MCP 和 Skill 的工具描述上下文占用有什么差异,如何降低 token 成本?
这道题考察对 Agent 工具接入方式和上下文成本的工程理解。好答案要区分 Function Call 是模型请求内的工具 schema,MCP 是客户端和外部工具服务器之间的协议,Skill 是把说明、脚本和资源按能力打包并按需加载的机制。回答不能简单说 MCP 一定比 Skill 大,而要说明上下文占用取决于客户端暴露了多少工具描述、schema 是否冗长、是否做动态路由和懒加载。高质量答案还应给出降低 token 成本的方法,包括工具分层、候选工具筛选、描述压缩、结果引用、prompt caching 和按任务加载。
MCP 接入多个测评工具时,如果不同工具对同一问题返回格式不统一,应该如何设计统一输出协议或适配层?
这题考 MCP 多工具输出治理。多个 MCP 工具返回格式不统一时,应在工具和 Agent Runtime 之间加适配层,统一 envelope、内容块、结构化数据、错误协议、元数据、版本和审计,而不是让模型解析各类私有格式。
Agent 的 thinking 阶段如何判断该调用工具还是直接回复,如何设计决策信号和安全约束?
这题考的是 Agent 运行时决策设计:候选人要能说明什么时候直接回答、什么时候调用工具、什么时候追问,以及如何用置信度、权限、安全和回归评估约束决策。
同题还出现在 1 个公司岗位