自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CS144 - LAB2

然后我们可以开始着手去编写 send 方法,因为我觉得先写 send 的话,更有助于我们去写 receive,而且 send 的判断逻辑更简单,我们首先需要判断是否已经初始化,如果已经初始化了,我们由于最开始发送方会先发送 synchronize 同步信号,所以我们还需要给当前的序列号加上一位 offset,对于关闭的连接,我们还需要加一位 fin 的信号。比起 lab1 一堆没说清楚的规则,lab2 就友好了很多,我们只需要去判断一些字段,然后调用我们在 lab1 里面实现的类方法就行了。

2025-06-04 12:05:20 379

原创 CS144 - Lecture 3

本文对比了电路交换与分组交换两种网络通信方式。电路交换通过建立专用线路确保通信质量,但存在资源利用率低的问题。分组交换采用路由器转发数据,提高了链路利用率,延迟主要受传播延迟、分组处理延迟和排队延迟影响。文章以视频缓冲为例说明分组交换的应用,并分析了缓冲队列设计对性能的影响,提出了避免头部阻塞的解决方案。最后讨论了分组交换实现速率保证的技术难题,指出仅依靠现有技术难以完全确保端到端传输速率。

2025-06-04 12:04:33 903

原创 CS144 - Lecture 2

这里就简单讲了一下它的基本性质,没啥好说的。

2025-06-01 16:14:58 381

原创 CS144 - LAB1

直接讲思路,我们有一个缓冲区,当我们接下来推送的字符串的索引下标不是对应的我们当前需要的索引下标的时候,我们需要将他缓存起来,并且如果当这个字符串的起始索引加上长度如果超出了我们的 capacity,还需要对他进行截取,总之就是,截取就完了,只需要按照 capacity 可以容纳的最大长度进行截取就可以了,如果一开始的字符串下标索引就超出了,就可以抛弃了。这里其实最开始感觉这种合并子串很麻烦,我就直接用的 char 来实现的传输,但是后面一个测试样例始终过不去,哈哈,受不了了。

2025-06-01 16:14:06 408

原创 CS144 - LAB0

如图,很简单,但是注意输入时间太久会超时。

2025-05-28 19:44:01 1354

原创 CS144 - Lecture 1 记录

由于没讲义,全看课了,系统性的总结有点难,记一些有趣的东西吧。

2025-05-28 19:41:13 1705

原创 MIT6.S081-lab8

从 lecture 我们可以知道,我们目前的单个文件的最大大小很小,这是因为我们能够索引的索引块范围很小,实际上,目前的索引只有直接索引和一级索引,而这个实验就是需要我们去实现二级索引,我们通过阅读 bmap 和 itrunc 可以发现,我们的一级索引实际上是通过分配一个数据块来进行索引了,所以我们二级索引也需要利用这个思路。fs.h11sizeof完成。

2025-05-03 22:12:16 493 1

原创 MIT6.S081-lab8前置

注:本部分除了文件系统还包含了调度的内容。

2025-05-03 22:11:45 1005

原创 MIT6.S081-lab7

这个实验就是让我们去将所有的页分配到每个运行的 CPU 里面,在每个 cpu 分配页的时候,会首先从自己维护的链表中取出空闲页,如果发现不足,就会从其他的 cpu 中窃取页,以此将页表分散到每个 cpu 来减少锁导致的开销。如何实现?根据 hint ,我们可以了解到 NCPU 这个常量,通过它,我们可以初始化一个长度为 NCPU 的 kmem 数组,并且需要为他们分别分配锁,由于需要用到一些关于 cpu 的函数,我们需要引入 “proc.h” 这个头文件。

2025-04-29 17:25:46 671 3

原创 MIT6.S081-lab7前置

这部分包含了设备中断和锁的内容。

2025-04-29 17:25:13 1047

原创 MIT6.S081-lab5

就是写时复制,根据hint,我们需要为每一个页创建一个引用的字段,以此来表示他们被多少proc引用,方便在释放页的时候,只有在我们的页引用数变为了0,才会真正的回收,在这里,我们会用一个全局的数组来表示这个引用数。根据hint,当我们执行fork的时候,我们会调用uvmcopy这个函数来执行页的复制,此处,为了实现我们的cow,我们需要对他进行修改,来保证我们可以正确的得到一个共享页,此处就不需要真正的去复制页了,而仅仅是修改一下权限位,随后映射即可。同时,我们需要在kinit里面初始化我们的锁。

2025-04-24 15:22:40 469 1

原创 MIT6.S081-lab5前置

lab5的前置知识主要是lecture8 page fault的内容。我们之前提过xv6是没有实现我们的cow写时复制的,当然,我们的lab5需要做的就是为xv6实现一个写时复制。

2025-04-24 15:19:55 836

原创 MIT6.S081-2024版本的环境搭建

我看网上的环境搭建版本大多是2020年,或者ubuntu20版本的,我也跟着很久没有搭建好,在下载工具链之前,我最开始直接用git去拉取哪个工具链,之后又配置了半天,发现一个比较友好的最新版本的环境搭建办法,在这里重新分享一下。此时如果进入了gdb,这便是没有问题了!那么还需要进一步验证。

