redis 使用到的位域 今天在看redis源码的时候在3.0版本的redis.h 文件中发现了这样的几行代码,看了有趣,研究了一番,才发现这个东西就是c语言中的位域。 /* * redisObject Redis对象 */ typedef struct redisObject { unsigned type : 4; // 类型 unsigned encoding : 4; // 编码 unsigned lru : REDIS_LRU_BITS; // 对象最后一次被访问的时间 int refcount; // 引用计数 void *ptr; // 指向实际值的指针 } robj; 关于这个概念,整理的内容有以下部分。 什么是位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域” 继续阅读 >>


刘嘉辉 19/01/20 21:32:19
进程池 进程池的使用场景 当我们需要并行的处理大规模任务的时候,需要使用到多进程,多线程技术,比如说服务器处理大量客户端的任务,我在大一的时候写过一个C/S+mysql架构的聊天室,大概是这样处理的,每当有客户端发出连接请求时,服务器accept成功以后就去fork一个进程去处理关于这个客户端的所有请求,经过后来的一系列的学习,这显然是极其不科学的,狂开进程浪费资源且不说,效率也极低。 动态创建进程(或线程)是比较耗费时间的,这将导致较慢的客户响应。 动态创建的子进程(或子线程)通常只用来为一个客户服务(除非我们做特殊处理),这将导致系统上产生大量的细微进程(或者线程)。进程(或者线程)间的切换消费大量CPU时间。 动态创建的子进程是当前进程的完整映像。当前进程必须谨慎地管理其分配的文件描述符和堆内存等系统资源,从而使系统的可用资源急剧下降,进而影响服务器的性能。 池化的思想 为了解决上述问题呀,我们的前辈们相出了用池化的思想来解决这些资源消耗问题。简而言之,就是提前创建好一些进程,一般3-7个 继续阅读 >>


刘嘉辉 19/01/03 10:46:49
彻底理解 fork 之写时复制 《一》 一直以来都对操作系统都比较感兴趣,这篇文章呢就主要研究一下当我们调用fork系统掉用所用到的写时复制技术(copy-on-write)。 下图是fork系列函数的调用过程 <摘自网络 侵删> 写时复制,其实在很多地方都会用到,我们先来看看关于字符串使用写时复制的例子吧。 写时拷贝故名思意:是在写的时候(即改变字符串的时候)才会真正的开辟空间拷贝(深拷贝),如果只是对数据的读时,只会对数据进行浅拷贝。 写时拷贝:引用计数器的浅拷贝,又称延时拷贝 :写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针分配自己的空间(注意这时引用计数的变化,旧的空间的引用计数减一,新分配的空间引用计数加一)。 基于此 我们来再看看调用 fo 继续阅读 >>


刘嘉辉 18/12/29 11:31:33
高性能定时器(一) 先来三句口号 我们通常所说的定时器是定时器容器,是容器类数据结构。 定时器是容器内容纳的一个对象,是对定时器的封装。 我们通常所说的定时器是定时器容器,是容器类数据结构。 定时器是容器内容纳的一个对象,是对定时器的封装。 我们通常所说的定时器是定时器容器,是容器类数据结构。 定时器是容器内容纳的一个对象,是对定时器的封装。 前几日学习了一下定时器 首先吐槽一下,最近学的东西感觉都听上去很高大上,但是自己一接触发现也就那么回事,像是一位长发飘飘的白衣女子,可是又何必回身过来乱了芳华。 哈哈哈,废话就不多说了。 开篇题为高性能定时器,这次呢我们根据定时器的种类大致上分为三个模块,基于链表的定时器,还有两个比较常用的高性能定时器,时间轮和时间堆 不过在具体地讨论如何组织定时器之前,我们先要介绍一下定时的方法。定时是指在一段时间后触发某段代码的机制。换言之,定时器机制是定时器得以被处理的原动力。linux 提供三种方法,如下所示: socket选项SO_RCVTIMEO 和 SO_ 继续阅读 >>


刘嘉辉 18/12/26 23:03:01
统一事件源的实现 我们在编写高性能服务器的代码时,通常会需要处理很多的信号,如下所示 时间事件 信号 数据读 数据写 网络异常 为了程序的性能,鲁棒以及代码的优化,通常会将所有的这些需要处理的任务包装成事件添加至多路复用函数的事件集中处理。 一般信号处理时会将一些信号屏蔽,为了不屏蔽这些信号太久,同时也不至于主逻辑被冲散,一种解决方案是:信号处理函数只是简单的通知主循环(用于处理I/O事件)并告诉信号值,真正的信号处理逻辑被主循环调用,根据信号值做出相应的处理。信号处理函数和主循环之间通常用管道做通信。信号处理函数从管道的写端写入信号值,主循环从管道的读端读取信号值。因为主循环本身就要利用I/O复用函数监听链接进来的socket,所以将这个管道一并注册进I/O复用函数就能在主循环中及时得到信号到来的通知。 总结起来就是 频繁地直接处理信号不利于程序的性能和可靠性,我们把信号也包装成一个事件,添加进多路复用函数的事件集里进行统一处理 很多优秀的I/O框架库和后台服务程序都统一处理事件和I/O事件,比 继续阅读 >>


刘嘉辉 18/12/18 21:16:11
关于用指针交换两个数 西邮Linux 兴趣小组又到了纳新季,作为一个老学长,面试学弟学妹们的时候,必然要然他们感受到小组的关怀(受尽折磨),这一届孩子还是挺强的,但是一到指针上就栽了坑,在加上我们小组的陈年老题swap屡试不爽。所以在这里总结一下关于用一级 二级指针交换两个数字的问题。 一级指针交换 #include<stdio.h> int swap(int *c , int *d) { int *q; q = c; c = d; d = q; printf("%d %d\n", *c, *d); } int main () { int a=5, b=10; swap(&a, &b); printf("%d %d\n" , a, b); return 0; } /* 这个得出结果是 10 5 5 10 */ 由结果来看的话,是在 swap 里边是交换成功了的。 这个原因是因为 继续阅读 >>


刘嘉辉 18/12/14 12:08:30
壹、sds (SDS)Simple Dynamic String, 从字面意思上来简单理解就是简单的动态字符,其为具有动态增加空间的能力,扩容不需要使用者担心。 好的咱们来看一下他的数据结构吧 这个版本是黄所注释的3.0版本 typedef char *sds; //注意,sds其实不是一个结构体类型,而是被typedef的char*,好处见下文 struct sdshdr { unsigned int len; //记录buf中已经使用的长度 等于SDS所保存的字符串的长度 unsigned int free; //buf中未使用的长度 char buf[]; //柔性数组buf }; sds遵循c字符串以空字符结尾的惯例,但是保存空字符的一字节空间不计算在sds的len属性之中,并且为空字符分配额外的一字节空间,使用这一惯例的好处是可直接重用c字符串函数库里面的额函数,这也符合软件工程的思想。 此处应有图(没图你说个毛) 但是在 继续阅读 >>


刘嘉辉 18/12/12 10:44:08
August 6, 2018 Fix some issue #18 Fix crash when users serach last 3 days log bug tracker Thread 1 "gnome-logs" received signal SIGSEGV, Segmentation fault. 0x00007ffff595f5b4 in g_date_time_to_unix () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 (gdb) bt #0 0x00007ffff595f5b4 in g_date_time_to_unix () at /lib/x86_64-linux-gnu/libglib-2.0.so.0 #1 0x000055555555ea7c in query_set_day_timestamps (query=0x555556772ce0, start_day_offset=<optimized 继续阅读 >>


刘嘉辉 18/08/12 12:27:36
July 29, 2018 Dispaly the new row entry !!! During GUADEC, my mentors told me that I needed to complete the project before ui freeze. It took only two weeks to calculate the time. So I dare not stay too much. I immediately set off to return to China and continue my project. After I returned to China, I started my daily work. We discussed during GUADEC. Starting from 7.13, there will be a shorter meeting at 9:00 pm Beijing time. I need to report to t 继续阅读 >>


刘嘉辉 18/08/10 20:03:04
Really Get Correct log entries from journal! && GUADEC July, 10, 2018 The most memorable thing about this period is to participate in GUADEC–2018. Since there will be a blog dedicated to what you have seen and heard during GUADEC, I won’t go into details here. Entering the theme, it is obvious that after meeting with my two mentors, some of my problems have been solved. About reading new log messages and how to set up a correct cursor system 继续阅读 >>


刘嘉辉 18/08/08 17:48:25