小吴同学
善良比聪明更重要
Learning the Shell Learning the Shell
Why Bother?Why do you need to learn the command line anyway? Well, let me tell you a story. A few years ago we had a pro
2020-09-20
GDB 调试指南 GDB 调试指南
本文用一个「双线程、双互斥锁、加锁顺序相反」的最小示例,演示如何用 gdb attach 定位程序死锁。死锁是并发编程里最棘手的问题之一,通过这个例子可以掌握一套通用的分析思路:先看线程与栈回溯(backtrace),再顺着栈找到等待的锁,
2020-09-13
What is the Shell? What is the Shell?
What Is “The Shell”?Simply put, the shell is a program that takes commands from the keyboard and gives them to the opera
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
C++ 内存碎片化:成因与解法 C++ 内存碎片化:成因与解法
内存碎片化是 C++ 在高并发服务中的一个关键性能顽疾。碎片分成两类:外部碎片——空闲的内存块零散、不连续,总的空闲内存充足,却无法满足大块内存的分配;内部碎片——分配出去的内存大于实际需求,剩下的空间被闲置。 高并发场景下,高频次的小内存
2020-08-02
Linux 创建一个可执行的共享库 Linux 创建一个可执行的共享库
本文讨论两个需求: 如何让共享库文件也可以直接执行; 如何在可执行文件中用 dlopen 解析自身的函数。 这两个需求汇总起来,可以理解为:如何让一个程序既可以作为共享库,又能够直接运行。这类需求在 Linux 下很常见,ld-linu
2020-07-27
C++ 双缓冲:读写分离 C++ 双缓冲:读写分离
1. 引言:为什么我们需要双缓冲?在现代软件开发中,尤其是在高并发、实时性要求极高的系统中,数据的读写分离是一个永恒的话题。最近在处理一个实时数据系统时,我遇到了数据库(MySQL)在高并发读写下的性能瓶颈。传统的加锁机制虽然能保证数据一致
2020-07-21
共享库“位置无关”(PIC)实现原理 共享库“位置无关”(PIC)实现原理
PIC 即 position independent code(位置无关代码),对应编译选项 -fpic:生成适合放入共享库的位置无关代码。 共享库有一个重要特征——可以被多个可执行文件共享,以达到节省磁盘和内存空间的目标。这意味着: 磁
2020-07-15
C++ 无锁编程原理 C++ 无锁编程原理
无锁编程(Lock-Free Programming)是现代并发编程中的一种重要技术,它避免了传统的锁机制,如互斥锁(mutex),并通过原子操作确保线程安全。无锁编程能够在多线程环境中显著提高程序的并发性和可伸缩性,减少线程之间的竞争、阻
2020-07-09
多线程写数组的设计方案 多线程写数组的设计方案
多线程环境下向数组添加数据的结构时,我们需要考虑线程安全。一般有几种常见的设计方案: 方案 1:互斥锁保护动态数组实现思路:使用互斥锁(std::mutex)保护对数组的每次操作,确保同一时间只有一个线程修改数组。这个方案是最简单最常见的,
2020-06-27
4 / 10