Redis源码剖析——概览

Redis至今刚好十年,其优秀的性能与高可用性综合起来可以说是目前最优秀的KV数据库,Redis被广泛用于各种缓存场景 个人认为以下是的Redis的核心优势 单机每秒十万高并发(官方数据) 操作的原生原子性 毫无外部库依赖,源码使用纯粹干净的ANSI C编写 丰富的数据结构可胜任几乎所有业务……

阅读全文

fork后发生了什么——文件篇

首先思考一个问题,我们知道,fork函数会复制父进程的所有打开的文件描述符给子进程(vfork不会复制),对于父进程打开的所有文件,子进程也可以通过句柄值相同的文件描述符进行读写。那么,父子进程同时操作一个文件,这个过程是并行独立,还是互相影响?父子进程同时操作一个文件时,是什么……

阅读全文

fork后发生了什么——内存篇

fork出来的子进程完全拷贝了父进程的地址空间,其中自然就包括了数据段、栈、堆等,我们常用的一种方式是:在fork出来的子进程中调exec函数族来进行后续工作,exec函数族本质上都是execve系统调用,这个函数族会丢弃现存的代码段,并构建新的数据段、栈、堆。在这种背景下,fo……

阅读全文

fork后发生了什么——执行流篇

首先我们先从这个最基本的问题开始: fork为什么"好像"返回了两次? 确实只能说好像,因为函数的栈帧上是不可能两个返回动作的,汇编层面决定了压栈出栈的动作值必须是成对的,一个函数永远都只可能返回一次。有两个返回只是表象,执行流被分成两份同样也只是表象,那么本质上……

阅读全文

知道这个坑,还是踩了

# 不要把全局变量放在任何 “:=“后面!!! * * * 把Db作为全局变量,然后在init中Open的时候因为处理err,于是就 Db, err := sql.Open(“mysql”, dataSource) 结果再测的时候 ![][1] 想了半天怎么会访问非法内存的,后来就想起来了effective go上讲过这个坑,:=每次都会新创建并覆盖上层的……

阅读全文

golang1.4以上版本安装问题

golang在1.4之前是由gcc进行语言源码的编译,在1.5后golang实现自举,因此也专门有了一个1.4-bootstrap版本,用来编译golang1.4后的版本。那么也就是说面,1.4版本之后的版本必须先配置1.4的go环境。 墙无法访问golang.org,需要去国内的……

阅读全文

main函数是C程序执行的入口吗?

当然不是,我们知道,在C中,我们的可执行程序最后是通过链接后来生成的,而链接过程实际上有大量的汇编好的C库二进制文件参与进来,如ctr1.o、crt2.o等。因此最终的可执行程序中,除了我们编写的C代码以外,还有大量的C库文件参与了最终链接,并包含在最终的可执行文件中。 这个“组装……

阅读全文

感谢开源

之前在CSDN上写博客,但实在觉得那上面没有一个纯粹的技术环境,整个页面有三分之一是垃圾广告(当然不能否定CSDN为我国it早期技术文档(?)),实在是不想在那儿写了。 一直准备把自己的博客弄好,无奈一直没有抽出一个这样的时间来,正好今天下午需求做完了,就把这件事干了,前前后后折腾……

阅读全文