一、代码 有关下面代码,p和q的区别是什么: int main(int argc, char *argv[]) { char* p = "Hello World"; char q[] = "Hello World"; return 0; } 二、区别和解释 p和q的区别是: p 是一个指针,指向程序 只读数据段 的”Hello World”,不可以通过p[x] = x 来赋值,因为不能改变只读数据段的内容。 q 是数组名,也是一个指针,指向栈上从 只读数据段 拷贝来的 “Hello World” 从上面的描述,可以看到,q相对于p是多了一次拷贝的,具体也可以参考[1],[2],最好的方式是汇编gcc -s hello.c -o hello.s汇编代码之后看看(如果需要汇编代码和c对比阅读,可以使用gcc参数,gcc -c -g -Wa,-adlhn hello.c > hello.s,如果需要Inter风格,可以 -masm=intel 继续阅读 >>


杨博东 18/03/18 23:53:56
没有代码的解释不是解释,没有deadline的任务不是任务,没有流程图或分享的源码阅读不是源码阅读,没有报告的性能测试不是性能测试。 —— 漠冰 曰 这篇文章打算作为INFO命令的输出整理汇总,目前还未全部完成… 1. 环境 代码版本:redis-4.0.6 工具:本地用CLion打开,增加CMakeLists.txt就可以调试了。 cmake_minimum_required(VERSION 3.6) project(redis-4.0.6) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") add_custom_target(redis COMMAND make CFLAGS="-g" -C ${redis-4.0.6_SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR}) 2. Memory模块 2.1 源码位置 red 继续阅读 >>


杨博东 18/01/27 19:03:44
2018年1月5日~2018年1月6日 12:00 考完最后一门。 14:00 到哥哥这边吃饭。 16:00 和哥哥去姐姐医院,和姐姐说再见。 17:00 到火车站,取票,下雪路滑,拉着箱子不好走。 17:20 刚取完票过安检,火车站通知Z88停运,查票的小姐姐刚好查到我就是Z88,笑个不停,我问她:这是不是你今天最开心的事?她说:是。 17:40 退Z88,改签T114(23点45发车),哼,这点小事能难倒我? 18:00~23:00 交了10元钱在候车茶水间度过,把书拿出来又装回去了,太吵,而且可能我觉得看书有点装B,或许因为我旁边坐的都是年轻人。 23:00 开始排队候车 23:39 被通知火车晚点 00:30 火车还是晚点,广播开始说:可以办理改签或者退票,我有点后悔改签时候为什么没有选择9点多去杭州的火车,其实主要是因为T114速度快,到的早。 01:07 我查了下机票,很便宜,315,又查了下去机场 继续阅读 >>


杨博东 18/01/07 22:37:39
一、前言 作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统: 主要功能: 读者信息管理:添加、修改、删除、查询读者信息。 图书信息管理:添加图书、修改图书、删除图书、查询图书 图书借阅归还:图书借阅和归还,以及列出借阅情况。 信息统计汇总:图书总量统计、图书借阅统计等。 日志功能:记录用户、图书、借阅相关信息的日志。 参与对象:管理员和用户,管理员主要指图书馆相关工作负责人员,用户指老师或者教工,可以从图书馆借书。 数据存储格式:文件。 数据组织方式:链表。 界面:ncurses库。 其它:CMake组织项目、GitHub版本控制:代码地址 、Linux操作系统运行。 为了体现我大学四年也不是白念的,当然得体现出逼格,那就从界面下手,于是我选择了ncurses这个终端字符库,最后的界面是这样的: 整个界面分为三部分,上面显示系统名称和时间,用 继续阅读 >>


杨博东 17/12/28 15:41:47
源码版本:4.0.1 源码位置: intset.h:数据结构的定义 intset.c:创建、增删等操作实现 1. 整数集合简介 intset是Redis内存数据结构之一,和之前的 sds、 skiplist、dict、adlist 等通用数据相比,它是Redis特有的,用来实现Redis的Set结构(当元素较小且为数字类型时),它的特点有: 元素类型只能为数字。 元素有三种类型:int16_t、int32_t、int64_t。 元素有序,不可重复。 intset和sds一样,内存连续,就像数组一样。 2. 数据结构定义 typedef struct intset { uint32_t encoding; // 编码类型 int16_t、int32_t、int64_t uint32_t length; // 长度 最大长度:2^32 int8_t contents[]; // 柔性数组 } intset; 3. 创建、插入(扩缩容 继续阅读 >>


杨博东 17/11/30 00:52:45
1. 什么是守护进程 守护进程daemon,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束。可以使用命令ps -axj查看系统的守护进程,输出如下所示: 父ID PID 组ID 会话ID 终端 状态 用户ID 命令 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 0 2 0 0 ? -1 S 0 0:00 [kthreadd] 2 3 0 0 ? -1 S 继续阅读 >>


杨博东 17/11/28 01:12:09
内核版本:linux-4.4.18 源码位置:这里 fork相关的代码最终执行的函数为_do_fork(),下面按照顺序分析下_do_fork(): 首先判断是否需要trace(跟踪)这个进程,这一步主要与调试相关,GDB在x86-64 Linux 系统上的原理就是利用ptrace(2)系统调用 [1]。 有关likely和Unlikely,实际上是利用gcc内置函数对分支条件的优化 [2]。 if (likely(!ptrace_event_enabled(current, trace))) // likely表示大多数情况下下面分支会被执行 trace = 0; 接着代码调用copy_process(),它设置了进程描述符以及子进程所需的任何其他内核数据结构。 它的参数和_do_fork()相比增加了一个子进程的pid。 接下来检查clone_flags参数中传递的标志是否兼容。 通过调用security_task_create()来执行额外的安全检查。 调用dup 继续阅读 >>


杨博东 17/11/27 19:57:46
1 调研目的 主要的目的是想调研各大云平台有关Redis监控功能的实现,但是最后我发现各大云平台提供的监控功能都比较基础,比如我想看诸如访问频率较高的HotKey、占用内存较大的Bigkey等指标,它们都没有提供,一部分Redis监控的开源工具实现了这样的功能,但是实现方法实用性不大,见后文汇总。 2 调研情况 2.1 常见公有云平台监控 我所调研的阿里云、腾讯云、青云这三个平台给用户提供的监控信息均是采用Redis Info命令获取的,他们中有的再次对Redis Info的信息做了一些处理,比如阿里云对INFO Commandstats做了排序,提供了TOP Command的信息,但是他们并没有对服务端做改造或者通过其他的方式获取监控信息,因此也没有提供诸如访问频率较高的HotKey、占用内存较大的Bigkey的指标。 阿里云的监控页面: 腾讯云的监控页面: 青云的监控页面: 2.2 开源的Redis监控工具 有一些开源工具提供了类似的 继续阅读 >>


杨博东 17/11/15 22:12:22
一、介绍相关 说Redis : 介绍Redis特性,使用场景,使用Jedis操作Redis等。 二、源码分析 1. 数据结构 Redis源码分析(sds):Redis自己封装的C语言字符串类型。 Redis源码分析(dict):字典的实现,Hash表。 Redis源码分析(adlist):Redis中的双向链表。 Redis源码分析(skiplist) :Redis 中的跳跃表,平均O(log n)的查询效率。 2. 内存编码数据结构 Redis源码分析(intset):Redis 特有内存数据结构intset,元素有序不可重复。 3. 数据类型实现 4. 数据库实现相关 5. 客户端和服务器的相关代码 Redis网络库源码分析(1)之介绍篇 : Redis自己实现的单线程IO多路复用网络库分析(1) Redis网络库源码分析(2)之启动服务器: Redis自己实现的单线程IO多路复用网络库分析(2) Redis网络库源码分析(3)之ae.c: Redis自己实现的单 继续阅读 >>


杨博东 17/11/14 13:08:51
源码版本: redis-4.0.1 源码位置: server.h :zskiplistNode和zskiplist的数据结构定义。 t_zset.c: 以zsl开头的函数是SkipList相关的操作函数。 一、跳跃表简介 跳跃表(SkipList),其实也是解决查找问题的一种数据结构,但是它既不属于平衡树结构,也不属于Hash结构,它的特点是元素是有序的。有关于跳跃表的更多解释,大家可以参考 张铁蕾老师 - Redis内部数据结构详解(6)——skiplist 中有关跳跃表的描述部分,我接下来主要分析有关于Redis跳跃表本身的代码部分,Redis作者antirez提到Redis中的实现的跳跃表与一般跳跃表相比具有以下三个特点: a) this implementation allows for repeated scores. // 允许分值重复 b) the comparison is not just by key (our ‘score’) but by sat 继续阅读 >>


杨博东 17/11/13 19:47:20