- 博客(54)
- 收藏
- 关注
原创 【C++高并发内存池】 2.ThreadCache设计
前面一个设计了一个定长内存池,经过与传统的内存申请方式对比,初步实现了一个可承受频繁申请与释放的高性能的内存池,这是我们首先要看到的一个内存池被设计出来实现的可观效果。从这里开始,我们将一步步的对高并发内存池进行由浅入深的设计,本节我们来设计ThreadCache。threadcache:线程缓存是每个线程独有的,⽤于小于256KB的内存的分配,线程从这里申请内存 不需要加锁,每个线程独享⼀个cache,这也就是这个并发线程池高效的地方。
2026-11-01 21:54:58
159
原创 【C++高并发内存池】 1.定长内存池的实现
本项目为C++仿TCmalloc高并发内存池的实现,目前完成了定长内存池的按页资源申请,在单线程进程下实现了高频率申请资源的高效性与稳定性,并制定了资源回收复用机制
2026-10-26 10:27:11
186
原创 【Linux】进程控制(四)—— 手搓自主shell
至此,一个简易的shell被我们手搓出来了,独立完成其实非常考验知识储备和代码能力,可作为一个教学意义极高的训练典例,其实除了命令行参数表以外,shell内部还管理了另一张表就是环境变量表,它也承担着非常重要的角色,我将手搓的源码放在下面供大家自行在此基础拓展//shell内部维护的第一张表:命令行参数表//我们shell所处的工作路径//上一个进程结束的退出码return cwd;//用户名@主机名 当前路径return 0;
2026-06-23 15:29:08
406
2
原创 【Linux】进程控制(三)——进程程序替换
进程程序替换(exec系列)是Linux中“让一个进程跑新程序”的核心操作——它不用新建进程,而是直接把当前进程的代码/数据换成新程序,同时保留PID等核心属性。让我们来逐步学习~
2026-06-19 00:32:21
193
4
原创 【Java】使用Thead子类创建线程VS使用Thead直接创建进程(Runnable)的区别
今天来了解一下使用Thead子类创建线程VS使用Thead直接创建进程(Runnable接口)的区别。
2026-06-11 15:19:03
239
1
原创 【Java】形式化方法
形式化方法,简单说就是:用严格的数学与逻辑来精确描述、建模、分析并证明一个系统(软件/硬件)是正确的,而不是只靠测试猜它“好像没问题”。
2026-06-11 15:04:32
207
原创 【Linux】进程控制(二)——进程等待 全方位详解
WIFEXITED(status):判断子进程是否正常退出WEXITSTATUS(status):获取子进程的退出码,其实就是的宏定义WIFSIGNALED(status):判断子进程是否被未捕获的信号终止WTERMSIG(status):提取终止子进程的信号码,其实就是的宏定义。
2026-06-09 06:47:13
578
6
原创 二分算法练习
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)public:if(n == 0)= target)
2026-05-31 23:03:18
230
2
原创 【Linux】初步构建框架—虚拟地址空间(三)—进程与内存管理的解耦优势、深入理解vm_area_struct
本篇文章更加偏向于理论上的更深层次理解,深度理解虚拟地址空间的作用,并引出结构体vm_area_struct,理解它对于虚拟地址空间构建的作用,以及验证命令行环境变量的地址高度。
2026-05-28 20:14:03
426
3
原创 【Linux】初步构建框架—虚拟地址空间(二)—mm_struct结构体揭秘与页表标志位
书接上回,我们已经对虚拟地址空间、页表以及“懒加载”机制和COW机制有了一定的认识,本篇文章我们将再次深化理解,并对相关内容进行拓展
2026-05-26 23:28:50
388
2
原创 【Linux】初步构建框架—虚拟地址空间(一)—“懒加载”机制与COW机制的梦幻联动底层逻辑
Linux进程的高效运行,离不开虚拟地址空间、页表、懒加载与COW机制的精妙配合,大家肯定对这些名词相当陌生,但是没关系,今天我们一起一步步拆解这些底层逻辑。
2026-05-26 19:11:28
1787
3
原创 【Linux】命令行参数详解
本期详解main函数参数的”真面目“以及这些参数发挥的重要作用是什么,它们与Linux下命令选项功能的实现又有上面密切关系?
2026-05-14 02:12:40
366
7
原创 【Linux】Linux2.6 O(1)调度器超详解 | 进程切换+内核链表 | 面试必背
至此,Linux的整个O(1)的调度算法我们讲解到这里形成了一个逻辑闭环,我们对进程调度塑造了崭新的认识!相信大家此时脑海中对Linux的进程调度已经是可以形成一个动态的过程了!
2026-05-11 00:42:13
461
6
原创 【linux】进程优先级
进程优先级的变化范围只有40个梯度,是有限的,它强制我们更改优先级就不能改的太狠了,我们生活中遇到的操作系统基本上是属于分时操作系统,即多个进程轮流占用资源,实现并发的操作系统,有限的优先级变化范围,这样的调度策略,给进程分配时间片,相对公平公正,能够较为均衡地让不同的进程都能在一段时间内,能够得到CPU资源,同时满足人与互联网的需求。1.进程优先级是CPU资源分配的先后顺序,就是指进程的优先权,与权限不同的是,相比于权限的能不能,这些进程已经确定能够得到CPU的资源分配了,只不过是先后的问题罢了。
2026-05-05 16:05:48
483
7
原创 【linux】僵尸进程与孤儿进程
僵尸进程的状态被称为僵死状态,这是一个比较特殊的状态。当子进程结束但是父进程没有接收到子进程退出的返回代码时,子进程就会处于僵死状态。僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码,因此,只要子进程退出,父进程还在运行,但父进程没有读取子进程退出状态代码,子进程就会进入僵死(Z)状态。
2026-04-28 21:36:52
474
3
原创 【Linux】进程状态
创建一个进程之后,一般直接就是就绪状态,在调度队列中等待运行,特殊情况比如内存严重不足,会将就绪状态的进程换出到磁盘swap分区,此时称为就绪挂起状态,进入CPU正在运行的进程状态叫做运行状态,每一个进程在CPU中执行都有时间限制,我们把这个叫做时间片,时间片结束后,进程从运行状态重新回到调度队列中变成就绪状态。
2026-03-09 23:19:10
570
4
原创 【Linux】进程——初识fork机制
还是一样的道理,子进程被创建出来后,跟父进程共享同一段代码,id变量同样也会共享,但是它们是两个不同的进程,而一旦有一个进程的变量被修改了被赋值了,就会立即触发写时复制,两边内存彻底分开,相当于此时父子进程都有独立的id变量,一个是0,一个是子进程PID,两个变量,名字一样,地址看起来也一样,物理内存却完全不同。书接上回,我们最后讲到了每一个进程的PID是随着每次重新启动而增大的,当时我们是使用了系统调用接口getpid()得到的,而在Linux当中,新进程往往是通过父进程的方式创建出来的。
2026-02-24 01:07:10
637
1
原创 【Linux】初步理解进程
那就没意义了,其实CPU当中存在一套寄存器,同一时刻,寄存器只装当前正在跑的进程,该进程结束后,要对进程数据的上下文进行保存到PCB当中,然后再执行下一个进程,再保存下一个进程的上下文数据,周而复始,再次执行到相同的进程后,根据其保存的数据锁定上一次运行到的位置,继续执行,再更新数据,CPU内的寄存器硬件,可以在不同时间段,保存不同进程的数据,每一个进程的PCB的内容都是私有的,因此会有很多PCB来同时存储多个进程的数据。没有PCB,操作系统就看不见这个进程,因此有多少个进程,内核就有多少个PCB。
2026-02-23 00:19:45
1024
1
原创 【Linux】实用调试工具—gdb/cgdb的使用
到目前为止,我们已经了解了vim、gcc/g++、make/Makefile、git,已经可以在linux上写代码并编译运行以及提交代码了,但是如果我们在vs下写代码,是不是还需要调试代码,那么在vs下我们该如何对写好的代码进行调试呢?那就是我们接下来要学的调试器—gdb/cgdb。目录一、安装gdb/cgdb二、编写code.c文件和Makefile自动化构建三、debug/release 相关知识四、gdb和cgdb的视觉调试区别五、gbd/cgbd调试语法list(可简写成l)1.list+数字n2.
2026-01-26 01:17:08
802
6
原创 【Linux】自动化构建—make/Makefile
1.首先一个工程的源文件不计其数,其按类型、功能、模块被分类到若干个目录中,makefile能够定义一系列规则来指定哪些文件需要先编译、哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。2.其次makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make指令,整个工程完全自动编译,极大的提高了软件开发的效率。
2026-01-20 21:26:03
800
7
原创 C++中auto的那些“雷区”,仿函数里藏着的类型陷阱
相信大家在写C++排序时经常会使用算法库中sort,但是实际应用中我们很少只对数字进行排序,更多的是对一个封装了多种变量的结构体进行排序,那么此时我们就得要自己定义排序规则,以达到我们的排序目的,于是sort的第三个参数就对我们有了重大意义,可以将我们写好的仿函数放到第三个参数中,达到正确的排序目的,接下来,我会一一讲解我在写仿函数代码时所遇到的问题。这是语法所不允许的,尤其是仿函数,它是用于STL库或者算法库的参数的,需要明确参数类型才可以编译,auto本质上并不是明确的参数类型,因此会出现编译报错。
2025-12-29 21:26:45
347
4
原创 算法二:滑动窗口
上篇文章详细讲解了双指针各种场景的运用,相信大家对双指针都有了一定的了解,本篇文章我们再来了解另一种特殊场景的双指针,该场景为左右指针共同维护一段连续的区间,通过特定情况改变左右边界使该区间不断变化,最终得到我们想要的结果,我们把这个方法称为——滑动窗口。同样的,我们将通过八道题来对该算法进行场景详解。
2025-12-09 21:50:05
854
6
原创 C++11——Lambda表达式的用法
算法思路:先用unordered_map把每个数字出现的次数记录下来,然后利用迭代器初始化把无序图的数据初始化给vector,再调用算法库里的sort对vector进行排序,但是由于图的映射关系,第一个数对应的是元素,第二个才是对应出现的次数,因此如果不自己指定排序规则,则最后排序是按照第一个数进行排序的,得不到我们想要的结果,如果没学过lambda表达式,我们一般会想到用仿函数来做模板第三个参数,但此时我们直接用Lambda表达式即可简化代码,最后排序好了之后利用for循环打印出前k个元素即可。
2025-11-01 21:37:21
967
6
原创 详解STL中stack_queue为什么选择deque作为默认容器
vector的元素在内存中是完全连续的,而deque是由多个分散的“内存块”组成,这会造成哪些劣势呢,首先vector的随机访问是真正的O(1),直接通过首地址+偏移量计算,deque虽然也支持随机访问,但是底层实现上需要先计算元素在哪个内存块,再找块内的偏移量,实际效率略低(尤其是数据量巨大时),且vector的CPU缓存命中率更高(连续内存适合CPU预读),遍历速度通常比deque快。,这是优于vector的点,而list还得申请结点(带两个指针的额外内存),内存碎片多,开销更大,而。
2025-09-29 23:28:07
1266
13
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