- 博客(61)
- 收藏
- 关注
原创 文件系统1
磁盘分区里面的一个块组。删文件只要把位图部分置0 。数据部分不用清空,写下一个文件的时候新文件内容会自动覆盖。磁盘(Disk) → 分区(Partition) → 文件系统 → 块组(Block Group,就是你图里这一块) → 块(Block)就是物理硬盘(SSD、机械盘),是整块硬件。把磁盘划分出来的一段连续空间,是磁盘上的隔离区域。当你把一个分区格式化为 ext2/ext3/ext4,文件系统会自动把这个分区再切分成很多大小相同的块组。 你截图画的,就是其中一个块组的内部布局: Super Bloc
2026-11-06 15:15:08
217
原创 在线负载均衡OJ 2
JSON用于网络请求中把结构化数据转化成一个字符串。✅❌ 但,JSON 是一种。上面这一整段,是。它里面"张三"才是 JSON 里的18是 JSON 里的数字。in_json举个通俗例子: JSON 相当于 “表格这种格式”;std::string 相当于一张纸,纸上抄写了这个表格。纸(string)承载表格(JSON),但纸不等于表格。
2026-11-04 21:22:14
146
原创 项目:负载均衡式OJ
拿这个数的值 =高字节:权重大的字节→0x12(乘 2^24)次高:0x34次低:0x56低字节:权重最小的字节→0x78(只乘 2^0)高低字节是【数字本身的属性】,看它在数值里的权重,跟放哪个内存地址没关系!就像十进制 1234:千位 1、百位 2、十位 3、个位 4;个位就是 “低位”,天生的。1234:低数字是 4,高数字是 1,不是看写在左边右边。0x1000 ← 低地址(编号小)0x10010x10020x1003 ← 高地址(编号大)地址编号越小 = 低地址;
2026-11-03 17:41:21
251
原创 【无标题】
如果是动态链接程序:内核会启动动态链接器ld‑linux.so,把需要的.so共享库也映射进进程虚拟地址空间,做运行时重定位,补齐函数真实地址。以 C 语言举例(gcc),把 .c 源代码直到内存中跑起来完整拆解,分四大阶段:预处理、编译、汇编、链接,最后才是程序加载运行。在 main.o 里面,知道“这里要调用printf”,但并不知道printf内存地址是多少,留了空位,标记为待重定位。• 比如你写printf(),在main.o只有引用,链接器去libc库找到printf函数定义。
2026-11-03 14:14:25
117
原创 【无标题】
感受:到处跨层调用、循环依赖、一个函数上千行、业务逻辑和数据库杂在一起。明白坏架构带来的痛苦,才知道好架构解决什么问题。◦ 后端推荐:Gin/Node后端模板、gokit;◦ 不要一开始啃超大型项目(比如Redis内核),先看几千行的中型项目。◦ 如果我要加一个新功能,我该改哪几块?会不会牵一发动全身?◦ 哪些是公共能力(工具、日志、配置),哪些是业务?◦ 模块之间怎么通信?2. 回答这5个问题(每次读项目都自问)◦ 分成了哪些包/目录?3. 反例学习:专门观察烂代码/烂项目。请求/数据流怎么走?
2026-10-31 10:54:16
165
原创 讲讲怎么用github
fork:把这个仓库复制一份进你的仓库,你可以在它的基础上开发。而且如果你在这个基础上开发出了新功能,或者改了bug,就可以点击PR把你的改动发送给项目负责人,他如果认可你的改动,你的改动就会被他们融合到项目里面。但是如果运行过了,去设置里面删,删完以后再去c盘ProgramFiles里面看看有没有同名文件夹,也要删掉,这个就是卸载残留。star越高热度越高。点击之后跳转到新的页面,找到中间的trending项,点击。
2026-10-18 15:11:42
253
1
原创 关于VSCode上gcc,gdb的安装配置问题
今天在vscode上写代码,运行了一个c代码直接提示我没有gcc这个命令。一直用VS的我从来都没有遇到过这个问题啊!!!不过完全没有问题,遇事不决首选cc,秉持着这个原则,我也是毫不犹豫的把问题扔给了AI,果不其然它5分钟不到就搞定了。这个时候该死的好奇心突然间我尽然萌生了一个想看看AI怎么安装的理解一下原理的可怕念头,果不其然一个下午就这样浪费掉了呜呜呜呜呜呜~~反正已经浪费了这么长的时间了,就把今天我所能理解的部分记录下来,大家就看个乐呵就行了,最后再说一句,cc牛逼!!!!
2026-10-17 23:34:59
215
原创 网络基础
怎么样算是同一个局域网内(2点)传输数据的完整流程数据链路->网络->传输->应用设发送方为A,接收方为B。数据从A这边发送,由于操作系统已经把顺序写死了,所以数据就很自然的从应用层一层一层的加报头,经由 应用层->传输层->网络层->数据链路层。传到路由器上面。路由器将接收到的数据进行还原,变成数据链路层的东西。然后由于经由路由转发,Mac地址会改变的问题,所以把数据链路层旧的头部换掉,换成适配接下来局域网的头部,再转成数据流,从对应的端口发送出去。
2026-10-12 22:06:54
386
原创 写Qt项目的收货(C++方面)
在写函数的定义时,一定要定义类域,(包了头文件也不行)不然编译器会以为这是一个全新的函数。声明时不需要带类域,只要函数的名字。
2025-09-23 10:33:16
148
原创 力扣复盘 之“移动零”
1、重写数组:取两个指针,其中一个遍历数组,找非0的元素,找到一个非0元素,计数器就++,同时把以计数器为下标的那个元素赋值成遍历到的那个非零元素。数组遍历完以后,非0元素的个数也统计出来了,剩下的就是0了。2.数组分区域处理:定义两个分界线指针。另一个(cur)作为已排列部分0和非0的分界。cur每遍历一个元素,进一次判断,决定放前面还是后面。cur遍历到最后一个元素结束。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。,编写一个函数将所有。
2025-09-16 13:37:13
194
原创 进程间通信
1、通信原理:两进程指向同一块文件描述符表,两进程得到的权限不同,当一个进程修改内容时,另一个进程能实时得到内容的更新。从而实现进程间通信。父进程先创建出管道,创建子进程时子进程继承管道,从而两进程指向同一块内存。两进程开放不同的权限,从而实现通信。3、进程池:父进程创建多个进程,通过管道进行连接,父进程通过不同的任务码,唤醒子进程,并控制子进程完成任务。进程通信的条件是两进程指向同一块内存资源。
2025-08-21 19:58:17
129
原创 动静态库
6、CPU里会有一个区域,该区域先存放程序的入口地址(虚拟地址),通过页表对照,找到物理地址,然后程序开始运行。静态链接就是多个文件使用就拷贝多次,加载到内存时会有大量重复代码,故静态链接出的文件体积会比动态链接的大很多。静态库是把文件直接拷贝到可执行程序里面,运行程序时就不需要再连接库。7、ELF是一种文件格式,库,.o文件,可执行文件都是这个格式。5、磁盘上的ELF文件编译完成后,不同区域的地址就已经是虚拟地址了。8、动态库就是把内存里共同的部分放到一起,所以动态库被多个进程共享。
2025-08-13 22:34:24
220
原创 文件相关
被打开的文件会被分配给一个进程,该文件的基础信息会被写到进程里面,操作系统通过管理进程,从而达到管理文件的目的。3、往文件里面写的内容会先放到文件内核缓冲区里面,再通过一些接口写到磁盘里面。缓冲区把要处理的文件集中打包,减少系统调用的次数,提高效率。没被打开的进程则储存在磁盘上。1、缓冲区存在的意义。
2025-08-11 15:56:34
146
原创 进程相关话题
即A进程先处理一部分,让后把当前结果和上下文以切片的方式保存到操作系统里(在里面建立一个结构体保存),再换上下一个进程。当输入一个命令时,父进程bash会先拿到,该命令会在bash里的命令行参数表里找,看自己要执行的是哪个分支;当操作系统检测到内存不足时,闲置的进程的代码和数据全部换入到磁盘里,进保留进程的PCB。环境变量一开始是写在配置文件里面,bash进程开始时在自己里面创建了环境变量表,把配置文件里的相关内容写进去,环境变量都是从父进程里面继承下来的。2、进程的代码数据怎么和PCB关联起来?
2025-08-06 16:50:04
219
原创 Linux(3)
这里就是用了绝对路径,所以压缩包里面除了目标文件,还带了一个路径。如果不想要这个路径,压缩时 -j 就行。2、压缩整个目录下面的所有文件: zip -r 压缩包名.zip 要压缩的目标文件(进入它的上一层)。1、压缩单个文件:zip 压缩包名.zip 要压缩的文件(每个文件之间用空格隔开)像这里打包的时候没有 -r ,就只打包了test目录,目录里的内容就没有进去。
2025-06-22 22:08:42
249
原创 Linux (2)
第一次没移成就是因为当前我在目录Linux里面,这里面只有别的子目录,没有file这个文件(虽然在子目录test里面,但是也不算)所以要移动的时候就要写清楚两个文件各自的路径。像我这里本来是想给file改名的,因为没有进到 file它对应的目录里面, 所以它理解成了在家目录里面新建一个文件,再把file的内容剪切进里面.....目录一定要把详细的路径写清楚,不能只出现一个目录名(除非目标路径是在该目录下的子目录)mv 文件名 目录的详细路径 (把文件剪切到后面的文件夹里面)
2025-06-20 21:52:09
238
原创 Linux基础
这里 -l -a 就是参数。命令 参数 路径 三者之间一定要用空格分开,同时不同的参数之间也要用空格分开。这个指令里面 cd就是命令,/usr/local/bin就是路径。如果文件不是在当前目录里,用 .. 回退到上级目录,直到目录里有该文件了再重复前面步骤。定位一个文件,可以用绝对路径(从根目录开始)也可以用绝对路径。:从当前目录的子目录开始一直到文件名结束,不可以直接写文件名。像 cd /usr/local/bin。目录:rm -r 目录名/二、绝对路径和相对路径。
2025-06-19 22:38:41
181
原创 leetcode复盘(1)
2、if (hash.find(要查找的值)!一般定义变量要定义在全局,也就是在函数刚刚开始就定义。if,while这种花括号里面就算一个局部作用域,在局部定义变量出了花括号定义的变量就会失效。find()在找不到结果的时候会返回end(),找到了就返回目标数据的地址。比如要创建一个字符,整型的组合:unordered_map<string,int> hash;hash[定义左边类型变量]=定义右边类型变量。:hash[目标对象]++/hash[目标对象]=修改值;
2025-06-15 21:45:29
308
原创 C++入门知识(1)
可以解决程序里面定义重名变量的问题namespace是一个命名空间。定义变量可以在4个域下面定义,全局域,局部域,命名空间域,类域。各个域之间是相互不影响的。命名空间里面的变量可以和外面的变量重名。
2024-09-11 13:08:20
429
原创 图论(2)
度统计的是一个节点上又多少条边度=出度+入度出度:统计以该节点为起始点箭头指向外面的边的条数入度:统计箭头指向该节点的边数度为1的节点为悬挂节点,边为悬挂边用矩阵计算节点的度。
2024-09-03 22:31:52
682
原创 快排找基准值之挖坑法
把数组里第一个数据拿出来记为标准值,然后两边交替,从右往左找比基准值小的数据放到前面缺数据的坑里。放完后该位置也缺数据成为了新的坑,再把坑的下标移到新的位置。等到遍历到左右下标左>=右了就结束,最后数组里空下来的位置就放标准值。这样操作下来,比基准值小的数据全到左边,大的数据全到右边。从左到右找比基准值大的数据,后面同理。
2024-08-28 22:26:55
631
原创 快排里面找基准值的算法
比如上面这个情况left原来在7的位置,right在3的位置,走完之后都在9的位置,要是9和基准值换了之后就不符合排序的要求了。所以相等的时候继续进去,再走一轮right的位置就是基准值的位置了。当right走到超过left的时候,right里存着比基准值要小的数据,让right和基准值里面的数据交换位置,这个时候基准值左边都是小的数据,右边都是大的数据。:交换的时候要判断一下当前的right有没有走的超过right,因为有可能刚进循环的时候right没越界,但是循环完一次之后就越界了。
2024-08-26 16:06:03
954
原创 直接选择排序
然后再找剩下的数据里面最大和最小的数据放到由剩下数据组成的开头和结尾,以此类推,直到找完。在最后一步我找到最大,最小值的位置之后,把最小值和begin位置的值进行交换------变成1 3 9。这个时候maxi和mini的位置没变,但是里面的值变了--------a【maxi】里面的值变成最小值1了。3、把mini标记的数据放到开头begin的位置,maxi标记的数据放到end的位置。2、遍历数组,找到数组里面的最大值和最小值,用maxi和mini标记下它们的位置。:当遇到下面这种特殊情况时。
2024-08-23 16:58:49
287
原创 希尔排序
希尔排序是将庞大的数据进行分组,通过定义一个gap值,将数组里面间隔为这个gap值的元素分在一个小组里面,把每个小组通过插入排序的方式分别排成有序。遍历完数组后再取新的gap值重新划分小组遍历数组,(预排序)直到最后这个gap值变成1就直接用插入排序。通过预排序可以将小数据放在前面,大数据放在后面,这样减少了最后插入排序的次数。在一组组排成有序的这个过程中,原来无序的数据会渐渐地变成有序。因为直接插入排序处理的数据越无序,它的时间复杂度就越高。这个过程比直接插入排序的效率更高。
2024-08-21 22:05:27
595
原创 直接插入排序
比如这里前面3个数已经通过排序排成了升序,现在要把6插到前面的有序数组里,于是我们比较6和有序数组里最后的一个元素(end)--也就是9的大小。不满足顺序,交换,再把end标志前移,继续比较,直到满足顺序,停止循环。针对一组乱序的数据,先在最开始两两进行比较,形成一个有序的数列,再把后面的数据和前面数组里有序的数据两两进行比较,插入到前面有序数列合适的部分。
2024-08-21 11:00:49
189
原创 链式结构二叉树的应用
将一棵二叉树分成根节点和它的左右子树,其左右子树又可以分成根节点和左右子树,运用函数递归的方式统计根节点的数量,将根节点的数量相加。比如这颗二叉树,1是根节点,size++,再算1的左子树和右子树的根节点,每颗子树又分成根节点和它的子树。这就是递归。只要根节点不为0,size就++,最后返回size的值。函数递归的时候下层函数运行结束后,下层函数栈就会销毁。下面不管怎么递归,下层函数size的值是没办法影响上层函数的。
2024-08-19 22:53:14
360
原创 二叉树的链式结构
常见的三种链式结构链式结构是通过链表的形式,将各个节点连接起来。每个节点里储存着三个值:储存的数据、左孩子节点的地址、右孩子节点的地址。所有的二叉树都可以用链式结构进行表示。而顺序结构只能表示完全二叉树由于其子树的结构和父母相同,所以可以通过函数递归的方式来创建链式结构常见的三种链式结构1、根左右先打印根节点的数据,再打印它的左子树,最后打印右子树。这是一棵子树的表示方法。每个节点的左右子树都按照这个方法表示,直到节点的左右节点都为NULL,停止递归。
2024-08-18 12:41:53
185
原创 数据结构之---堆(2)
出堆是指将堆顶数据出堆。出堆完成后要保证剩余数据还是满足原来堆的性质。所以我们把堆顶数据和堆底最后一个数据交换,取出新堆底数据,之后通过向下调整算法将剩下的数据重新排列成一个堆。大堆经过出堆操作得出的数据是升序的小堆经过出堆操作得出的数据是降序的。
2024-08-15 23:11:27
722
原创 传值和传地址
传值是把实参里的数据复制了一份放到形参里,但是实参地址和形参是不一样的,所以改变形参是无法改变实参的。传值的话就只改变了形参sl,实参s还是没有改变,这里因为s没有初始化,所以传不了数据会报错。比如这里我定义了一个结构体,想要改结构体里面的数据,这时候就要传地址。传地址时实参和形参是同一个地址,所以改变形参可以改变实参。
2024-08-15 11:39:09
292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