归档
善良比聪明更重要
10
04
Looking Around Looking Around
Looking AroundNow that you know how to move from working directory to working directory, we’re going to take a tour of y
2020-10-04
09
27
Navigation Navigation
NavigationIn this lesson, I will introduce your first three commands: pwd (print working directory), cd (change director
2020-09-27
20
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
13
GDB 调试指南 GDB 调试指南
本文用一个「双线程、双互斥锁、加锁顺序相反」的最小示例,演示如何用 gdb attach 定位程序死锁。死锁是并发编程里最棘手的问题之一,通过这个例子可以掌握一套通用的分析思路:先看线程与栈回溯(backtrace),再顺着栈找到等待的锁,
2020-09-13
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
01
Linux 程序调试指南 Linux 程序调试指南
GDB 是 GNU 发布的、运行在 UNIX/Linux 下的命令行调试器,也是 Linux 下 C/C++ 程序员必不可少的工具。它的命令很多,但日常调试只需掌握其中约十个。本文先从一个完整的调试过程讲起,再延伸介绍 pstack、str
2020-09-01
08
20
Linux 一切皆文件 Linux 一切皆文件
Unix 有一条著名的哲学——「一切皆文件」(everything is a file)。但严格来说,socket 和 pipe 并不完全符合这一点:它们虽然能被当作文件描述符来读写,却没有被纳入统一的目录树命名空间。本文从这一点出发,探讨
2020-08-20
08
glibc 内存分配器原理 glibc 内存分配器原理
内存管理是 C 程序员日常编码中最常见的技术点,能否用得 glibc 内置的内存管理函数,是衡量 C 程序员水平的重要标准。本文从几个 C 语言中常见的例子出发,深入剖析 malloc/free 这两个最常见内存管理函数的实现机制,并总结如
2020-08-08
02
C++ 内存碎片化:成因与解法 C++ 内存碎片化:成因与解法
内存碎片化是 C++ 在高并发服务中的一个关键性能顽疾。碎片分成两类:外部碎片——空闲的内存块零散、不连续,总的空闲内存充足,却无法满足大块内存的分配;内部碎片——分配出去的内存大于实际需求,剩下的空间被闲置。 高并发场景下,高频次的小内存
2020-08-02
07
27
Linux 创建一个可执行的共享库 Linux 创建一个可执行的共享库
本文讨论两个需求: 如何让共享库文件也可以直接执行; 如何在可执行文件中用 dlopen 解析自身的函数。 这两个需求汇总起来,可以理解为:如何让一个程序既可以作为共享库,又能够直接运行。这类需求在 Linux 下很常见,ld-linu
2020-07-27
21
C++ 双缓冲:读写分离 C++ 双缓冲:读写分离
1. 引言:为什么我们需要双缓冲?在现代软件开发中,尤其是在高并发、实时性要求极高的系统中,数据的读写分离是一个永恒的话题。最近在处理一个实时数据系统时,我遇到了数据库(MySQL)在高并发读写下的性能瓶颈。传统的加锁机制虽然能保证数据一致
2020-07-21
15
共享库“位置无关”(PIC)实现原理 共享库“位置无关”(PIC)实现原理
PIC 即 position independent code(位置无关代码),对应编译选项 -fpic:生成适合放入共享库的位置无关代码。 共享库有一个重要特征——可以被多个可执行文件共享,以达到节省磁盘和内存空间的目标。这意味着: 磁
2020-07-15
2 / 4