知识点标签

Linux面试题解析

Linux 相关面试题,覆盖系统调用、I/O、网络编程和服务端基础。

97 道题 6 个岗位 14 个公司

Linux相关面试题

进程通信方式分别适合什么场景?

这道题考察的不是背诵 IPC 名词,而是能否根据进程关系、通信方向、数据量、时延、可靠性、同步需求和部署范围选择合适方案。回答时应先按场景分类:父子进程简单字节流用管道,本机无亲缘进程可用 FIFO、消息队列或本地 Socket,高吞吐大块数据用共享内存配合同步原语,事件通知用信号,跨主机通信用网络 Socket,文件或 mmap 适合持久化、低频共享和大文件映射。

进程如何保证并发?

进程保证并发,本质上不是某个进程自己保证,而是操作系统通过调度、上下文切换、多核执行、地址空间隔离、进程间通信、同步原语和资源管理共同实现。面试回答要把能同时推进和安全地同时推进区分开:前者靠调度器和 CPU 时间片,后者靠隔离边界、受控共享、锁与信号量、死锁预防以及内核对资源的统一仲裁。

保证Map线程安全?

Map 本身只是键值存储抽象,是否线程安全取决于具体实现和访问方式。普通 HashMap 在并发读写下不安全,可能出现数据丢失、结构破坏、读到不一致状态等问题。保证线程安全通常有几类方案:用外部锁保护所有访问、使用 Collections.synchronizedMap 包装、使用 ConcurrentHashMap、在读多写少场景使用不可变快照或 CopyOnWrite 思路。实际回答时要结合读写比例、是否需要复合操作原子性、是否需要强一致迭代、性能和内存成本来选型。

线程调度和进程调度的区别?

进程是资源分配和地址空间隔离的基本单位,线程是 CPU 执行流和调度的基本单位。在现代 Linux 中,内核调度器实际调度的是 task_struct 表示的可调度实体,因此二者的关键差异不在于两套完全不同的调度器,而在于切换时涉及的资源上下文、地址空间、共享关系和开销不同。

操作系统: 操作系统都有哪些内容?

这道题看似在问操作系统包含什么,实际考察候选人是否能把零散知识组织成一张系统地图:从进程线程、调度、同步互斥,到虚拟内存、文件系统、I/O、网络、系统调用、安全隔离、死锁和性能诊断。优秀回答不应只罗列名词,而要说明操作系统作为硬件与应用之间的管理层,如何抽象资源、分配资源、保护资源,并在并发、高性能和可靠性之间做权衡。

操作系统如何进行内存管理?

操作系统的内存管理核心是把有限且碎片化的物理内存,抽象成每个进程独立、连续、受保护的虚拟地址空间,并通过页表、MMU、TLB、缺页异常、页面置换、交换空间、写时复制和权限控制等机制,在性能、隔离、安全、内存利用率和编程便利性之间做平衡。

select、poll 和 epoll 有什么区别?

这道题考察 Linux I/O 多路复用的核心差异:它们都解决单线程或少量线程同时管理多个文件描述符的问题,但在内核接口、数据结构、事件通知方式、拷贝成本、遍历成本和高并发可扩展性上差异很大。面试回答不能只背“epoll 更快”,还要说明为什么在大量连接、少量活跃的典型网络服务场景下 epoll 更合适,以及为什么在连接数很少或跨平台场景下 select、poll 仍然可能足够。

线程锁锁的到底是什么?

线程锁并不是把某个线程本身锁住,也不是直接把一段代码或一个变量物理锁住。更准确地说,锁是一种同步协议:它通过某个可竞争的同步状态,约束多个线程进入临界区的顺序,从而保护共享资源及其不变量。Java 中 synchronized 竞争的是对象监视器或类对象监视器,ReentrantLock 竞争的是基于 AQS 维护的同步状态;操作系统层面的 mutex、semaphore 等竞争的是内核或用户态维护的同步状态。

Java 线程池的核心参数和执行流程是什么?

这道题考察的不是背出几个构造参数,而是要说明 ThreadPoolExecutor 如何用线程数、队列、线程工厂和拒绝策略共同定义资源边界。高质量回答应先点明线程池复用线程、控制并发、削峰和保护系统的目的,再按任务提交后的执行路径解释:先看核心线程,再入队,再扩容到最大线程,最后触发拒绝策略,同时补充队列选择、参数取舍、异常处理、关闭流程和线上监控。

ConcurrentHashMap 为什么能保证线程安全?

ConcurrentHashMap 的线程安全不是靠一个全局大锁实现的,而是把可见性、原子性和局部互斥组合起来:数组槽位和节点关键字段用 volatile 保证可见性,空桶插入、初始化和扩容状态切换用 CAS 保证原子更新,非空桶写入时只锁住单个桶的头节点,读操作基本无锁;再配合扩容协作、红黑树化和分散计数,既保证并发访问下结构不被破坏,又尽量降低锁竞争。

怎么保证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;二是知道大文件、线上机器、权限、性能和误操作风险。

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 执行的基本单位,协程是用户态组织异步流程的轻量执行单元。面试时不能只背“进程重、线程轻、协程更轻”,要讲清地址空间、调度权、上下文切换成本、通信方式,以及在 I/O 密集、高并发服务中的取舍。

同题还出现在 1 个公司岗位

一个游戏场景题,多线程下更新分数排行榜?

这题核心不是选一个线程安全容器就结束,而是把排行榜拆成两个一致性问题:玩家当前分数的唯一真值,以及按分数排序的索引。多线程更新时,必须保证这两个结构的复合更新具备原子性,否则会出现丢分、重复排行项、旧分数残留、TopN 短暂错误等问题。一个成熟答案应先定义分数语义,再给出单机强一致方案,随后讨论 TopN、锁粒度、读写分离、分片、最终一致和测试验证。

内存中的堆和栈有什么区别?

堆和栈的区别?这道腾讯牛客题的关键是围绕“内存堆与栈区别”讲清概念、机制、取舍和边界。内存中的栈主要保存函数调用帧、局部自动变量、返回地址和寄存器保存信息,生命周期随函数调用自动管理;堆用于动态分配对象,生命周期由 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 和上下文切换。不同指标回答的是不同层级的问题。