- 博客(231)
- 收藏
- 关注
原创 227.MIT6.S081-Multithreading
本实验将使我们熟悉多线程。将在用户级线程包中实现线程之间的切换,使用多个线程来加速程序,并实现一个屏障。第一个练习让我们在用户态模拟了线程的切换,这里重要的就是进程/线程上下文的保存与恢复;第二三个练习则是让我们跳出了xv6,去熟悉pthread库和线程的同步互斥。
2024-07-24 16:01:21
630
原创 225.Mit6.S081-实验六-Copy-on-Write Fork for xv6
虚拟内存提供了一定程度的间接寻址:内核可以通过将PTE标记为无效或只读来拦截内存引用,从而导致页面错误,还可以通过修改PTE来更改地址的含义。在计算机系统中有一种说法,任何系统问题都可以用某种程度的抽象方法来解决。Lazy allocation实验中提供了一个例子。这个实验探索了另一个例子:写时复制分支(copy-on write fork)。
2024-07-21 11:25:17
562
原创 224.Makefile的使用
Makefile是一种用于管理和自动化软件编译过程的文本文件。它通常包含了一系列规则,这些规则描述了如何根据源代码文件生成可执行文件或者其他目标文件。Makefile的核心概念是规则和依赖关系,规则定义了如何生成一个或多个目标文件,而依赖关系则指定了生成目标文件所需要的源文件或其他依赖文件。下面我们通过一步一步编写Makefile来学习Makefile规则。
2024-07-18 17:43:14
612
原创 221.Mit6.S081-实验5-xv6-xv6 lazy page allocation
一、操作系统可以使用页表硬件的技巧之一是sbrk()。在我们给出的内核中,sbrk()。内核为一个大请求分配和映射内存可能需要很长时间。例如,考虑由262144个4096字节的页组成的千兆字节;即使单独一个页面的分配开销很低,但合起来如此大的分配数量将不可忽视。此外,有些程序申请分配的内存比实际使用的要多(例如,实现稀疏数组),或者为了以后的不时之需而分配内存。为了让sbrk()在这些情况下更快地完成,复杂的内核会延迟分配用户内存。也就是说,sbrk()。。您将在这个实验室中向xv6添加这个延迟分配特性。
2024-07-17 19:36:02
751
原创 220.贪心算法:根据身高重建队列(力扣)
它接受一个`vector<vector<int>>`类型的参数`people`,其中每个内部向量包含两个整数:第一个整数表示身高,第二个整数表示该人的k值。它接受两个`vector<int>`类型的参数`a`和`b`,并返回一个布尔值。这段代码定义了一个名为`Solution`的类,其中包含两个成员函数:一个静态比较函数`cmp`和一个成员函数`reconstructQueue`。- 使用`sort`函数对`people`向量进行排序,排序规则由静态比较函数`cmp`提供。
2024-07-12 17:18:02
601
原创 218.贪心算法:分发糖果(力扣)
在这个循环中,如果当前孩子的评分比他后一个孩子的评分高(`ratings[i]>ratings[i+1]`),则当前孩子的糖果数应该是他后一个孩子的糖果数加1和他当前糖果数中的较大值(`candyNum[i]=max(candyNum[i+1]+1,candyNum[i]);在这个循环中,如果当前孩子的评分比他前一个孩子的评分高(`ratings[i]>ratings[i-1]`),则当前孩子的糖果数应该比前一个孩子的糖果数多1(`candyNum[i]=candyNum[i-1]+1;
2024-07-12 15:24:07
1044
原创 216.Mit6.S081-实验四-Traps
本实验探索如何使用陷阱实现系统调用。您将首先使用栈做一个热身练习,然后实现一个用户级陷阱处理的示例。开始编码之前,请阅读xv6手册的第4章和相关源文件:要启动实验,请切换到traps。
2024-07-12 14:12:22
4423
原创 215.Mit6.S081-实验三-page tables
在本实验室中,您将探索页表并对其进行修改,以简化将数据从用户空间复制到内核空间的函数。
2024-07-11 19:16:37
1031
原创 213.贪心算法:跳跃游戏||(力扣)
该算法使用贪心策略,每次选择当前能跳跃的最远位置,并更新下一次能跳跃的最远位置。遍历过程中,每当到达当前能跳跃的最远位置时,增加跳跃次数,并更新当前跳跃能到达的最远位置。如果在更新过程中,发现能到达或超过终点,跳出循环。,表示最少需要跳跃两次。
2024-07-08 20:34:53
732
原创 212.贪心算法:跳跃游戏(力扣)
这个算法使用贪心算法的思路,通过遍历数组,每一步更新能到达的最远位置。如果能到达或超过数组的最后一个位置,则返回。
2024-07-08 20:09:10
590
原创 211.xv6——3(page tables)
UART0和UART0_IRQVirtio磁盘接口CLINT#define CLINT_MTIME (CLINT + 0xBFF8) // 启动以来的时钟周期数PLIC。
2024-07-04 19:48:08
697
原创 210.C++中max_element和min_element 的使用
和是 C++ 标准库中的函数,用于在容器(如 vector、数组等)中找到最大和最小元素的迭代器(或指针)。
2024-07-02 16:46:20
258
原创 205.Mit6.S081-实验二 system calls
在上一个实验室中,您使用系统调用编写了一些实用程序。在本实验室中,您将向xv6添加一些新的系统调用,这将帮助您了解它们是如何工作的,并使您了解xv6内核的一些内部结构。您将在以后的实验室中添加更多系统调用。
2024-06-30 19:38:48
1548
原创 192.回溯算法:电话号码的字母组合(力扣)
这个回溯算法的时间复杂度是 O(3^n * 4^m),其中 n 是对应 3 个字母的数字(如 2、3、4、5、6、8)的个数,m 是对应 4 个字母的数字(如 7、9)的个数。这个复杂度源于每个数字对应的字母数量及其组合的所有可能性。
2024-06-22 21:59:15
307
原创 191.回溯算法:组合总和|||(力扣)
回溯算法是一种系统地搜索问题解的算法,适用于满足特定条件的所有解。在这个问题中,回溯用于从数字1到9中选出k个数,使它们的和为n。每次递归调用都会在当前组合中添加一个新的数字,并继续尝试加入更多数字,直到满足条件或不满足条件而进行剪枝。通过回溯和剪枝,可以有效地找到所有满足条件的组合。
2024-06-22 18:50:17
524
1
原创 190.回溯算法:组合(力扣)
回溯算法是一种通用的算法设计技巧,特别适用于解决组合、排列、子集等问题。它通过逐步构建解决方案,并在发现部分解决方案无效时撤销(回溯)部分计算,从而寻找所有可能的解决方案。回溯算法的基本思想是通过深度优先搜索(DFS)遍历所有可能的解空间,当发现某条路径不符合条件时,返回到上一步,尝试其他路径。
2024-06-21 15:09:37
1119
原创 189.二叉树:把二叉搜索树转换为累加树(力扣)
代码使用了递归的方法。主要思路是使用中序遍历的方式遍历二叉搜索树,但改变遍历的顺序,即先遍历右子树,然后访问当前节点,最后遍历左子树。在遍历过程中,每次访问一个节点时,将该节点的值加上其所有右子节点的值。这个算法的时间复杂度是 O(n),其中 n 是树中节点的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。
2024-06-21 11:31:38
408
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人