自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 认识文件系统

首先我们大概来了解一下,在磁盘里面,我们可以把磁盘的存储逻辑抽象成一整块,而对于一整块的存储单元,由于管理难度较大,我们又可以把他进行分区,假设说一个扇区是800GB,那我们就可以把他分成200GB,200GB,100GB,300GB这样子,大概就是这样的分区管理。那然后,我们就可以在200GB里面进行分组,一个200GB的空间可以分成好多个组,一个基本的组假设我们可以设为10GB,而管理好这个10GB的组,那就能把其他的组管理好,进而就可以管理好200GB和更大的内存块空间。

2025-05-25 11:00:08 436

原创 项目篇:博客系统自动化测试

登录之后点击博客详情页,发现用户名与一开始登录时候的用户名不一致。

2025-04-08 16:30:31 758

原创 文件系统(1)

先补充一些小知识为什么会有0,1,2,以及0,1,2的作用是什么在我们写程序的时候,本质上都是在对数据进行处理(计算、存储),而0,1,2的出现,就涉及到一个问题,在处理数据的过程中人们要不要看到这个过程,所以就会有了0(标准输入),1(标准输出),2(标准错误)首先0的作用就是标准输入,我们可以把从scanf,get等代码中获取到的字符存放到一个缓冲区,这个地方就是0。那么1和2他究竟是什么?我们可以做一个实验。

2025-03-26 13:10:17 618

原创 项目篇:模拟实现高并发内存池(2)

首先我们要来大概的梳理一下我们的高并发内存池的整体框架设计在现代很多开发环境其实都是多核多线程,在申请内存的情况下,就必然会存在激烈的锁竞争问题。如果我们需要要实现内存池,必须要考虑以下几方面的问题。1.性能问题2.在多线程的环境下,锁竞争的问题3.内存碎片问题而整个内存池就由3个部分组成2.central cache:中心缓存是所有thread cache(线程)共享的,thread cache是按需从central cache中获取对象。

2025-03-21 23:09:46 853

原创 项目篇:模拟实现高并发内存池(1)

首先来介绍一下这个项目 , 当前项目的目的是模拟实现一个高并发的内存池 , 他的原型是谷歌开源的一个项目 "tcmalloc" , 即是线程缓存的malloc , 实现了高效的多线程内存管理 , 用于替代系统的内存分配相关的函数(malloc , free)我的目的就是把这个精华拿出来 , 模拟实现一个自己的高并发内存池 , 目的就是学习tcmalloc的精华.

2025-02-27 21:35:01 683

原创 重定向和缓冲区

文件描述符的分配规则:查自己的文件描述符表,分配最小的没有被使用的fd。

2025-02-25 14:45:18 831

原创 文件fd

a.操作文件的本质 , 比如打开文件 , 关闭文件 , 并不是代码在打开和关闭 , 他的本质就是进程对文件的操作b.总的来说 , 用户是没有权力直接向文件中写入数据的 , 因为OS并不相信任何人 , 他会给用户提供一套系统调用的方法来进行使用 , 达到简介写入文件的操作需求。

2025-02-18 19:47:40 923

原创 2025_1_22_进程替换

首先来补充个进程等待的方法。

2025-01-22 20:45:15 906

原创 2025_1_21_进程控制

进程 : 内核的相关管理数据结构(tesk_struct + mm_struct + 页表) + 代码和数据每个进程都有自己内核相关管理数据结构 , 虽然子进程和父进程的代码和数据是共享的 , 但是也和父进程相互之间不影响 , 由于他们每个进程都有自己的内核相关的数据结构 , 因此一个进程的崩溃不会影响另一个进程的进行, 所以 ,每个进程之间是具有相互独立性的。

2025-01-21 17:16:39 716

原创 2025_1_19_地址空间

对于进程的地址空间,首先我们来看一段代码和运行的现象运行现象我们可以看到,一开始子进程和父进程的g_val的值是一样的,而g_val的地址也是一样的,当我们对子进程的g_val值进行写入之后,我们发现,子进程的g_val值是300,而父进程的g_val值是100,这两个值已经不一样了,但是我们发现他们的地址居然还是一样的,这就有点让人匪夷所思了.在平常我们所学的C/C++中,我们理解的地址是不能同时存放两个变量的,这究竟是为什么嘞?

2025-01-20 11:32:06 248

原创 2025_1_18_优先级_命令行参数_环境变量

进程访问资源(GPU)始终都是有限的,在系统中的进程在大部分的情况下都是比较多的,如果不设置一个优先级来规定进程访问的优先情况,那么就可能会出现一定程度的问题.操作系统关于调度和优先级的原则:分时操作系统,保证了基本的公平,如果进程因为长时间不被调度的话,就会造成饥饿问题。

2025-01-19 14:16:16 581

