- 博客(156)
- 资源 (1)
- 收藏
- 关注
原创 释放内存流程
前面我们说了当 thread cache 某个自由链表过长时, 会还一段内存对象给 central cache 对应的span, 但到底是 central cache 中哪一个span, 这是需要计算的, 因为 central cache 中有很多个SpanList双向链表结构, 每个双向链表里面又有很多个span, 所以不同的内存对象可能对应不同的span.合并结束后, 需要将span挂到对应的双向链表中, 并且需要建立前后页到该span的映射, 方便后面合并出更大的span.
2023-02-24 22:01:19
332
1
原创 page cache设计及实现
因为 page cache 是直接按照页数进行映射的, 因此我们要从 page cache 中获取一个k页的span, 就应该直接去找 page cache 的第k号桶, 如果第k号桶中有span, 那我们直接头删一个span返回给 central cache 就行了, 如果没有, 继续向下遍历直至最后一个桶, 在这期间, 如果第n号桶挂有n页的span非空, 将其分裂成一个k页的span和一个n-k页的span.表示页大小转换偏移, 这里我们按每页8K的大小为例, 那么。
2023-02-21 22:03:57
701
1
原创 central cache设计及实现
span 是管理以页为单位的大块内存.// Span 管理一个以页为单位的大块内存 struct Span {// 大块内存起始页的页号 size_t _n = 0;// 页的数量 Span * _prev = nullptr;// 双向链表的结构 Span * _next = nullptr;// 切好的小块内存的自由链表 };
2023-02-16 21:30:37
316
原创 项目整体框架 + thread cache设计及实现
这里我们暂时只提供一个申请内存对象的函数, 后面再进行补充. 对于申请内存对象的过程, 首先根据提供的字节数计算出映射到自由链表桶的下标, 如果这个自由链表非空, 则头删即可, 反之, 如果这个自由链表是空的, 则需要从 central cache 中获取, 这时需要使用 FetchFromCentralCache 函数, 这个我们会在后面补充.按照上面 8字节 的对齐方式, 如果你要10字节, 我给你16字节, 剩下的6字节用不上, 也就变成了内碎片(由于对齐的需求, 有的小块内存用不上).
2023-02-15 17:15:26
185
原创 项目介绍 + 定长内存池设计及实现
这个项目是实现一个高并发的内存池, 它的原型是 Google 的一个开源项目 TCMalloc, 全称是 Thread-Caching Malloc, 即线程缓存的 malloc, 实现了高效的多线程内存管理, 用于替代系统中的内存分配函数(malloc, free).
2023-02-14 12:05:37
279
原创 Linux系统编程·进程创建及终止
OS将不同的数据结构全部维护到一个链表中, 空间并没有释放, 只是设置为无效, 当再次创建进程时, OS会直接从这里拿出来相关的task_struct 和 mm_struct这些内核数据结构, 由此省去了开辟空间所花费的时间, 这样一来, 只要处理新进程的代码和数据的初始化工作即可.这里会提到一个概念, 叫做内核的数据结构缓冲池(slab分派器)当一个进程调用 fork 函数之后, 就会有两个二进制相同的代码的进程, 而且它们都运行到相同的地方, 但是每个进程都可以执行自己的代码.为什么用非零表征失败呢?
2022-11-10 17:33:55
494
6
原创 Linux系统编程·进程地址空间
我们之前在C语言上面所学习的程序地址空间,是内存吗?其实不是内存,而且也不应该叫做程序地址空间,应该叫进程地址空间,这是操作系统上的概念。进程地址空间如下图所示分布:好,下面我们进行验证:验证一:进程地址空间验证验证二:验证堆和栈增长方向的问题很明显:堆的地址逐渐增大,栈的地址逐渐减小。验证了堆区向地址增大的方向增长,栈区向地址减小的地方增长,堆栈是相对而生的。所以一般在C函数中定义的变量,通常是在栈上保存的,那么先定义的变量一定是地址比较高的。验证三:如何理解 static 变量?函数
2022-11-10 06:45:00
343
原创 Linux系统编程·进程优先级
所以,在Linux中, 如若要调整进程的优先级, 需要改变的是进程的 nice 值. 不过注意哦, nice 值是有范围的, 它的取值范围是 -20 到 19. 这个我们也能理解,可能有老铁会问了, 诶, 不对呀, 我的电脑是单CPU的, 但是我的电脑上好多个进程都在跑啊, 比如我一边在VS上敲代码, 一边打开QQ音乐听歌, 这是为什么呢?孤儿进程在父进程退出后,父进程成为init进程,进程退出,孤儿进程的资源将被init进程释放;CPU内的寄存器, 可以临时的存储数据, 非常少, 但是很重要.
2022-11-09 16:15:19
536
原创 Linux系统编程·进程状态
前面我们说了进程的概念, 掌握了 fork 系统接口的基本使用, 那这里有一个问题就是: 我们在调用一个函数, 当这个函数准备 return 的时候, 这个函数的核心功能完成了吗?已经完成了, 此时:为了搞清楚正在运行的进程是什么意思, 我们需要知道进程的不同状态.运行态运行态指的是进程正在CPU上运行, 还是进程只要在运行队列中就叫做运行态?答案是进程只要在运行队列中就叫做运行态, 代表我已经准备好了, 随时可以被调度器调度.(正所谓, 时刻准备着!)终止状态指的是这个进程已经被释放了, 就叫做
2022-11-08 17:46:06
322
1
原创 string·模拟实现
而此时另一些对象不知道该资源已经被释放, 以为还有效, 当继续对该资源进行操作时, 就会发生违规访问. 所以要解决浅拷贝问题, C++特意引入了深拷贝.
2022-11-08 09:54:15
636
原创 Linux系统编程·进程概念
所以,这也就引入了下面的一个问题: 创建进程有很多方法, 如 ./你的程序(./myProcess), 每次执行./myProcess 时, 进程 pid 发生变化, 但是父进程 ppid 不变, 那为什么 ppid 不变, 父进程是谁呢?我们知道是不可以的, 那在我们的C语言中有没有可能两个以上的死循环同时运行, 这也是不可能的.程序是静态的指令集合,保存在程序文件中, 进程是程序的一次运行过程中的描述。这就好像我们前面说的那个学生的例子,所以为什么管理进程要有PCB呢?
2022-11-07 20:38:34
684
原创 Linux系统编程·环境变量
所以,环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如我们在编写C/C++代码,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找;在讲解获取环境变量之前,请老铁回答我一个问题:我们之前使用C语言时,经常写main函数,所以我要问的是main函数可以带参数吗,最多可以带几个?我们看到,带上路径之后运行成功了,上面没带路径却报没有找到的错误,这是为什么呢?为什么系统的命令能找到,而我们自己的程序找不到呢?
2022-11-06 19:46:17
372
原创 C++内存管理
在C语言中我们学习过内存管理方面的知识,比如malloc(), calloc(), realloc(), free()等,今天我们来看看C++是如何进行内存管理的。};//申请单个Date类型的空间 Date * p1 =(Date *) malloc(sizeof(Date));free(p1);//申请10个Date类型的空间 Date * p2 =(Date *) malloc(sizeof(Date) * 10);free(p2);
2022-10-28 06:45:00
741
3
原创 模板·初阶
因为在编译期间,当编译器看到该实例化时,需要推演其实参类型,通过实参a1 将T推演为int ,通过实参d1 将T 推演为double ,但是模板参数列表只有一个T ,所以编译器无法确定将这里的T视为int 还是double 而报错。比如上图:当用int 类型使用函数模板时,编译器通过对实参类型的推演,将T 确定为int 类型,然后产生一份专门处理int 类型的代码,当然了,对于 double类型也如此。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2022-10-25 21:34:54
1264
4
原创 Linux系统编程·进程概念引入
不知不觉写博客已经一年过去了,还是有点小感慨的呀。目前大三,每天都有很多任务需要完成,所以就不多说了,OK,下面我们开始更新Linux系统编程和网络编程方面的知识,讲的比较深入哦,而且这部分内容还是有难度的,不过我会尽可能的让知识不那么抽象,跟上我的脚步,一起加油吧。
2022-10-19 06:45:00
656
原创 string类·基本使用
从今天开始我们就慢慢进入C++的STL部分咯,我会讲解的比较深入,不过请铁子们放心,还是不太难理解的,跟上我的步伐即可。不过需要注意的是,string是在C++标准库中的,不是在STL中,因为string的产生早于STL。关于string类的文档介绍对了,有一点需要说明一下,从现在开始大家要尝试读英文文档,不需要一个单词一个单词去翻译,所表示的大致意思知道即可。
2022-10-07 07:45:00
443
1
原创 类和对象·引入
前面的C++入门知识已经讲解完毕了,重难点部分需要及时消化哦,现在我们开始类和对象的学习,老铁请放心,这部分内容虽然有点多,也属于重点,但是不算太难,跟着我肯定都能掌握的,加油吧少年们。//类体:由成员函数和成员变量组成 };//一定要注意后面的分号class为定义类的关键字,className为类的名字,{}中为类的主体,注意类定义结束时后面的分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。...
2022-09-15 07:45:00
372
1
原创 C++入门·收尾
前面讲到的函数重载和引用是C++入门部分的重点,校招时也很重要,所以大家要牢牢掌握哦,今天的内容就简单多了,加油吧少年们。C++11规定 auto 作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。//可认为typeid(x).name()返回的是变量x的类型 cout
2022-09-08 07:45:00
804
4
原创 原来引用还有这么多不为人知的秘密呢?
前面我们有讲解函数重载相关的知识,因为比较重要,所以讲的比较详细,下面还有一个很重要的知识点——引用,虽然很重要但是不难哦,不信你看看就知道了。
2022-08-29 07:45:00
503
4
原创 C++启航跟沸羊羊有关系吗?
C++入门核心技术》专栏主打大厂校招高频考点,助力大家直迎大厂C++方向面试,当然,如果你仅仅只是为了应付学校考试,那就更没有问题了,学完这个专栏的一部分内容就可以考个不错的成绩。欧克,任我说得天花乱坠都没用,得拿成品出来,下面直接进入今天的主题。分割线:梦想启航定义命名空间,需要使用namespace关键字,后面跟上命名空间的名字,然后接上一对大括号即可,{ } 中即为命名空间的成员,可以定义变量、函数以及类型。命名空间中可以定义变量、函数以及类型。...
2022-08-26 16:51:59
2378
48
原创 为什么C++中的继承比Java设计的要复杂,原因竟出在这儿?
我们知道面向对象的三大特性有封装、继承和多态。可能有铁子会误以为面向对象只有这三大特性,其实不然,还有其他的特性,比如反射、抽象等。那今天我们就好好来说说C++是如何设计继承的,为什么说比Java的继承要复杂呢?下面我们看到Person类是父类,也叫基类;Student类是子类,也叫派生类。1、我们都说C++语法复杂,其实多继承就是一个体现。有了多继承,就会存在菱形继承,有了菱形继承就会有菱形虚拟继承,它们的底层实现相当复杂。...
2022-07-30 08:12:38
1624
41
原创 换了一把椅子之后才知道,原来人体工学可以这么香。
程序员是职业病高发群体,常见的职业病有久坐不动给前列腺带来的危害、颈椎病、腰椎病以及眼疲劳、作息不规律导致的胃病等一系列问题,尤其是腰椎脊椎和眼睛,很重要,需要格外重视起来哦。毕竟我们作为祖国的花朵,我们应该背靠祖国,面向国际,强我国威,壮我山河。你要相信,苦心人,天不负,三千越甲可吞吴!条件允许的话,出行骑单车;多喝茶,少喝饮料;养个小植物,偶尔摆弄一下换换脑;晨跑夜跑啥的也很不错;当然也可以跟着刘教练运动。平时你有锻炼的习惯吗,欢迎在评论区下留言。总结https。....................
2022-07-27 07:30:00
2404
89
原创 C++代码&C代码能否互相调用?答案是肯定的
好久不见鸭铁子们,前段时间在备考所以没有及时更新,万分抱歉久等了。前文说到:【请问】函数重载·真的讲明白了吗?很详细的讲解了函数重载的底层知识,如果有铁子没来得及看前文知识,可以去看一下,绝对通俗易懂能收获到一些东西的。OK,今天我们讲的是C++&C语言能否相互调用?我们知道C++语言尽管是在C语言的基础上进行大量补充的语言,但是C++语言和C语言依然是不同的编程语言,那么C++和C语言可以互相调用吗?答案是肯定的,详细请看下文。之前我们在学习栈这个数据结构的时候,我有讲解过有效的括号 这一题目,那时候
2022-06-16 07:30:00
871
25
原创 面试研发岗,我掏出自己的计算机二级证书,面试官问我礼貌吗?
大家好,我是安然无虞。 写在前面:敖丙怎么说?其实对于我们计算机专业的学生来说,用来检验自己计算机水平且是企业认可的比赛是不多的,所以我就想除了博客,除了GitHub,在以后面试的加分项还能有别的吗?ACM那些算法大赛?算了吧,太费头。那计算机二级?别了吧,咱去面试程序员,拿个计算机二级证书多少有点不礼貌。(当然,我并不是说它没有意义,当然有!本身我们在备考的阶段就是在提升自己。但是拿它去面试,面试官不会给你.........
2022-05-21 07:45:00
19740
64
原创 【请问】函数重载·真的讲明白了吗?
大家好,我是安然无虞。 上文说到,函数重载是这样定义的:要求:同一作用域中,函数名相同,函数参数不同,指的是参数个数/类型/顺序不同(形参类型顺序),注意哦,不关返回值类型的事。C语言不支持同名函数,但是C++支持比如:int Add(int left, int right){ return left + right;}double Add(double left, double ......
2022-05-17 07:45:00
1174
44
原创 keychron凭什么高效学习&快速码字
大家好,我是安然无虞。目录写在前面笔记本自带键盘为什么还需要机械键盘?1.手感好,更稳定补充:段落感2.结实&耐用&实惠3.轴体丰富青轴茶轴红轴4.时尚·极致轻薄5.RGB灯光炫酷使用机械键盘需要注意哪些点?keychron键盘的优势CSDN开发者商城写在前面这两年经常敲代码、码字,所以键盘被使用到的次数很多,因为频繁使用电脑自带键盘,生怕把它敲坏,毕竟笔记本键盘换一个还是很贵的,所以我也就踏上了使用机械键盘的...
2022-05-13 07:45:00
8490
55
原创 八大排序·希尔排序
大家好,我是安然无虞。 文章目录希尔排序1.基本思想预排序2.算法实现3.时间复杂度遇见安然遇见你,不负代码不负卿。插入排序分为两种:直接插入排序&希尔排序希尔排序1.基本思想希尔排序是在直接插入排序基础上的优化,属于非常牛掰的一个排序。 核心思想: - 先进行预排序,让数组接近有序;- 直接插入排序预排序预排序步骤:分组排,假设gap==3,间隔为gap的为一组,然后分别使用插入排序的思想对这gap...
2022-05-11 11:22:57
624
4
原创 八大排序·直接插入排序
文章目录直接插入排序1.基本思想2.算法实现3.时间复杂度遇见安然遇见你,不负代码不负卿。 大家好,我是安然无虞。 插入排序分为两种:直接插入排序&希尔排序直接插入排序1.基本思想直接插入排序是一种简单的插入排序算法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。说得通俗一点就是: .
2022-05-10 23:27:40
777
12
原创 C++入门·开篇
文章目录写在前面:话题挑战赛第1期一、C++关键字二、命名空间1.命名空间的定义2.命名空间的使用三、C++输入&输出四、缺省参数/默认参数1.缺省参数的定义2.缺省参数分类I.全缺省参数II.半缺省参数五、函数重载六、遇见安然遇见你,不负代码不负卿写在前面:话题挑战赛第1期开始入坑C++了,嗐,说实话细节有好多,怎么说呢,我相信,今天是灰色的,明天是灰色的,后天一定是美好的,加油吧少年们。在开始之前嘞,先向大家介绍目前官方大力支持的一项活动:话题挑战赛第一期一个人走,可能走的很快,但一群
2022-05-09 23:00:49
3037
33
原创 奉劝想把编程学好的学弟们 · 如何高效学习编程?
大家好,我是安然无虞。一、写在前面·简单介绍为了记录自己的成长历程,也刚好3万粉了嘛,所以前来感谢大家的认可与厚爱,再加上近期有些大一大二老铁的老铁私信我说自己比较迷茫,不知道怎么上手编程,远远不满足于学校所教授的内容,所以呢,有感而发,特意写下了这一篇关于IT大学生该如何学习技术的文章,内附有详细的学习路线及规划,喜欢的老铁来波三连,抱拳了哈。由于我是在去年十月份中旬开始写的第一篇文章,目前还是一位小博主,肯定有很多学长学姐学弟学妹们没有看过我的文章,所以首先呢,我...
2022-04-20 07:45:00
19346
250
原创 致大学生——成为博主半年了,谈谈博客对于就业和考研的重要性
大家好,我是安然无虞。文章目录 每篇前言一、简单唠唠嗑二、为什么不写博客1.浪费时间,意义不大2.技术含量低,担心被喷被嘲笑3.学习任务中,没有时间去写4.很想写,但不知道写什么三、写博客的好处·意义所在1.检测自己对于技术点的理解2.就业面试考研复试的加分项3.提升思维逻辑力和文字组织力四、为什么选择CSDN五、新星计划·C/C++赛道六、遇见安然遇见你,不负代码不负卿。 每篇前言博客主页:安然无虞作者认证:2021年度博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主...
2022-04-18 07:45:00
5544
22
原创 【手把手带你刷好题】69.回文链表
大家好,我是安然无虞。文章目录 每篇前言面试题:回文链表解题思路遇见安然遇见你,不负代码不负卿。 每篇前言博客主页:安然无虞作者认证:2021年博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。火爆专栏:蓝桥杯基础算法剖析欢迎加入:比特社区种一棵树最好的时间是十年前,其次是现在。各位,共勉。面试题:回文链表原题链接:回文链表题目描述:对于一个链表,请设计一个时间复杂度...
2022-04-06 15:26:08
629
5
原创 【手把手带你刷好题】68. 链表中间结点
大家好,我是安然无虞。文章目录 每篇前言面试题:链表的中间节点解题思路遇见安然遇见你,不负代码不负卿。 每篇前言博客主页:安然无虞作者认证:2021年博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。火爆专栏:蓝桥杯基础算法剖析欢迎加入:比特社区种一棵树最好的时间是十年前,其次是现在。各位,共勉。面试题:链表的中间节点原题链接:链表的中间节点题目描述:给定一个头结点为...
2022-04-06 15:24:32
573
1
原创 【手把手带你刷好题】67. 反转链表·深剖
大家好,我是安然无虞。文章目录 每篇前言面试题:反转链表解题思路1:翻指针方向解题思路2:头插法遇见安然遇见你,不负代码不负卿。 每篇前言博客主页:安然无虞作者认证:2021年博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。火爆专栏:蓝桥杯基础算法剖析欢迎加入:比特社区种一棵树最好的时间是十年前,其次是现在。各位,共勉。面试题:反转链表原题链接:反转链表题目描述:给...
2022-04-06 15:22:27
593
1
原创 《刷面试真题学数据结构·助你月薪提高3K》· 数据结构和算法那些事儿
大家好,我是安然无虞。 每篇前言博客主页:安然无虞作者认证:2021年博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。火爆专栏:蓝桥杯基础算法剖析一、复杂度的概念1.算法效率算法效率有两种:一是时间效率;二是空间效率2.时间复杂度算法中基本操作的执行次数,为算法的时间复杂度3.空间复杂度对一个算法在运行的过程中临时占用存储空间大小的量度,不是指程度占用了多少字节的空..
2022-04-06 08:45:00
1661
12
原创 【新星计划】怎么写好技术博客?
大家好,我是安然无虞。文章目录 每篇前言一、向优秀博主学习学习的方法二、内容框架1.总分总模式2.WWH模型三、标题1.标题要真实可信2.标题要营造冲突感3.巧用数字4.要能引发共鸣对于标题的反思四、遇见安然遇见你,不负代码不负卿。 每篇前言博客主页:安然无虞作者认证:2021年博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。火爆专栏:蓝桥杯基础算法剖析欢迎加入:比特社区种一棵树最...
2022-04-03 00:22:50
1485
14
原创 《每日一套题·提升你我能力》· 第五篇
大家好,我是安然无虞。文章目录 每篇前言一、选择填空题知识点补充1.题目一:考察性质2.题目二:考察性质3.题目三:考察性质方法1方法24.题目四:考察性质二、编程设计题面试题:反转链表解题思路1:翻指针方向解题思路2:头插法面试题:链表的中间节点解题思路面试题:回文链表解题思路三、遇见安然遇见你,不负代码不负卿。 每篇前言博客主页:安然无虞作者认证:2021年博客新星Top2咱的口号:🌹小比特,大梦想🌹作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳...
2022-04-02 09:45:00
3900
141
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人