随笔分类 - 源码剖析
摘要:Nginx 源码版本: 1.13.1 Nginx 内存池的定义主要位于如下两个文件中: ngx_palloc.h ngx_palloc.c 首先是几个重要的宏定义: #define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1) #define NGX_DEFA
阅读全文
摘要:Buffer 类的设计是一种应用层的输入输出缓冲技术。对于 Non-blocking IO 来说,其核心思想是避免阻塞在 read() 或 write() 或其他的 IO 系统调用上,这样就可以最大限度地复用 thread of control,让一个线程能够服务于多个 socket 连接。IO 线
阅读全文
摘要:Endian Endian.h 是一个公共头文件,里面包含了一些网络字节序和主机字节序相互转换的问题。 其中所使用的方法如下: // XX 位主机转网络 uint64_t htobe64(uint64_t data); uint32_t htobe32(uint32_t data); uint16_
阅读全文
摘要:Thread 在 Thread.cc 中,有一个 ThreadNameInitializer 类,用于线程环境初始化操作: void afterFork() { muduo::CurrentThread::t_cachedTid = 0; muduo::CurrentThread::t_thread
阅读全文
摘要:在并发编程中,常常需要用到线程安全的队列。常见的线程安全队列的设计分为两种: 阻塞队列:常用于生产者和消费者的场景,其中,生产者存放元素,而消费者获取元素。常用的实现方法是在入队和出队时使用同一把锁,或者入队和出队使用不同的两把锁。 非阻塞队列:与阻塞队列不同,非阻塞队列在队列为空时获取元素会直接返
阅读全文
摘要:该框架中的日志为诊断日志,用于将代码运行时的重要信息进行保存,方便故障诊断和追踪。日志通常分为如下两种: 同步日志:当需要写出一条日志消息时,只有等到这条日志消息完全写出时才能执行后续的程序,其问题在于可能会阻塞在磁盘写操作上; 异步日志:当需要写日志消息时,只是将日志消息进行存储,当积累到一定量时
阅读全文
摘要:Atomic 在 Atomic.h 文件中定义了原子操作类类型 AtomicIntegerT<T>,它使用了 GCC 内置的原子操作来实现。 原子操作在多线程开发中经常用到,比如计数器、序列产生器等。这些情况下数据有并发的危险,但是用锁去保护又显得有些浪费,会造成一定的性能瓶颈,而原子操作则更为节省
阅读全文
摘要:WeakCallback 在 WeakCallback.h 文件中定义了模板类 WeakCallback,在其模板参数中,有一个可变模板参数 ARGS,用以指示回调函数的参数。 在类内部,定义有两个成员变量,分别是 object_ 和 function_。 成员变量 object_ 是一个弱指针类型
阅读全文
摘要:ProcessInfo 在 ProcessInfo.h 文件中,存在一个命名空间 ProcessInfo,其中声明了大部分进程需要使用到相关信息的函数,比如进程的 PID、UID、EUID,主机名,进程状态,程状态等等。 在 ProcessInfo.cc 的 detail 命名空间定义了如下几个函数
阅读全文
摘要:StringPiece 在 StringPiece.h 文件中,声明了两个类类型,一个是 StringArg,另一个是 StringPiece,前者用于在传递函数参数时同时兼容 C 风格的字符串(const char*)和 C++ 风格的字符串(std::string)。而后者则可用于构建同时兼任这
阅读全文
摘要:CurrentThread 在 CurrentThread 命名空间中实现了有关线程 id 的管理和优化。其主要用于获取当前线程的 id,并将线程 id 保存为 C 语言风格的字符串: extern __thread int t_cachedTid; // 线程id extern __thread
阅读全文

浙公网安备 33010602011771号