分类
善良比聪明更重要
GDB 调试指南 GDB 调试指南
本文用一个「双线程、双互斥锁、加锁顺序相反」的最小示例,演示如何用 gdb attach 定位程序死锁。死锁是并发编程里最棘手的问题之一,通过这个例子可以掌握一套通用的分析思路:先看线程与栈回溯(backtrace),再顺着栈找到等待的锁,
2020-09-13
Linux 程序调试指南 Linux 程序调试指南
GDB 是 GNU 发布的、运行在 UNIX/Linux 下的命令行调试器,也是 Linux 下 C/C++ 程序员必不可少的工具。它的命令很多,但日常调试只需掌握其中约十个。本文先从一个完整的调试过程讲起,再延伸介绍 pstack、str
2020-09-01
Linux 一切皆文件 Linux 一切皆文件
Unix 有一条著名的哲学——「一切皆文件」(everything is a file)。但严格来说,socket 和 pipe 并不完全符合这一点:它们虽然能被当作文件描述符来读写,却没有被纳入统一的目录树命名空间。本文从这一点出发,探讨
2020-08-20
glibc 内存分配器原理 glibc 内存分配器原理
内存管理是 C 程序员日常编码中最常见的技术点,能否用得 glibc 内置的内存管理函数,是衡量 C 程序员水平的重要标准。本文从几个 C 语言中常见的例子出发,深入剖析 malloc/free 这两个最常见内存管理函数的实现机制,并总结如
2020-08-08
Linux 创建一个可执行的共享库 Linux 创建一个可执行的共享库
本文讨论两个需求: 如何让共享库文件也可以直接执行; 如何在可执行文件中用 dlopen 解析自身的函数。 这两个需求汇总起来,可以理解为:如何让一个程序既可以作为共享库,又能够直接运行。这类需求在 Linux 下很常见,ld-linu
2020-07-27
共享库“位置无关”(PIC)实现原理 共享库“位置无关”(PIC)实现原理
PIC 即 position independent code(位置无关代码),对应编译选项 -fpic:生成适合放入共享库的位置无关代码。 共享库有一个重要特征——可以被多个可执行文件共享,以达到节省磁盘和内存空间的目标。这意味着: 磁
2020-07-15
Linux 动态链接与静态链接 Linux 动态链接与静态链接
库是写好的、可复用的代码。现实中每个程序都要依赖很多底层库,不可能从零开始。本质上库是一种可执行代码的二进制形式,可被操作系统载入内存执行。库有两种:静态库(.a/.lib)和动态库(.so/.dll)——Windows 上是 .lib/.
2020-06-21
一道经典 fork 面试题 一道经典 fork 面试题
这是一道关于 Unix fork() 系统调用的经典面试题:每一轮 fork 产生的新进程数量等于当前正在运行的进程数量。题目问——下面这个程序一共输出多少个 -? #include <stdio.h> #include <sy
2020-06-09
fork 的开销与争议 fork 的开销与争议
fork 是一个拥有 50 年历史的系统调用,也是一个传奇。一个程序员可以永远不用 read/write,也可以不懂 mmap,但必须懂 fork。fork 没有参数、如此简单,是 UNIX 哲学的布道者们的首选,被写进了几乎每一本操作系统
2020-05-28
Linux clone 系统调用:fork 的变体 Linux clone 系统调用:fork 的变体
继传统 UNIX fork 之后,本文介绍 fork 在 Linux 内核中的变体——clone 系统调用的精妙之处。 理解 fork 的原始意义,还是要回到 Melvin Conway 提出 fork 思想的论文 A Multiproce
2020-05-16
fork 思想起源:从 Conway 论文说起 fork 思想起源:从 Conway 论文说起
fork 的思想比 UNIX 早出现几年,大约是 1963 年,比 UNIX 在 PDP-7 上的第一个版本早了 6 年。1963 年,计算机科学家 Melvin Conway 写下论文 A Multiprocessor System De
2020-05-04
Linux 进程与内存管理 Linux 进程与内存管理
在讨论 Linux 的性能问题时,我们常常会遇到这样一些问题: Linux 能否满足硬实时的需求? 多核环境下多线程如何执行? 系统的内存究竟耗到哪里去了? 我写的应用程序究竟耗了多少内存? 什么是内存泄漏?如何判定内存是否真的泄漏? C
2020-04-22
1 / 4