原创 2025_1_12_Makefile_进度条

make的用法在我们需要使用编译的时候又不想重新写什么gcc什么的时候大显身手.比如这段代码是什么意思呢?这段代码的意思就是把main.c 和 Progressbar.c文件 编译成一个名为 ProGress 的可执行文件当生成了这个可执行文件之后,我们只需要./就可以直接执行了.而 $@ $^的意思则是:$@把依赖目标展开$^把依赖列表中的文件展开 全部给gcc 编译这为我们节省了大量的时间。

2025-01-12 21:40:25 187

原创 C++11(2)

对于右值的认识和划分,我们可以把右值分为纯右值(内置类型),将亡值(自定义类型),而对于左值和纯右值的构造,一般来说都是进行的拷贝构造.就拿这个来说如果传的是左值,和纯右值,那么直接揍上面的那个函数进行拷贝构造,如果传的是一个将亡值,那就走下面的移动构造函数.

2025-01-11 16:16:44 344

原创 C++11 (1)

列表初始化就是在对自定义类型或者内置类型进行初始化的时候,不适用"="号来赋值比如:这两种都是列表初始化的一种.而这种则是涉及到隐式类型转换的列表初始化.自定义类型的列表初始化都是由其自身的构造支持的内置类型则是其本身就支持,比如数组等内置类型.而容器如果想支持不固定的列表参数初始化,则会调用initializer_list来支持其进行不固定的初始化。

2024-12-22 20:56:27 200

原创 红黑树的概念与实现

要定义红黑树的子节点,首先还是要搞清楚他的一个节点里面需要什么,他的节点定义与AVL树大同小异,这边直接上代码.enum ColorBLACK,REDColor _col;,_kv(kv),_col(RED){}对于颜色的控制,我在这里使用了一个枚举类型,枚举了红色和黑色,当每创建一个节点的时候,我们把这个节点初始化成红色,也就是说,我们在插入新节点中,插入的新节点是红色的.

2024-10-27 09:40:27 1090

原创 2024_10_22_gcc_makefile