2025-04-21 10:37:31 260

原创 MIT6.S081-lab4

注:本篇lab的前置知识在《MIT6.S081-lab3前置》

2025-04-20 20:35:41 901

原创 MIT6.S081-lab4前置

这部分的内容其实在lab3前置的源码阅读部分就已经讨论过了,但是这个是本章的重点,所以再次来讨论一下:他先将我们的需要的系统调用的对象(SYS_fork在这里实际上是int常量,表示这个系统调用的数字),存入a7,然后通过执行ecall跳转到我们的陷阱处理的地方(**ecall到底干了什么?**ecall会将我们的user mode切换为,所以这个参数就不需要手动去切换了,并且还会将程序计数器保存到SEPC寄存器中,最后会跳转到STVEC寄存器指向的位置),由于我们此时是从用户空间陷入,所以我们此时。

2025-04-20 20:35:03 829

原创 MySQL学习笔记7【InnoDB】

缓冲池是主存中的第一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删查改操作时,先操作缓冲池中的数据,然后以一定频率刷新到磁盘,这样操作明显提升了速度。缓冲池以page为单位,底层采取。

2025-04-11 21:29:46 984 1

原创 xv6-labs-2024 lab3

注:本篇lab的前置知识在《xv6部分源码阅读-1》

2025-04-11 15:53:21 1574 6

原创 xv6部分源码阅读-1

在lab2中,我们会为了完成attack这个实验,而花费大量的时间去阅读相关的系统调用源码,以此来分析出我们最终secret所在的页表的位置,而我写lab2中,重点并没有关注其中的逻辑关系,有很多想仔细分析的函数都没有深入地去看,故写此文,以便理解记忆。

2025-04-10 14:31:36 649

原创 xv6-labs-2024 lab2

操作系统的,举例说明就是,当我们的shell,或者qq挂掉了,我们不希望因为他,去影响其他的进程,所以在不同的之间,需要有隔离性,并且,应用程序和操作系统之间,也是如此。当失去操作系统,我们的应用程序将会与硬件进行交互,数据也将直接存储在中,但是我们的两个应用程序无法识别相互的,此时就可能会产生,所以,这就是我们希望内存能够隔离的原因,也是我们操作系统所需要实现的功能,另外还需要(cpu分时复用,也就是多线程,CPU运行一个进程一段时间,再运行另一个进程)

2025-04-07 21:28:20 1398

原创 xv6-labs-2024 lab1

专栏内有环境搭建的教学文章。

2025-04-07 21:26:02 1058

原创 学习汇编随手记

本笔记是关于王爽汇编的笔记,覆盖不全,到了内中断就完结了,听从学长建议,我跑去学xv6了,x86告辞。[bx]和[0]有些类似,都表示内存单元,而[0]作为偏移地址可以随便指定,而[bx]也表示偏移地址,但是他的偏移地址就是寄存器bx中的数值,他们的段地址都是ds。loop,就是循环如下所示,cx代表循环的次数,每执行一次循环,cx–,直到为0,停止循环。

2025-04-05 09:38:14 1240 4

原创 动手实现docker全过程

Github项目地址命名空间就像一层隔板,有了这层隔板,就会让隔板内的人以为自己独享这片天地,这层隔板有各种各样的,比如,,等等,暂时可以这么理解。IPC Namespace 是 Linux Namespace 机制的一部分,专门用于隔离进程间通信资源。它在容器技术中的作用是确保每个容器有自己的 IPC 资源,而不会与宿主机或其他容器共享,从而增强了安全性和资源隔离能力。而像这样的命名空间还有很多,docker就是采取这些Namespace来实现隔离的。容器是什么,docker又是什么?想清楚这一点,我们才

2025-03-31 20:47:51 1198 2

原创 关于kafka的一些知识总结

如果通过客户端自动创建的话,partition默认只有一个,而我们可以在命令行输入来创建一个有11个分区的topic,而如果是想要更新已有的topic的partition大小,应该将--create修改为--alter,如果是在docker环境中,也可以在进入容器之后输入来查看命令的参数。其他的比如--describe用于查看topic的详细信息,--list查看所有主题。

2025-03-23 12:48:09 943 1

原创 Redis,从数据结构到集群的知识总结

redis底层使用C语言实现,这里主要分析底层数据结构。

2025-03-17 14:38:50 830 1

原创 在用Docker配置Redis哨兵节点的时候出现的错误及其解决办法

如果你已经确保你的redis版本在6.2之后,依旧出现这个问题,可以在挂载的配置文件中加上。这里如果你的redis版本比较旧,需要在配置文件中将其修改成hostname修改为ip。你的docker-compose.yml文件关于sentinel的配置可能是这样的。这都是我踩过的坑,问AI也半天搞不定,现在来记录一下是怎么解决的。字面来看,就是Redis无法进行写入操作。StackOverflow永远的神.这一行配置,就可以了。那么回到第二个问题,

2025-03-16 10:51:44 487

原创 LeetCode--198. 打家劫舍【从返回最大值到输出路径】

