进程与线程:从 PCB 到内核调度实体
操作系统中最核心的抽象莫过于进程(Process)。它不仅是资源分配的基本单位,也是程序运行的载体。而线程(Thread)作为更轻量的执行单元,让并发程序设计更加高效。本文从内核视角出发,深入剖析进程控制块、线程模型、Linux 实现机制以及用户态协程的本质。
tag
操作系统中最核心的抽象莫过于进程(Process)。它不仅是资源分配的基本单位,也是程序运行的载体。而线程(Thread)作为更轻量的执行单元,让并发程序设计更加高效。本文从内核视角出发,深入剖析进程控制块、线程模型、Linux 实现机制以及用户态协程的本质。
虚拟内存是操作系统中最精妙的设计之一。它让程序可以方便地使用连续地址空间进行编码,而无需关心复杂多变的物理内存布局。同时,它也为操作系统调度、进程隔离和内存安全提供了底层支撑。从最早的段页式管理,到现代 x86-64 的多级页表,虚拟内存始终是操作系统与硬件交互最核心的环节之一。
性能问题往往没有统一的标准答案,但 Linux 提供了一套完整的工具链,可以从不同层面揭示系统的运行状况。本文系统介绍从系统调用跟踪到内核动态追踪的常用工具,帮助开发者在面对高 CPU、高延迟或资源瓶颈时快速定位根因。strace:系统调用跟踪 strace 是最基础也是使用率最高的诊断工具之一。
The C10K Problem:为什么 poll/select 不具扩展性 在 1999 年,开发者 Dan Kegel 提出了著名的 C10K Problem:如何让一台单机同时处理 10,000 个并发连接?
文件系统是操作系统中最关键的子系统之一。它将裸设备的物理存储块(block)抽象为逻辑上的目录和文件,让用户和应用程序可以方便地组织、读取和写入数据。理解文件系统的底层原理,对于排查磁盘空间泄漏、IO 性能瓶颈和数据一致性问题都至关重要。
操作系统是计算机系统中最核心的系统软件,它管理硬件资源、提供抽象接口、保障程序安全隔离。深入理解操作系统的基础原理,是每一位系统工程师的必修课。本文将围绕内核态与用户态的隔离机制、系统调用的实现原理展开系统性的介绍。
在多核处理器成为主流的当下,并发编程已是必备技能。然而,并发带来的竞态条件(Race Condition)和数据不一致问题要求我们借助同步原语来协调多个执行单元对共享资源的访问。本文从底层实现出发,逐一剖析 Linux 中最常用的同步机制:互斥锁、信号量、条件变量、读写锁、自旋锁和 RCU,并给出选
引言:堆内存的演进之路 在 Linux 系统中,当程序请求一块内存时,操作系统并不会直接暴露物理页。相反,一个复杂的分配器层次逐步将大块虚拟地址空间切割成程序所需的小块。从用户态的 到底层的 / ,再到内核的 slab/slub 分配器,每一层都在性能、碎片率与并发能力之间做出权衡。
中断(Interrupt)是操作系统最核心的机制之一。无论是键盘输入、磁盘 I/O 完成,还是定时器到期,系统都依赖中断来打破 CPU 的顺序执行流,让内核能够及时响应外部事件。理解中断的完整链路——从硬件信号到内核处理,再到 Linux 的下半部机制——是掌握操作系统底层原理的关键一步。
Linux 进程管理完整指南:fork 的 Copy-on-Write 机制、exec 家族系统调用、wait/waitpid 僵尸进程处理,以及 POSIX 管道、消息队列、共享内存、Unix Domain Socket 四种 IPC 机制的深度对比与实战代码。
在 Linux 系统中,网络通信的基石是 Berkeley Socket API。无论你是在编写 Web 服务器、微服务网关,还是分布式系统的 RPC 框架,最终都会落到 、 、 、 这些系统调用上。
Linux 内核模块(Kernel Module)是可动态加载到内核空间的代码单元,它是驱动开发、文件系统扩展、网络协议栈增量的核心手段。与微内核架构不同,Linux 采用宏内核设计,所有内核代码共享同一地址空间,模块的运行效率极高,但也意味着一个不合格的模块可能导致整个系统崩溃。
Linux 内存管理子系统是内核中最复杂的模块之一。它不仅要为进程分配物理页帧,还要在内存不足时做出艰难的权衡决策。本文从 overcommit 策略、OOM Killer、交换机制、cgroup 控制、内存水位以及诊断工具六个维度,系统地梳理 Linux 内存子系统的核心原理。
1. 信号基础 Linux 信号(signal)是操作系统向进程发送的软件中断通知机制。当特定事件发生时——用户按下 Ctrl-C、子进程退出、进程访问无效内存、管道写入端关闭——内核向目标进程的进程控制块(PCB)中记录一个待处理的信号。
存储 IO 是操作系统中最复杂也最影响性能的子系统之一。一次看似简单的文件读写,实际上会穿越用户空间、虚拟文件系统、页缓存、块层、设备驱动直至物理硬件多个层级。理解 Linux IO 栈的完整路径,是诊断性能瓶颈、优化数据库响应、以及合理选型存储方案的前提。
CPU 调度是操作系统最核心的职责之一。它决定了哪个进程在何时使用 CPU,直接影响系统的响应速度、吞吐量和用户体验。本文从经典算法讲起,逐步深入到 Linux CFS 的设计与实现,并覆盖多处理器负载均衡、实时调度和前沿趋势。
操作系统是计算机科学的基石,理解其原理是进行系统编程、性能优化与问题排查的前提。本专题系统覆盖进程与线程模型(PCB、调度算法 CFS/多级反馈队列)、内存管理机制(虚拟内存、页表、MMU、TLB、换页策略)、文件系统与 I/O 栈(VFS、inode、DMA、mmap、epoll/io_uring)、死锁与同步原语(信号量、互斥锁、条件变量、读写锁、RCU)、中断机制与系统调用、Linux 内核源码导读(启动流程、模块编程、内核数据结构),以及容器与虚拟化的操作系统支撑(cgroups/namespace/KVM),为后端工程师与系统开发者建立扎实的操作系统理论底座。
系统性 eBPF 可观测性实战:eBPF 架构与执行模型(Verifier/JIT/maps/Helper)、BCC 与 libbpf 开发框架对比、BPF 程序类型(kprobe/tracepoint/uprobe/XDP/TC/socket)、Go eBPF 开发(cilium/ebpf 库)、常见可观测性场景(函数追踪/延迟分析/火焰图/网络丢包/文件 IO/TCP 连接)、eBPF 安全与权限(CAP_BPF)、性能开销控制、与 Prometheus/Grafana 集成。附 C/libbpf 和 Go 实战代码。
背景与起源 Flatpak 是一种用于在 Linux 系统上分发、安装和运行桌面应用程序的开源框架。它由 Alexander Larsson 于 2007 年首次提出,最初名为 Glick,后经过多次迭代和发展,于 2016 年正式更名为 Flatpak。
一、历史背景 Flatpak 是一种用于 Linux 系统的应用程序沙箱化框架,旨在解决跨发行版应用程序分发的问题。Linux 发行版众多,每个发行版都有自己的包管理系统和软件仓库,这导致软件包在不同发行版之间的移植非常困难。Flatpak 通过提供一个统一的打包和分发机制来解决这个问题。