代码的翻译过程总共有四步1.预处理(主要有宏替换,去注释,头文件展开,2.编译(将c语言转换为汇编语言)3.汇编(汇编语言编译成为二进制目标文件)4.链接(形成可执行程序,一般在链接中,会把头文件等一系列方法跟程序链接起来)

2024-10-22 14:48:10 963

原创 AVL树的概念与实现

首先,跟之前的搜索树的是一大体上相同,定义一个节点,使用类模板来定义.int _bf;, _bf(0){}这里解释一下,这个_key就是插入的是一个pair的值,而pair是一个键值对,里面的键值就是K和V.初始化列表里面的_bf就是这个节点的平衡因子.当一个新节点生成的时候,这个时候的平衡因子就是0.

2024-10-20 16:05:03 902

原创 二叉搜索树

二叉搜索树是为二叉树的进阶版本,在此之前,如果用以前的二叉树来单纯存储数据,那还不如用链表来存储,但是,从某种意义上来说,顺序表和链表对数据的存储,数据之间的联系并不大,因为不管是有序还是无序,数据插入的条件都仅仅只是判空尾插.而二叉搜索树,他的插入条件比顺序表和链表的插入复杂,因此,二叉搜索树的数据之间的联系程度是比较高的.二叉搜索树又称为二叉排序树,他或是一颗空树,或是一颗具有一下性质的树:1.如果这棵树非空,那他左子树所有节点的键值均小于根节点的键值。

2024-10-15 11:25:35 656

原创 简述何为多态

多态是什么?首先我们从概念讲起,简单来讲,多态就是多种形态,当你要去完成同一件事情的时候,不同的人去完成这件事情会有不同的结果.比如在买票的时候,如果是成人去买票,则会买到成人票;如果是学生,则会买到学生票.

2024-10-09 19:41:59 962

原创 继承1 2024_9_18

当需要继承的时候,我们就在派生类的后面加上一个权限+父类,这个权限可以是公有,保护和私有,后面就是继承的父类.此时,下面的stu这个派生类,也就可以使用Person里面的方法了.

2024-09-18 17:21:31 376

原创 stack,queue的模拟实现,deque的模拟实现和小知识点的杂糅

由于之前更新了一期链表的模拟实现,其实链表,stack,和queue的模拟实现的方式都差不多.但这次,有一个新的玩法.那就是不用自己写,直接去用别人现成的接口就行.怎么得出这个结论 的?首先我们可以看到,stack和queue大同小异,而且很多的操作和vector有着非常多的相似之处.因此,我们可以尝试使用vector来实现stack和queue代码非常简短,就直接上代码了.在这里我的思路就是定义一个模板类,然后第一个传的是参数类型,第二个传的则是类,什么类?

2024-09-09 11:03:07 788

原创 链表的实现(C++版)

对于链表的学习,之前在C语言部分的时候就已经有学习过,也学会了使用C语言来打造一个链表.如今学了C++ 则想通过C++来打造一个链表,以达到锻炼自己的目的.

2024-07-31 15:23:09 2186 2

原创 vector 介绍

首先我们要大致弄明白vector是一个什么东西,其实vector就是之前我们学过的顺序表,这里直接使用就行了.定义vector-------->vector<typename> arr此时的这种定义vector可以理解成为一个数组,而typename可以是各种数据类型,比如string,int,double......等等此时的vector就是一个int类型的顺序表.

2024-07-13 19:53:38 927 1

原创 string的模拟实现

因为strlen是碰到'\0'就会停下遍历,进行返回,

2024-05-14 13:46:40 1026

原创 有关string的部分接口

迭代器是可以用来访问string里面的内容的,这里来记录一下使用的方法。里面用到了一个叫做begin函数和一个end函数,这两个都是针对string使用的函数。s1.begin()函数是指向string内容的第一个元素而s1.end()指向的则是最后一个元素的下一位上面就是迭代器了,那什么是反向迭代器?顾名思义,反向迭代器就是反方向来进行访问和迭代的方向与迭代器是相反的。分别有rbegin()和rend()。

2024-05-07 09:05:03 735

原创 Linux的有关权限的学习

在Linux中,一切皆文件,而每个文件都会有其相对应的操作权限。那么,我们该怎么来认识他们呢?首先我们可以看到,在每个test文件的前面都会有一个-rw-r--r--这个字符,而这个字符,就是表示这文件的权限。那他是怎么表示的呢?从第一个-(这个-代表普通文件)算起,他后面的9个字符可以按三三分开,分别是r w -r - -r - -。他们代表着什么意思呢?r:表示"可读"w:表示"可写"x:表示"可执行"可是这上面也没有"x"这个字符的出现呀。这就得继续研究下去了。

2024-05-03 22:58:48 687 1

原创 日期类的模拟实现

有关类的定义,首先是需要声明共有类和私有类的成员函数和成员变量。这里我分了三个文件写,分别有Date.h,Date.cpp,test.cppclass Dateprivate:int _year;int _month;int _day;public:在代码中,声明了一个Date的构造函数,但是我把Date的定义放到了Date.cpp里面,也就是说,这里的声明和定义分离了。为什么要这样搞?这是由于如果不进行声明与定义的分离的话,当。

2024-05-02 22:23:12 715 1

原创 有关构造函数和拷贝构造函数等细节的梳理

构造函数在类中的作用就是承担了一个初始化的作用,相对应的,他会有一个析构函数,析构函数的作用就是对各种程序结束时候的一个收尾处理,比如空间栈的回收,释放节点等等。但他们这两个函数在程序中都是会自动调用的,即使是我们不写,他们也会自动生成一个默认的构造函数来对自定义类型进行初始化。这里来说一下什么是自定义类型,与自定义类型相对的还有一种是内置类型,通俗来说,内置类型就是编译器的亲儿子,比如 int,double,等等都是内置类型。而我们自己定义的一个类,比如class Date{},就是自定义类型。

2024-04-24 18:35:48 769

原创 在内存中各个区域的数据存储

全局变量的生命周期从程序开始到程序结束,静态局部变量则是从他们被定义开始到程序结束。动态分配内存的区域。比如使用malloc,calloc。存储局部变量,函数参数,返回地址,形参变量。储局部变量和静态局部变量。

2024-04-16 16:08:00 193 3

原创 部分C++概念和关键字,类和对象

在之前写一些数据结构的时候,我们总会开三个文件,.h,.c,和.c。.h是包含头文件和函数的声明,一个.c文件是来写函数的实现过程的,最后一个.c文件是用来测试的。那为什么要这样干,我以前都没有进行过一个深入的思考。上面的代码我们可以看到,并不能正常的运行,并且编译器报出了一个链接错误,而且说我们有一个重定义的符号,这是为什么?首先我们来看一下他们生成可执行文件的一个过程。

2024-04-16 09:20:42 621 1

原创 两种快排类型

霍尔是快排算法的创始人,也就是最原始的快排。这个快排的总体思想则是首先定义一个key值,以这个值为基准,然后把待排序的数组分成左右两个区间。定义一个指针begin指向数组的左边,然后定义一个指针end指向数组的右边,如果要排升序,则begin寻找的是比key指向的元素大的值,而end则寻找的是比key指向的元素小的值,简称左边找小,右边找大。当找到小和大的时候,就会跳出循环,这两个值将进行交换。

2024-04-04 22:27:02 989 1

原创 简述排序归类

希尔排序的思想则是首先对数组进行预排序,而预排序的目的则是首先让数组变成一个即将有序的状态,然后再通过插入排序,把他们排序好。但是从另一个角度来说,希尔排序又像是一种不断通过调整数组元素之间来比较的间隔,然后通过缩小间隔的一种插入排序。也就是说,一开始首先设定间距gap为3,然后通过比较数组下标n+gap的元素来进行交换这样走完一趟就刚好把数组中较为小的放到了前面,较大的放到了后面,而此时的gap为3,要想进一步进行排序,那就得缩小gap,直到间距为1,则数组刚好完成排序。

2024-03-31 16:14:28 1009 3

原创 实现小堆.

在认识堆之前,我们首先得认识一个叫做"二叉树"的概念。二叉树是数据结构的一种,他是由父节点和子节点组成。二叉树又分为完全二叉树和不完全二叉树。何为完全二叉树?完全二叉树就是从上往下,从左往右的节点排序,不能出现一个空的地方,就像这样而非完全二叉树,则长这样而这种则称为满二叉树。

2024-01-17 17:50:47 1017 3

原创 简单实现栈

与顺序表一样,栈的定义是首先用数组来组成,因此结构体里会有一个数组的首元素,空间和栈顶。int top;}ST;