有一段时间没写blog了,只是因为感觉遇到的题没啥含金量,写不出什么东西来,就随便讲下思路就push上github了,感觉还是比较水,就没上传到博客上面,哈哈,有兴趣可以看看我的。这部分还是花了一点时间,总体思路是用三位数组解决的,至于测试,我是通过遍历path,将ans加起来,然后return,通过了力扣的测试,应该是没啥问题的。每次走都有一次路径的保存,同时有偷和不偷的两种选择,这个思路和上面是一样的,虽然这里完全可以优化很多空间,但是为了好理解,我直接把没有优化过的放出来了。

2025-03-15 10:07:16 249

原创 《Go语言设计与实现》Runtime部分的一些知识总结

因为平时看的时间比较杂,没有系统的学Golang,最近在看Go语言设计与实现,感觉一些有趣,有难度的知识点就在这里用自己的话总结一下,写下来了,主要还是供自己复习用的,有些我觉得比较清晰的地方就没有写太多,感觉很模糊可以去看原书,讲得很透彻。

2025-03-07 16:42:05 1152 6

原创 LeetCode--94. 二叉树的中序遍历

给定一个二叉树的根节点root,返回它的遍历。

2025-03-02 09:21:18 534

原创 LeetCode--76. 最小覆盖子串

值得一提的是,虽然s可能会引入新的字符到哈希表里面,但是实际上是不会造成什么影响的,在哈希表中,正数表示l,r维护的字符串还需要这个字符,而0,表示此时刚好满足这个字符的需求,负数表示可有可无。如果引入了另外的字符,那么之后他不再有可能遍历到使它对应的mp值为0的位置。首先创建一个mp,统计target目标字符串的字母数量,再用一个cnt变量存储存在的字符种类,最开始只会暴力滑动窗口做法:O(M*N)或者O(c\N+M)然后怎么都想不出来怎么优化到O(M + N)所有字符的子串,则返回空字符串。

2025-03-01 09:54:12 658

原创 LeetCode--4. 寻找两个正序数组的中位数

主要思路是将数组分成左右两个部分进行计算,代码内嵌详细注释。难想,是我无法想出来的二分,有点顶级的题目,开背!请你找出并返回这两个正序数组的。的正序(从小到大)数组。算法的时间复杂度应该为。

2025-02-28 10:11:44 331

原创 LeetCode--41. 缺失的第一个正数

一定存在于原数组中,相反,如果为正数,那么就是不存在于原数组中的,随后进行最后一层遍历,就可以拿到我们的答案了,如果遍历完了,也没有正数的话,说明n + 1就是我们最后的答案。第二次遍历,拿到数组中每个元素的绝对值,由于我没找的是没有出现的最小正整数,所以找到的数字一定不会>=n,所以我们可以利用这种性质,将数组中每个元素的值作为。由于我们已经知道,数组中已经不存在负数,也就是说,如果这个下标的值为负数,那么这个下标。第一次遍历,将所有<=0的数字设为n+1,以便不会影响之后的标记,请你实现时间复杂度为。

2025-02-28 08:39:14 605

原创 LeetCode--142. 环形链表 II

给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(如果pos是-1,则在该链表中没有环。pos,仅仅是为了标识链表的实际情况。链表。一刷,二刷都没独立写出来,在这里写个题解,加深记忆。

2025-02-25 12:38:27 360

原创 LeetCode--31. 下一个排列

整数数组的一个就是将其所有成员以序列或线性顺序排列。arr[1,2,3][1,3,2][3,1,2][2,3,1]整数数组的是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。[1,3,2][3,1,2][1,2,3][3,2,1]给你一个整数数组nums,找出nums的下一个排列。必须**

2025-02-25 09:04:03 593 1

原创 LeetCode--93. 复原 IP 地址

正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s,用以表示一个 IP 地址,返回所有可能的,这些地址可以通过在s中插入'.'来形成。你重新排序或删除s中的任何数字。你可以按顺序返回答案。

2025-02-24 09:34:13 608

原创 LeetCode--124. 二叉树中的最大路径和

二叉树中的被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中。该路径节点,且不一定经过根节点。是路径中各节点值的总和。给你一个二叉树的根节点root,返回其。

2025-02-24 08:42:23 652

原创 LeetCode--82. 删除排序链表中的重复元素 II

基本思路是遍历Node,当Node.Val!删除原始链表中所有重复数字的节点,只留下不同的数字。给定一个已排序的链表的头。

2025-02-23 12:40:20 422

原创 关于二分查找时的边界分类问题

众所周知,我们在优化有关查找的算法时,都会用到二分,但是不同的题用到的二分查找,其左右边界/中点的处理大多都不相同,所以在这里写一下关于一些常见二分边界的种类。

2025-02-22 13:04:25 1026 1

原创 LeetCode--200. 岛屿数量

给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

2025-02-20 10:50:44 585

原创 LeetCode--236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(

2025-02-19 12:05:57 405

原创 LeetCode--23. 合并 K 个升序链表【堆和分治】

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

2025-02-17 14:58:34 600

空空如也

空空如也

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

TA关注的人

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