开源库学习
文章平均质量分 80
网上针对libevent等开源库的使用、源码剖析已有了大量的资料,然而很多都是多年前的版本,现在的libevent等开源库已经发生了巨大的变化,所以在此自己学习并记录最新的libevent等开源库的源码学习和分析。
Ch_ty
这个作者很懒,什么都没留下…
展开
-
Linux操作系统学习笔记(十三)字符设备
一. 前言 上文中我们分析了虚拟文件系统的结构以及常见的文件操作从用户态到虚拟文件系统再到底层实际文件系统的过程。而实际上我们并没有说明实际的文件系统如ext4是如何和磁盘进行交互的,这就是本文和下篇文章的重点:I/O之块设备和字符设备。输入输出设备我们大致可以分为两类:块设备(Block Device)和字符设备(Character Device)。块设备将信息存储在固定大小的块中,每个块都有自己的地址。如硬盘就是常见的块设备。字符设备发送或接收的是字节流,而不用考虑任何块结构,没有办法寻原创 2020-08-17 13:04:56 · 1219 阅读 · 0 评论 -
Linux操作系统学习笔记(十)内存管理之内存映射
一. 前言 本文为内存部分最后一篇,介绍内存映射。内存映射不仅是物理内存和虚拟内存间的映射,也包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。本文首先分析用户态在堆中申请小块内存的brk和申请大块内存的mmap,之后会分析内核态的内存映射机制vmalloc,kmap_atomic,swapper_pg_dir以及内核态缺页异常。二. 用户态内存映射 用户态调用malloc会分配堆内存空间,而实际上则是完成了一原创 2020-07-08 12:49:11 · 694 阅读 · 0 评论 -
Linux操作系统学习笔记(九)内存管理之分页
一. 前言 上文分析了内存再用户态的结构体mm_struct及各个区域映射的vm_area_struct以及32位和64位的内核态结构体,本文将基于这些结构来分析Linux的内存管理系统。内存管理系统包括虚拟内存和物理内存的分页以及虚拟内存和物理内存的映射。本文将介绍分页机制,而映射则在下文中说明。本文首先简单介绍SMP和NUMA系统,然后对物理内存的节点、区域、页结构进行分析,在此基础上剖析伙伴系统和Slub Allocator的实现原理,最后介绍页面交换。二. 内存模型 在计算机的发展历程中原创 2020-07-08 12:48:12 · 714 阅读 · 0 评论 -
Linux操作系统学习笔记(四)系统调用
前言 通过前面几篇文章,我们分析了从按下电源键到内核启动、完成初始化的整个过程。在后面的文章中我们将分别深入剖析Linux内核各个重要部分的源码。考虑到后面的部分我们会从用户态的代码开始入手一步一步深入,因此在分析这些之前,我们需要仔细看一看如何实现一个从用户态到内核态再回到用户态的系统调用的全过程,即系统调用的实现。 本文的说明顺序如下首先从一个简单的例子开始分析glibc中对应的调用针对32位和64位中调用的结构不同会分开两部分单独介绍,会介绍整个调用至完成的过程。即用户态->内核原创 2020-05-24 10:36:39 · 1211 阅读 · 0 评论 -
Linux操作系统学习笔记(一)启动
前言 Linux操作系统内核是服务端学习的根基,也是提高编程能力、源码阅读能力和进阶知识学习能力的重要部分,本文开始将记录Linux操作系统中的各个部分源码学习历程。 关于如何学习源码,个人觉得可以从以下角度入手,有效地提高阅读和学习的效率。(学习语言就不说了,这是基本功。学习IDE推荐Source Insight或者Visual Studio)理解代码的组织结构。 以Linux源码举...原创 2020-05-01 17:45:20 · 615 阅读 · 0 评论 -
C++利用SIO_GET_INTERFACE_LIST查询网关
网关原创 2020-03-14 11:42:32 · 475 阅读 · 0 评论 -
redis源码解析(九)字典结构体函数介绍之四
1. 简介 本文完成字典结构体剩余函数源码解析。2. 源码解析 具体源码解析如下:/* 反转比特位 * Function to reverse bits. Algorithm from: * http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel */static unsigned long re...原创 2018-11-27 22:10:57 · 257 阅读 · 0 评论 -
redis源码解析(八)字典结构体函数介绍之三
1. 简介 本文继上文的基础上,分析剩余的字典相关函数源码。2. 源码分析/* 查找并删除 * Search and remove an element. This is an helper function for * dictDelete() and dictUnlink(), please check the top comment * of those functions. ...原创 2018-11-25 17:39:31 · 291 阅读 · 0 评论 -
redis源码解析(七)字典结构体函数介绍之二
1. 简介 字典结构是redis中的核心结构之一,本文继前文基础上介绍更多字典结构体的相关函数。2.代码解析 /* N步增量重哈希 * Performs N steps of incremental rehashing. Returns 1 if there are still * keys to move from the old to the new hash table, o...原创 2018-11-23 19:51:26 · 272 阅读 · 0 评论 -
redis源码解析(六)字典结构体基本函数介绍
一. 简介 字典结构是redis中的核心结构之一,本文介绍字典结构的基本函数二. 源码解析 首先是一些有用的宏定义的介绍/*调用析构函数释放VAL*/#define dictFreeVal(d, entry) \ if ((d)->type->valDestructor) \ (d)->type->valDestructor((d)-&...原创 2018-11-18 22:18:16 · 251 阅读 · 0 评论 -
redis源码解析(五)字典结构体
1. 前言 字典结构是redis中的核心结构之一,主要由dictEntry, dictType, dictht和dict组成,详细源码和介绍如下。2. 源码分析 1. dictEntry dictEntry是典型的哈希表项结构:由键值对组成,并且有链表指针next,用于同键下的遍历搜寻等操作。/*字典(哈希表)的键值对,由key,v,和指针next组成,是拉链式哈希表的实际存储位...原创 2018-10-31 22:20:24 · 300 阅读 · 0 评论 -
offset of 和 container of 解析
在Linux源码中,经常看到大名鼎鼎offset of 和 container of 的宏定义,这里就此进行解析,并做了实验验证用途,仅用于自己参考记录。原创 2018-05-31 22:37:00 · 1414 阅读 · 3 评论 -
异步OpenSSL实现HTTPS心得
本文记录在使用OpenSSL实现异步式HTTPS中的一些心得体会。1.关于握手(1)如果没有使用封装库,可以得到套接字描述符;而且非异步系统,允许握手的阻塞,则直接使用API将套接字和OpenSSL绑定,从而完成SSL握手绝对是明智之选,可以省下很多麻烦。(2)如果封装之后得不到套接字描述符,或者要求异步非阻塞,那么使用SSL_SET_CONNECT配合SSL_read,再用SSL...原创 2018-08-06 22:08:21 · 3984 阅读 · 0 评论 -
TCP拥塞控制算法BBR源码分析
BBR是谷歌与2016年提出的TCP拥塞控制算法,在Linux4.9的patch中正式加入。该算法一出,瞬间引起了极大的轰动。在优快云上也有众多大佬对此进行分析讨论,褒贬不一。 本文首先对源码进行了分析,并在此基础上对BBR算法进行总结。1.源码分析/* Bottleneck Bandwidth and RTT (BBR) congestion control * ...原创 2018-04-19 23:38:34 · 9668 阅读 · 3 评论 -
网络协议栈学习之socket, sock_common, sock, 和 sk_buff
一直很好奇socket是如何实现的,底层的数据结构又是如何,因此在这里对socket的数据结构进行分析原创 2018-06-12 22:47:44 · 2886 阅读 · 0 评论 -
redis源码解析(一)动态字符串sds结构体
1. 简介 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 由于该库代码优美,实现巧妙,值得学习,因...原创 2018-09-26 23:04:35 · 730 阅读 · 0 评论 -
redis源码解析(二)动态字符串sds基本功能函数
1. 简介 本文继上文基础上,分析动态字符串的功能函数。2. 源码分析原创 2018-09-28 21:49:50 · 484 阅读 · 0 评论 -
redis源码解析(三)动态字符串sds高级功能函数
/* Like sdscatprintf() but gets va_list instead of being variadic. */sds sdscatvprintf(sds s, const char *fmt, va_list ap) { va_list cpy; char staticbuf[1024], *buf = staticbuf, *t; size_...原创 2018-10-14 00:12:14 · 686 阅读 · 0 评论 -
redis源码解析(四)双向链表
本文分析redis里的双向链表的基础结构以及基础函数1. 基本结构 redis的双向链表主要实现了以下三个结构体:(1)链表节点,包括两个指针指向前后节点,一个指针指向节点的值(2)迭代器,用于遍历(3)链表结构体,包括头、尾、复制释放遍历函数、链表长度。/* Node, List, and Iterator are the only data structures used c...原创 2018-10-29 22:40:47 · 251 阅读 · 0 评论 -
libevent源码解析(八)hello, world
/* 简单的TCP服务器,监听TCP连接并回复消息 "hello, world" This example program provides a trivial server program that listens for TCP connections on port 9995. When they arrive, it writes a short message to e...原创 2018-09-11 22:19:18 · 278 阅读 · 0 评论 -
debug心得(持续更新)
本文持续更新,记录debug的岁月里的心(keng)得(die)。 1. 写完代码记得多看几次,避免手抖导致的错误。编译器可以检测出一些明显的错误,但是不能检测出一些问题,比如a[recv] = x;a[send] = y;写成了:a[recv] = x;a[recv] = y;或者a[recv] = x;a[recv] = x;不仔细看,在一大堆代码里有...原创 2018-08-17 21:58:23 · 1252 阅读 · 2 评论 -
Reactor模式详解
本文翻译至大神的论文,名字叫就叫reactor。 reactor设计模式用于需要并发处理多个客户端的服务器。1. 举个例子吧 假设我们需要建立一个提供分布式日志服务的事件驱动服务器。客户们使用客户端会向该服务器发送请求记录自己的状态信息,信息包括错误通知、debug信息、表现诊断等。该日志服务器对于收到的信息进行分类并分发操作,包括:显示屏显示、打印机打印、数据库存储等...原创 2018-08-20 22:15:58 · 9178 阅读 · 8 评论 -
Proactor模式详解
proactor结构模式在异步操作完成后触发服务请求的分配和分发 。1. 举个例子吧 考虑一个需要同时处理多个请求的网络服务程序,比如,一个高效的WEB服务器需要并发的处理来自于不同客户端浏览器的HTTP请求。当一个用户希望从某个URL下载内容时,浏览器和WEB服务器建立连接并发送HTTP的GET请求。WEB服务器顺序执行了:接收浏览器的连接事件,接受连接请求,读取请求,然后解析请求...原创 2018-08-27 23:07:31 · 15996 阅读 · 0 评论 -
libevent源码解析(七)reactor模式及proactor模式
一.前言 在看了一部分源码之后,对reactor模式和proactor有了更详尽的了解。记录在此。网上关于这两个不同的模式有一个很经典的例子:去打印店打印材料人太多了需要排队,老板提供两种服务,一种是排队到你的时候通知你,然后你去选择如何打印,打印什么东西;另一种则是提前告诉老板要如何打印,打印什么东西,老板帮你打印好了再通知你。这两种都是异步的经典方式,可以最大程度的提高效率,至于谁优谁劣...原创 2018-07-28 21:19:04 · 901 阅读 · 1 评论 -
libevent源码解析(六)evbuffer读写查找接口函数
一.前言 在前一篇文章里我们给出了evbuffer和evbuffer_chain相关的基础增删之类的接口函数,在本文中我们重点研究evbuffer的读写查找等接口函数的实现原理。二.查找函数分析(1)evbuffer_ptr结构体/** 指向buffer中指定位置,可以快速的浏览而不需要反复超找 修改evbuffer会导致其失效 Pointer to ...原创 2018-07-28 20:37:57 · 691 阅读 · 0 评论 -
libevent源码解析(五)evbuffer增删拷贝接口函数
一.前言 本篇分析evbuffer以及evbuffer_chain的相关接口函数。源码在buffer.c中,由于接口函数众多,这里仅介绍部分相对比较复杂的,还有很多几行以内实现的就不做介绍了。二.接口函数解析...原创 2018-07-09 20:56:27 · 644 阅读 · 0 评论 -
libevent源码解析(四)evbuffer结构
一.前言 在前文中,我们分析了libevent库最基本的事件:event的数据结构及相关接口函数,并分析了event背后(backend)的事件库/事件管理核心event_base的数据结构及相关接口函数,由此了解了事件管理的整个循环过程,以及加入、删除、激活、释放事件等基本操作。在此基础上,本文分析缓冲部分,即evbuffer结构。二.evbuffer结构体 话不多数,直接看...原创 2018-07-07 10:06:10 · 497 阅读 · 1 评论 -
libevent源码解析(三)event_base接口函数
一.前言 本文将重点介绍event_base相关的几个接口函数,包括: * event_base_new(), event_base_free(), event_base_loop(), * event_base_new_with_config()二.函数介绍(1)event_base_new()函数 该函数功能如字面意思,即建立一个新的event_bas...原创 2018-06-25 20:11:35 · 1259 阅读 · 0 评论 -
libevent源码解析(二)event接口函数
一.前言 在上一篇中,我们提到了event结构注释里说明了可用的接口函数,即 * event_new(), event_free(), event_assign(), event_get_assignment(), * event_add(), event_del(), event_active(), event_pending(), * event_get_fd(......原创 2018-06-23 19:21:58 · 3548 阅读 · 7 评论 -
libevent源码解析(一)核心数据结构
一. 前言 Libevent是一个轻量级的开源高性能网络库,对于学习网络编程、学习C语言等都有着很大的帮助。Libevent 有几个显著的亮点:事件驱动(event-driven),高性能;轻量级,专注于网络,不如ACE那么臃肿庞大;源代码相当精炼、易读;跨平台,支持Windows、Linux、BSD和Mac Os;支持多种I/O多路复用技术, epoll、poll、dev/poll、sel...原创 2018-06-21 19:19:10 · 1194 阅读 · 0 评论