GCC的编译选项
GCC的编译选项Makefile 中的gcc的编译选项有很多,因此学习记录下。
这些选项在Makefile文件中常用CFLAGS(gcc 用在c语言的编译),CXXFLAGS(g++用在c++的编译)来表示。
程序编译的过程gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:
1、预处理,生成 .i 的文件[预处理器cpp]
2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
3、将汇编代码变为目标代码(机器代码)生成 .o 的obj文件[汇编器as]
4、连接目标代码, 生成可执行程序 [链接器ld]
选项
选项
释义
-c
只激活预处理,编译,和汇编。只把程序做成obj文件,不是可执行文件(因为没有链接,有的程序中也没有main入口)
-S
只激活预处理和编译,就是只把文件编译成为汇编代码。生成.s的汇编代码
-E
只激活预处理,不生成文件,你需要把它重定向到一个输出文件里面 例子:gcc -E hello.c > pianoapan.txt
-o
指 ...
Linux shell脚本计算运行时间
Linux shell脚本计算运行时间这个功能经常用但是,总是现用现查,很麻烦。
代码
123456789101112131415161718192021222324252627282930313233343536# filename: msec_diff.shfunction timediff() {# time format:date +"%s.%N", such as 1502758855.907197692 start_time=$1 end_time=$2 start_s=${start_time%.*} start_nanos=${start_time#*.} end_s=${end_time%.*} end_nanos=${end_time#*.} # end_nanos > start_nanos? # Another way, the time part may start with 0 ...
Redis源码阅读——字典
Redis源码阅读——字典字典是整个Redis实现的基础,之前把《Redis设计与实现》书上的理论知识看完了,开始阅读源码。
Rehash参考https://tech.meituan.com/2018/07/27/redis-rehash-practice-optimization.html
https://luoming1224.github.io/2018/11/12/[redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0]redis%E6%B8%90%E8%BF%9B%E5%BC%8Frehash%E6%9C%BA%E5%88%B6/
gdb 调试
gdb调试以前学习过,用得少,又忘记了,现在刚好为了调试redis 的dict 模块,所以再次记录。
使用摘自参考<https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html>。 主要是补充实例
对C/C++程序的调试,需要在编译前就加上-g选项:
1$g++ -g hello.cpp -o hello
自己的Makefile里面修改成:
12dict-benchmark: dict.c sds.c siphash.c $(CC) -g -o $@ $^
但是好像没加之前也是可以直接就使用gdb 了? 不知道为什么(可以使用但是出错不会显示所在的行,相当于没有调试)
调试可执行文件:
1$gdb <program>
program也就是你的执行文件,一般在当前目录下。
调试core文件(core是程序非法执行后core dump后产生的文件):
12$gdb <program> <core dump file>$gdb program core.111 ...
Redis源码阅读——dict
Redis源码阅读——dict继续Redis 的源码阅读,进入dict这一章节。知识点讲解,见redis设计与实现的读书笔记dict这一章。
dict的创建还是和sds一样单独将dict模块给提取出来,参考博客是直接将server的main函数给修改了的。再阅读Makefile的时候发现了dict-benchmark 这个选项,make dict-benchmark 这个命令,可以编译出一个可执行文件dict-benchmark。
所以想着应该可以单独再把dict-benchmark给提取出来。
需要拷贝的文件
1dict.c ditc.h fmacros.h redisassert.h sdsaclloc.h sds.c sds.h siphash.c
需要做的修改
zmalloc zfree zcalloc 需要修改成使用malloc ,free, calloc 其中zcalloc在修改成calloc的时候需要在调用的时候多传入一个参数1,作为第一个参数,因为zcalloc 和calloc 的接口不一样。
还需要在redisassert.h 中对_serverAssert函数 ...
Docker 学习
Docker 学习之前一直听说容器可以免去配置环境的麻烦,但是一直没有机会接触,现在刚好有机会可以使用。
三大基础镜像、容器、仓库
类比的话:镜像是类(iso),容器是实例(操作系统),仓库类似于git的仓库。
镜像的构建是一层层的继承而来的,镜像和容器都是文件,容器退出的时候容器文件依然存在。除非手动使用-rm指定,才会删除。
从仓库下载镜像,加载镜像后进入容器,容器保存后构成镜像,镜像推送至仓库。
命令加载镜像,进入一个新的容器:docker run --name mydocker image:tag command
实例 摘自:https://yeasy.gitbooks.io/docker_practice/image/pull.html
123docker run -it --rm \ ubuntu:18.04 \ bash
docker run 就是运行容器的命令 从镜像中新建一个容器
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容 ...
计算Linux系统的CPU利用率
计算Linux系统的CPU利用率通过读取系统的/proc/stat 信息来计算CPU的利用率
cpu 信息的读取摘自参考博客:https://blog.csdn.net/x_i_y_u_e/article/details/50684508
在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。
在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考:http: ...
Redis设计与实现读书笔记——第九章 数据库
Redis设计与实现读书笔记——第九章 数据库终于看到了服务器部分了,主要是想搞懂数据库的整个流程与架构。
9.1 服务器中的数据库将所有数据库都保存在redis.h/redisServer结构的db数组中(哇,不可思议用数组来保存的),db数组每个项都是一个redis.h/redisDb结构指针,而一个redisDb代表了一个数据库。
Redis设计与实现读书笔记——第8章 对象
Redis设计与实现读书笔记——第8章 对象Redis 并没有直接使用sds、dict等数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种前面所介绍的数据结构。
简介对象的好处:
根据对象的类型来判断是否可以执行给定的命令。
针对不同的使用场景, 为对象设置多种不同的数据结构实现, 从而优化对象在不同场景下的使用效率。
对象的特性:
基于引用计数技术的内存回收机制(和java的是否原理相似)
通过引用计数技术实现对象共享机制,多个键共享同一个对象来节约内存
带有访问时间记录信息,可以用来删除空转时长较大的键
8.1 对象的类型与编码Redis 使用对象来表示数据库中的键和值,创建一个新的键值对的时候,至少包含两个对象:1. 键对象 2. 值对象
对象都由一个 redisObject 结构表示,保存数据相关的属性
123456789101112131415typedef struct redisObject { // 对象类型 ...
Redis 设计与实现读书笔记——第四章 字典
Redis 设计与实现读书笔记——第四章 字典字典在Redis中应用很广泛,Redis的数据库就是用字典作为底层实现的,对数据库的增删改查操作也是构建在对字典的操作之上的。
简介作用:
数据库底层实现
哈希键底层实现
哈希键包含的键值对比较多,或者键值对中的元素都是比较长的字符串时,使用字典来实现。
其他功能
4.1 字典的实现字典使用哈希表实现,一个哈希表里面可以有多个哈希表节点,一个哈希表节点就保存了字典中的一个键值对。(python的dict也是使用哈希表实现的)。
哈希的本质就是预留内存空间,将需要存储的元素计算索引值(通过哈希函数)来确定对应的存储位置。当需要访问的时候可以通过哈希函数直接获得对应的地址。(编译器将变量名与地址做了映射,变量名是地址的别名,哈希则是将键与地址做了映射(通过哈希函数),大大提高了访问的效率。访问任何元素都是O(1),感觉是两个层面的映射,有点相似的感觉)。
4.1.1 哈希表Redis使用的哈希表由dict.h/dictht 结构定义。
1234567891011typedef struct dictht { //哈希表 ...