标签题目
Linux相关面试题
epoll 的 LT 和 ET 模式
这题考察 epoll 事件触发语义和网络编程细节,关键是说清 LT 反复提醒、ET 只提醒状态变化,以及 ET 必须配合非阻塞循环读写到 EAGAIN。
什么是零拷贝?
这题考 Linux I/O 数据路径,回答要说明零拷贝减少的是用户态与内核态之间的数据搬运和上下文切换。
CPU load 是什么?
这题考 Linux 性能指标理解,回答要区分 load average、CPU 使用率、核数和不可中断 I/O 等待。
删除文件后磁盘占用没有减少是什么原因?
这题考 Linux 文件删除语义,关键是说明目录项删除不等于 inode 和数据块立即释放。
Linux 的内存布局是什么?
这题考进程虚拟地址空间,回答要按区域、增长方向、权限和虚拟内存映射机制说明。
排查性能瓶颈时应该监控哪些参数?
考察性能排查的指标体系和定位顺序,重点是从用户影响出发,沿应用、资源、依赖和链路追踪逐层收敛。
Java 线程池有哪些核心参数?
Java 线程池的核心参数来自 ThreadPoolExecutor:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、RejectedExecutionHandler。真正要掌握的是它们如何共同决定线程创建、任务排队、扩容、回收和拒绝策略。
一个进程最多能打开多少文件描述符,受哪些限制?
一个进程最多能打开多少文件描述符,没有单一固定答案,取决于进程级软硬限制、系统级文件句柄上限、内核内存、服务管理器和容器配置,以及程序自身使用的 I/O 模型。实际排查要同时看 ulimit、/proc 限制、sysctl、systemd LimitNOFILE 和进程当前已打开的描述符。
进程通信方式分别适合什么场景?
这道题考察的不是背诵 IPC 名词,而是能否根据进程关系、通信方向、数据量、时延、可靠性、同步需求和部署范围选择合适方案。回答时应先按场景分类:父子进程简单字节流用管道,本机无亲缘进程可用 FIFO、消息队列或本地 Socket,高吞吐大块数据用共享内存配合同步原语,事件通知用信号,跨主机通信用网络 Socket,文件或 mmap 适合持久化、低频共享和大文件映射。
进程如何保证并发?
进程保证并发,本质上不是某个进程自己保证,而是操作系统通过调度、上下文切换、多核执行、地址空间隔离、进程间通信、同步原语和资源管理共同实现。面试回答要把能同时推进和安全地同时推进区分开:前者靠调度器和 CPU 时间片,后者靠隔离边界、受控共享、锁与信号量、死锁预防以及内核对资源的统一仲裁。
保证Map线程安全?
Map 本身只是键值存储抽象,是否线程安全取决于具体实现和访问方式。普通 HashMap 在并发读写下不安全,可能出现数据丢失、结构破坏、读到不一致状态等问题。保证线程安全通常有几类方案:用外部锁保护所有访问、使用 Collections.synchronizedMap 包装、使用 ConcurrentHashMap、在读多写少场景使用不可变快照或 CopyOnWrite 思路。实际回答时要结合读写比例、是否需要复合操作原子性、是否需要强一致迭代、性能和内存成本来选型。
线程调度和进程调度的区别?
进程是资源分配和地址空间隔离的基本单位,线程是 CPU 执行流和调度的基本单位。在现代 Linux 中,内核调度器实际调度的是 task_struct 表示的可调度实体,因此二者的关键差异不在于两套完全不同的调度器,而在于切换时涉及的资源上下文、地址空间、共享关系和开销不同。
多线程如何在多个CPU上分布?
多线程并不是由程序自己平均分到多个 CPU 上,而是由操作系统调度器把处于可运行状态的线程调度到逻辑 CPU 上执行。线程能否真正并行,取决于可运行线程数、CPU 核心数或逻辑 CPU 数、调度策略、亲和性、负载均衡、锁竞争、I/O 等待、缓存与 NUMA 局部性等因素。
操作系统: 操作系统都有哪些内容?
这道题看似在问操作系统包含什么,实际考察候选人是否能把零散知识组织成一张系统地图:从进程线程、调度、同步互斥,到虚拟内存、文件系统、I/O、网络、系统调用、安全隔离、死锁和性能诊断。优秀回答不应只罗列名词,而要说明操作系统作为硬件与应用之间的管理层,如何抽象资源、分配资源、保护资源,并在并发、高性能和可靠性之间做权衡。
操作系统如何进行内存管理?
操作系统的内存管理核心是把有限且碎片化的物理内存,抽象成每个进程独立、连续、受保护的虚拟地址空间,并通过页表、MMU、TLB、缺页异常、页面置换、交换空间、写时复制和权限控制等机制,在性能、隔离、安全、内存利用率和编程便利性之间做平衡。
进程通信的方式有哪些?
进程间通信本质是在独立地址空间之间传递数据、同步状态或通知事件。回答不能只背名称,要按数据通道、同步机制、适用范围和性能代价展开,重点比较管道、命名管道、消息队列、共享内存、信号量、信号、Socket、Unix domain socket、mmap 和文件锁。
select、poll 和 epoll 有什么区别?
这道题考察 Linux I/O 多路复用的核心差异:它们都解决单线程或少量线程同时管理多个文件描述符的问题,但在内核接口、数据结构、事件通知方式、拷贝成本、遍历成本和高并发可扩展性上差异很大。面试回答不能只背“epoll 更快”,还要说明为什么在大量连接、少量活跃的典型网络服务场景下 epoll 更合适,以及为什么在连接数很少或跨平台场景下 select、poll 仍然可能足够。
线程锁锁的到底是什么?
线程锁并不是把某个线程本身锁住,也不是直接把一段代码或一个变量物理锁住。更准确地说,锁是一种同步协议:它通过某个可竞争的同步状态,约束多个线程进入临界区的顺序,从而保护共享资源及其不变量。Java 中 synchronized 竞争的是对象监视器或类对象监视器,ReentrantLock 竞争的是基于 AQS 维护的同步状态;操作系统层面的 mutex、semaphore 等竞争的是内核或用户态维护的同步状态。
Java 线程池的核心参数和执行流程是什么?
这道题考察的不是背出几个构造参数,而是要说明 ThreadPoolExecutor 如何用线程数、队列、线程工厂和拒绝策略共同定义资源边界。高质量回答应先点明线程池复用线程、控制并发、削峰和保护系统的目的,再按任务提交后的执行路径解释:先看核心线程,再入队,再扩容到最大线程,最后触发拒绝策略,同时补充队列选择、参数取舍、异常处理、关闭流程和线上监控。
ConcurrentHashMap 为什么能保证线程安全?
ConcurrentHashMap 的线程安全不是靠一个全局大锁实现的,而是把可见性、原子性和局部互斥组合起来:数组槽位和节点关键字段用 volatile 保证可见性,空桶插入、初始化和扩容状态切换用 CAS 保证原子更新,非空桶写入时只锁住单个桶的头节点,读操作基本无锁;再配合扩容协作、红黑树化和分散计数,既保证并发访问下结构不被破坏,又尽量降低锁竞争。
Java 实现线程安全的方式?
线程安全的核心不是某个关键字,而是多个线程访问共享可变状态时,程序仍能保持正确性。回答时应先界定共享、可变、并发访问这三个条件,再按避免共享、限制共享、控制访问、使用并发工具和改进设计几个层次展开。
怎么保证map的线程安全?
保证 Map 线程安全的核心是先明确并发语义:是只要单次 get/put 安全,还是复合操作也要原子;是允许弱一致迭代,还是必须看到稳定快照;是读多写少、写多读少,还是配置类读多且整体替换。常见方案包括外部加锁、Collections.synchronizedMap、ConcurrentHashMap、不可变 Map、读写锁和快照/COW。面试中不能只说“用 ConcurrentHashMap”,还要说明它解决了什么、不解决什么,以及复合操作、迭代一致性、内存可见性和选型边界。
什么是线程安全?
线程安全指一段代码、对象或组件在多个线程同时访问时,仍然能够保持预期的正确性,不因为执行时序交错而产生脏数据、丢失更新、状态破坏或偶发异常。判断线程安全不能只看单次调用是否正确,而要看共享可变状态在并发读写下是否满足原子性、可见性和有序性,并通过不可变、线程封闭、同步、原子类或并发容器等手段建立可靠的并发语义。
如何在实际中判断是否会出现线程安全问题?
判断实际项目中是否会出现线程安全问题,核心不是先看有没有多线程,而是追踪共享可变状态是否被多个执行路径并发访问,以及访问是否包含读改写、检查后执行、跨字段一致性、对象发布等风险。实战判断要结合代码审查、并发入口梳理、锁边界分析、压测和线上偶发症状,而不是依赖一次本地复现。
单例模式如何实现,如何保证线程安全?
单例模式的核心目标是让一个类在进程内只暴露一个可访问实例,并控制实例创建时机。回答时应从构造器私有化、全局访问点、线程安全发布、延迟加载、反射和序列化破坏边界几个维度展开。常见实现包括饿汉式、同步懒汉式、双重检查锁、静态内部类和枚举单例,其中推荐优先说明静态内部类和枚举单例,再解释为什么双重检查锁必须配合 volatile。
内核多线程模块的线程调度是怎么实现的?
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 策略、每个线程的用户栈和内核对象开销,以及语言运行时的栈配置共同取最小值。能创建多少线程是一回事,系统能否高效调度这些线程又是另一回事。
进程与线程区别?
进程是操作系统进行资源分配、隔离和保护的基本单位,线程是进程内部的执行流,通常是 CPU 调度的基本单位。进程之间默认拥有独立虚拟地址空间和资源边界,隔离更强;同一进程内多个线程共享地址空间、堆、代码段、打开文件等资源,但各自拥有独立寄存器上下文、栈、线程局部存储和调度状态。
操作系统的用户态和核心态问题?
用户态和内核态是操作系统用来隔离普通程序与高权限内核代码的两种运行状态,本质目的是保护硬件资源、内核内存和系统整体稳定性。回答时要把权限差异、CPU 特权级、进入内核态的路径、系统调用例子,以及模式切换和上下文切换的区别讲清楚。
进程、线程和协程有什么区别?
这道题本质是在考操作系统并发模型的分层理解:进程是资源隔离和资源分配的基本单位,线程是内核调度和 CPU 执行的基本单位,协程是用户态组织异步流程的轻量执行单元。面试时不能只背“进程重、线程轻、协程更轻”,要讲清地址空间、调度权、上下文切换成本、通信方式,以及在 I/O 密集、高并发服务中的取舍。
同题还出现在 1 个公司岗位
一个游戏场景题,多线程下更新分数排行榜?
这题核心不是选一个线程安全容器就结束,而是把排行榜拆成两个一致性问题:玩家当前分数的唯一真值,以及按分数排序的索引。多线程更新时,必须保证这两个结构的复合更新具备原子性,否则会出现丢分、重复排行项、旧分数残留、TopN 短暂错误等问题。一个成熟答案应先定义分数语义,再给出单机强一致方案,随后讨论 TopN、锁粒度、读写分离、分片、最终一致和测试验证。
netstat 中的 Recv-Q 和 Send-Q 有什么区别?
netstat 的 Recv-Q 和 Send-Q 分别反映 socket 接收队列和发送队列中的未处理数据。回答要区分监听 socket、已建立连接、应用是否及时读写,以及网络或对端是否导致堆积。
单进程服务器中某个客户端不调用 recv 时,阻塞和非阻塞模式会怎样?
客户端不调用 recv 时,服务端发送缓冲区会逐渐积压;阻塞模式可能卡住整个单进程服务,非阻塞模式会返回 EAGAIN,需要事件驱动和背压处理。
内存中的堆和栈有什么区别?
堆和栈的区别?这道腾讯牛客题的关键是围绕“内存堆与栈区别”讲清概念、机制、取舍和边界。内存中的栈主要保存函数调用帧、局部自动变量、返回地址和寄存器保存信息,生命周期随函数调用自动管理;堆用于动态分配对象,生命周期由 malloc/free、new/delete 或运行时 GC 管理。
多进程和多线程的区别?
多进程和多线程的区别?这道腾讯牛客题的关键是围绕“进程与线程区别及上下文切换”讲清概念、机制、取舍和边界。进程是资源拥有和隔离单位,线程是同一进程内的调度执行单位。同一进程的线程共享地址空间、堆、全局变量和文件描述符,但有独立栈、寄存器上下文、线程局部存储和调度状态。
linux命令如何查看进程占用的端口号?
linux命令如何查看进程占用的端口号?这道腾讯牛客题的关键是围绕“Linux 查看端口占用进程”讲清概念、机制、取舍和边界。本机查看某个端口被哪个进程占用,优先用 ss -lntp、lsof -i :PORT、netstat -lntp 或 fuser -v PORT/tcp。重点看 LISTEN 状态、Local Address、PID/program name 和是否需要 sudo 才能看到进程名。
ps aux中能查看到进程的哪些信息?
ps aux中能查看到进程的哪些信息?这道腾讯牛客题的关键是围绕“Linux 进程状态与 ps 输出”讲清概念、机制、取舍和边界。Linux 常见进程状态包括 R 运行或可运行、S 可中断睡眠、D 不可中断睡眠、T 停止、Z 僵尸。ps aux 还能看到 USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START、TIME、COMMAND 等字段。
线程同步,进程同步方法?
线程同步,进程同步方法?这道腾讯牛客题的关键是围绕“线程同步与进程同步方式”讲清概念、机制、取舍和边界。线程同步发生在同一进程共享地址空间内,常用 mutex、rwlock、condition variable、semaphore、barrier、atomic 和 futex;进程同步跨地址空间,常用命名信号量、文件锁、共享内存配进程共享 mutex、管道、消息队列和 socket。
linux怎么查看cpu使用情况?
linux怎么查看cpu使用情况?这道腾讯牛客题的关键是围绕“Linux CPU 使用率观测与定位”讲清概念、机制、取舍和边界。Linux 查看 CPU 使用情况不能只报一个 top 命令。要区分整机 CPU 使用率、单进程/线程占用、用户态/内核态时间、iowait、load average 和上下文切换。不同指标回答的是不同层级的问题。