db中内存的布局和存放结构已经大致清楚了,这时候需要抽象出来一个专门的分配器,来管理内存的分配,初始化和释放。所以为了管理内存抽象了一个内存分配器Allocator。
当程序运行的时候由于CPU当前寄存器中包含了当前时刻的所有信息,就好像是一部视频里面的一帧一样,假如我们此时记录下当前的cpu的状态信息保存下来,然后给cpu恢复数据到另外一个当时的cpu记录现场,那么理论上此时程序的执行状态就会沿着上一个程序状态执行,也就是程序跳到了另一个执行的上下文。听起来好像是可行的,其实确实可行,并且基于这种技术posix也提供了几个函数专门来实现这种超级goto的功能。
从main函数开始程序的运行是怎样的一个过程,程序是怎么给一个函数输入参数的?程序是如何知道函数的返回结果的?林纳斯曾经说过我们应该对我们所写的代码运行的细节完全了解才是一个合格的程序员。
提起segmentfault估计大家都不陌生,搞linux下C,C++程序员都知道,出现这个错误原因无外乎有几种
1,内存越界踩到了别人家的内存。
2,不小心除零了或者运算浮点数的时候异常了,比如:1/0。
3,堆栈溢出,比如:递归的时候没有设置边界条件。
主要这几种,感觉出来吧这种错误每个都很严重呀!确实如此,出现这种错误,程序基本gg思密达,当你开启coredump功能的时候,比如用下面的命令:
ulimit -c unlimited //unlimited含义是信息有多大我打印多大,无限制。
程序临死之前会打印coredump信息到文件里面,找问题的时候一般用gdb调试coredump大部分可能会还原出当时崩溃时候函数调用堆栈还有其他各种信息,当然如果你运气不好,程序跑飞把调用堆栈破坏了,那就尴尬了,除非一些特殊技巧,问题也很难查。另外万一程序是很重要的程序,并且重启代价很大,比如那种有cache的程序需要预热或者加载大量数据的程序,启动都要花一段时间,恢复处理起来也很棘手,比如前段时间部门除了一个P1事故就是因为一个插件有问题导致整个十几台服务器程序崩溃,导致服务终端一小段时间,大写的尴尬。
那么问题来了有没有可以像超级try,catch的功能能够捕捉住C,C++程序的崩溃点,然后跳过这段代码执行备份代码呢,想想就是一件美好的事情,那必须有呀!