nginx 内存池分析

nginx 内存池 ngx_pool_t nginx 是自己实现了内存池的,所以在nginx ngx_pool_t 这个结构也随处可见,这里主要分析一下内存池的分配逻辑。 内存池实现了包括小块内存、大块内存和清理资源几种资源的处理,应该来说覆盖了绝大数的使用场景了。 相关结构定义 // 大块内存 t ... »

ngx_align 值对齐宏

ngx_align 值对齐宏 ngx_align 为nginx中的一个值对齐宏。主要在需要内存申请的地方使用,为了减少在不同的 cache line 中内存而生。 // d 为需要对齐的 // a 为对齐宽度,必须为 2 的幂 // 返回对齐值 #define ngx_align(d, a) ((( ... »

动态追踪技术之SystemTap

SystemTap SystemTap是一个深入检查Linux系统活动的工具,使用该工具编写一些简单的代码就可以轻松的提取应用或内核的运行数据,以诊断复杂的性能或者功能问题。有了它,开发者不再需要重编译、安装新内核、重启动等烦人的步骤,应用程序同理。 配合火焰图的可视化,对程序的性能分析极其有利。 ... »

一次内核 crash 的排查记录

一次内核 crash 的排查记录 使用的发行版本是 CentOS,内核版本是 ,在正常运行的情况下内核发生了崩溃,还好有 vmcore 生成。 准备排查环境 1. crash 2. 内核调试信息rpm,下载的两个 rpm 版本必须和内核版本一致 kernel debuginfo common x86 ... »

C++ 虚函数分析

C++ 虚函数分析 虚函数调用属于运行时多态,在类的继承关系中,通过父类指针来调用不同子类对象的同名方法,而产生不同的效果。 C++ 中的多态是通过晚绑定(对象构造时)来实现的。 用法 在函数之前声明关键字 表示这是一个虚函数,在函数后增加一个 表示这是一个纯虚函数,纯虚函数的类不能创建具体实例。 ... »

C++ lambda 分析

lambda 表达式分析 构造闭包:能够捕获作用域中变量的匿名函数的对象,Lambda 表达式是纯右值表达式,其类型是独有的无名非联合非聚合类类型,被称为闭包类型(closure type),所以在声明的时候必须使用 来声明。 在其它语言如lua中,闭包的格式相对更为简单,可以使用 lambda 表 ... »

C++ 引用分析

引用 左值引用,建立既存对象的别名 右值引用,可用于为临时对象延长生命周期 转发引用,保持函数实参的类别 悬置引用,对象生命周期已经结束的引用,访问改引用为未定义行为 值类别,左值,纯右值,亡值 std::move, std::forward 类型推导 引用塌缩(折叠) 可以通过模板或者 typed ... »

spdlog 基本结构分析

spdlog 基本结构分析 代码取自 "V1.5.0" , 代码堪称美学。 "spdlog" 是一个只有头文件的C++日志库,速度非常快,扩展性很强,更重要的是 社区活跃,文档齐全 。 使用 1. 参考官方的 "example" . 2. {fmt} 的格式使用也需要熟悉一下,毕竟也进 C++20 ... »

一个轻量快速的C++日志库

limlog 作一篇文章记录实现,驱动优化迭代。 "Github" 很久之前就想写一个日志库了,受限制于自己水平这个想法一直没有完成。在上次写一个 TCPServer 的时候,写了一个错误的日志库,在多线程的情况对速度影响非常大,并且最重要的正确性也没有保证。 近期又有了点时间,决定重新实现,对其 ... »

程序的链接

链接 本文基本都是从 CS:APP 中 copy 过来的,作为一个学习的记录。 测试的时候发现有一些东西发生变化。如重定位的方式,现在默认都使用 GOT+PLT 的方式进行重定位,与此带来的是 被干掉,使用 GOT 的方式访问。 "编译过程" "静态链接" "目标文件" "可重定位目标文件" "符号 ... »

Graphviz 画图的一些总结

"Graphviz" Graphviz 是一个自动排版的作图软件,可以生成 png pdf 等格式。 一切以官方文档为准,博客只是参考。这里做一个自己学习的记录。 "dot 语法介绍" "部分图形属性介绍" "示例" "使用VSCode进行预览生成" "参考" dot 语言 Graphviz 构建组 ... »

C表达式中的汇编指令

C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析。 asm 表达式有两种形式,第二种 包含了 语句。 第一种形式为常见的用法,AssemblerTemplate 和 OutputOpera ... »

epoll(2) 源码分析

epoll(2) 源码分析 文本内核代码取自 5.0.18 版本,和上一篇文章中的版本不同是因为另一个电脑出了问题,但是总体差异不大。 "引子留下的问题" "关键数据结构" "提供的系统调用" "就绪事件相关逻辑" "epoll 间的相互影响及处理" "问题的解答" 引子留下的问题 在 "上一篇文章 ... »

epoll(2) 使用及源码分析的引子

epoll(2) 使用及源码分析的引子 本文代码取自内核版本 4.17 epoll(2) I/O 事件通知设施。 epoll 是内核在2.6版本后实现的,是对 select(2)/poll(2) 更高效的改进,同时它自身也是一种文件,不恰当的比方可以看作 eventfd + poll。 多路复用也是 ... »

eventfd(2) 结合 select(2) 源码分析

eventfd(2) 结合 select(2) 源码分析 本文代码选自内核 4.17 eventfd(2) 创建一个文件描述符用于事件通知。 "使用" "源码分析" "参考" eventfd 作为一个非常简单的抽象文件,每个文件描述符都对应一个在内核空间维护的 , 一个无符号64位整形的计数器,而e ... »

poll(2) 源码分析

poll(2) poll(2) 系统调用的功能和 select(2) 类似:等待一个文件集合中的文件描述符就绪进行I/O操作。 "使用" "实现" select(2) 的局限性: 关注的文件描述符集合大小最大只有 1024 文件描述符集合为顺序的,不能任意指定 fd,浪费占用的fd poll(2) ... »

select 源码分析

select(2),同步的 I/O 复用 直接看 epoll 的源码把自己绕晕了,先整个简单点的下手。 "使用" "源码分析" select(2) 提供的用户接口 1. 第 1 个参数为最大的文件描述符加 1 2. 第 2 3 4 个参数依次为读写异常需要检查的结构体 3. 第 5 个参数为超时时间 ... »

select 源码分析

## select(2),同步的 I/O 复用 直接看 epoll 的源码把自己绕晕了,先整个简单点的下手。 - [使用](#usage) - [源码分析](#src_analysis) ### select(2) 提供的用户接口 <span id = "usage"></span> ```c #i ... »

信息的表示和处理 及 CS:APP 15213 datalab

信息的表示和处理 在通用计算机中中, 作为最为 最小 的可寻址的内存单元,而不是访问内存中单独的位。 寻址和字节顺序 (大端法),数据最高字节部分地址在地址处,和人的感觉逻辑相似 (小端法),低字节部分在低地址处 布尔代数 TRUE FALSE NOT AND OR EXCLUSIVE OR(异或) ... »