2024-01-15 18:37:22 417 1

原创 关于Linux的部分基本指令

如果是搭配..来使用(cd ..),则是退回到上一个路径如果是cd .则是显示当前路径mkdir:在当前路径创建一个"文件夹"这里无法创建成功的原因是已经原本有了一个名为"111"的文件夹。

2024-01-13 21:36:55 948 1

原创 简单手撕双向循环带头链表

双向带头循环链表是数据结构里众多链表中的一种,这种类型的链表是一种非常常用的链表。他的整体结构是首先在最开始是有一个哨兵位来当作一个头节点,这个头节点是不需要存放数据的(当然想存放数据也是可以的)。在我们使用这种类型的链表的时候,由于有这个哨兵位头节点的存在,因此我们就不需要来考虑链表是否为空的问题,在使用的过程中更加方便;其次,对于这种链表,他每一个节点都是有一个前驱指针和后继指针,这里我就把前驱指针叫做prve,后继指针叫做next。

2023-12-03 22:05:00 876 4

原创 关于链表中传二级指针的深入探讨

如果if指向空,那么就将*phead指针指向新开的节点node,在下面的输出中,由于->的优先级比*大,因此要先把前面的括起来,进行解引用后取结构体里面的值。此时此刻,&sl代表的就不是结构体的地址了,而是代表指向结构体指针的地址,因此在PushBack那里,如果想改变*sl,就要使用**二级指针来接收*sl。由于要传一级指针,因此在主函数中的SL sl只能是定义成一个结构体,并不能定义成一个结构体指针,然后在往PushBack里传一个地址,然后在实现PushBack的那边使用一级指针来接收。

2023-11-20 00:56:04 101 3

原创 简单实现单链表

在实现这个方法之前,我们首先来探讨一下,这个"指定位置"指的是什么意思,是一个节点?还是第几个节点?如果是前者,那么就是一个结构体指针变量;如果是后者,则是一个整型变量。实际上,上面的两种说法都可以是"指定位置"。但为了程序的效率以及可读性,在这里,就使用前者这个概念。如果采用了前者这个方案,那么首先就要在链表中找到这个节点,就需要定义一个专门来寻找这个节点的函数,其返回值就是结构体指针,也就是返回一个节点。那怎么实现呢?首先我们可以把想要查找的值给传进去,注意,是值,而不是节点。

2023-11-10 22:17:23 127 8

原创 消失的数字和轮转数组

关于这个思想,说实话,我觉得也是挺复杂的。这就有点像我之前写过的单身狗2,这道题的要求就是在一个数组里面找出只出现过一次的数字,大概的思路也是用0跟数组里面的数字进行异或运算的操作,相同的数字就会消失,最后只剩下两个数字,再用位运算的方法把这两个数字分别输出。异或的操作运算是碰到相同的数字就为0。于是我总结了一个规律,在用x = 0与数组的内容进行异或操作的时候,可以把x理解为一个袋子,把数组里面的数字一个一个地往袋子里面装,如果袋子里面装了两个相同的数字,则这两个数字就会被"湮灭"掉,消失不见。

2023-11-06 13:00:11 96 1

原创 简单实现顺序表

首先,我们先来了解一下顺序表的概念。顺序表是数据结构中的一种,他的底层逻辑非常简单,就是数组,是基于数组来存储东西的。他主要的功能可以分为,头插,尾插,头删,尾删,任意插入数据,任意删除数据等等,当然还有一个最基本的功能,就是打印数据啦~。顺序表可以用来当作通讯录,一些信息管理系统等等的底层代码。在我们将要实现这些东西的时候,我们就可以直接来调用这个顺序表。

2023-10-24 22:06:32 175 13

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除