- 博客(25)
- 收藏
- 关注
原创 MIT6.S081课程实验最详解析与知识点归纳——lab9:File system
本实验虽然名为File system,但在文件系统的七个层次中,主要涉及的还是inode层往上的层次,层次较高。上个实验涉及了Buffer cache层。但中间重要的一层logging层并没有过多涉及本实验较为简单,手撕代码的时间可能总共不超过一小时,但debug的时间嘛……一整天(
2024-08-21 14:30:48
941
原创 MIT6.S081课程实验最详解析与知识点归纳——lab8:Locks
此外,还有一点也很重要,我们不是从id=0的CPU开始窃取,而是从缺内存的CPU向后轮询,即编号cpuid的CPU缺内存了,那就窃取编号为cpuid+1、+2的CPU的内存。接下来都是轻松的工作了,由于此处是用时间戳实现LRU策略,所以brelse要做的仅仅是修改释放的缓冲块的时间戳,记录一下最后一次使用的时间。理由也很简单,总不能让编号靠前的CPU一直被偷吧,向后偷能尽可能让每个CPU被偷的次数平均,从而也能降低偷窃的次数,提高性能。是:当前CPU空闲块不足时,向其它CPU的空闲链表中偷窃内存块。
2024-08-15 17:16:34
766
原创 MIT6.S081课程实验最详解析与知识点归纳——lab7:Multithreading
又因为get()是只读操作,不会修改临界资源的值,所以,我们只需要给put()的临界区上锁即可。调用编写好的thread_switch即可完成工作,此处不涉及锁,也没有所谓的调度线程,直接从旧线程的上下文切换到新线程的上下文即可。额外提一点,这里增加桶的数量NBUCKET,会减少访问临界资源的概率,也就减少了锁导致的性能开销,因此也可以大大提高程序的并行效率。在多线程编程中,Barrier(屏障)是一种同步机制,用于使一组线程在某个特定的同步点(即屏障点)等待,直到所有线程都达到这个点。
2024-08-09 14:53:58
264
1
原创 MIT6.S081课程实验最详解析与知识点归纳——lab6:Copy-on-Write
接着找到kinit()里freerange的范围,可以看到物理页面(RAM)的地址范围是end~PHYSTOP,但是end的注释为first address after kernel,随内核代码段和数据段的大小而变化,是个变量,不能用于确定数组的大小。关于数组放在哪里,它显然是一个内核的全局变量,可以放在vm.c中,在要用到的地方用extern声明,但这其实不是最好的方案,我们稍后再讨论。只当该页面计数为0时,才真正释放页面。很显然,计数结构是一个数组,对每个物理页面,维护共享进程的个数,
2024-07-31 14:24:40
616
2
原创 MIT6.S081课程实验最详解析与知识点归纳——lab4:Traps
以系统调用write为例,先概括一下trap的流程trap的详细流程,更深入的了解了系统调用的过程函数的独立存储空间——栈帧结构xv6中trap保存寄存器与恢复现场的方式——蹦床页面与trapframe结构。
2024-07-22 18:18:00
621
1
原创 MIT6.S081课程实验最详解析与知识点归纳——lab3:Page tables
1.详细了解了页表2.虚拟内存相关知识,空间分配、回收、映射3.实现了页表的新功能,从全局内核页表到独立内核页表的替换4.简化了用户进程与内核之间的数据传输,将其升级为硬件方式。
2024-07-15 19:40:02
1018
1
原创 MIT6.S081课程实验最详解析与知识点归纳——lab2:System calls
本章最重要的莫过于系统调用的执行流程,再回顾一遍:1.用户态下执行函数fork(),触发中断。这是系统调用提供给用户的接口2.通过ecall跳转入内核态下的中断处理函数3.trap函数判断中断类型为系统调用,转入响应函数syscall4.syscall从寄存器中获取系统调用的编号,索引到相应的系统调用5.转入sys_fork,这是系统调用的具体实现函数内存管理的知识:分页存储、空闲链表法进程相关概念:PCB。
2024-07-10 17:40:31
842
原创 MIT6.S081课程实验最详解析与知识点归纳——lab1:Utilities
1.几个系统调用的使用如fork,wait,exec2.管道的使用3.多进程编程4.文件操作,FCB,目录项,文件遍历。
2024-05-13 00:25:03
843
原创 MIT6.s081实验错误个人汇总
根目录下按Ctrl+Shift+P后输入C/C++:Edit Configurations,.vscode文件下会出现c_cpp_properties.json文件,打开后在includepath下手动加入路径:user,kernel等。user/sh.c中,第57行,即void runcmd前加上。
2024-05-07 23:01:44
159
原创 哈夫曼树与哈夫曼编码
这样既符合带权路径长度最小,又满足了前缀编码的条件(字符处于叶子结点上,所以到达任意一个字符都不会完全经过其它字符,不会出现A是B的前缀的情况)且为了防止编码重合导致多译的情况,要求任一个字符的编码都不是另一个字符编码的前缀。2.在森林中选取两颗根结点最小的树作为左右子树构造一颗新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。1.根据给定的n个权值构成n颗二叉树的集合(森林),其中每颗二叉树Ti中只有一个带权为wi的根结点,左右子树均空。:带权路径长度最小的树(最优二叉树)
2023-09-06 16:25:50
110
1
原创 『二叉树』之遍历(递归、迭代法与层序遍历)
递归法遍历非常简单且容易理解,代码基于同一个模板,不同遍历顺序只是调换了几行代码的顺序。即一层一层的遍历二叉树,每层从左到右输出,实际上是图论中的广度优选搜索(BFS)
2023-09-06 11:25:23
211
1
原创 十大排序之『桶排序』(计数、桶、基数排序)
优化:扫描数列记录min与max,count数组的size即为max-min+1,并且范围是从0到size,即记录count[a[i]-min]++,等于将有数据的区块左边界平移至与原点重合,这样既优化空间,又解决了无法存储负数的问题。优化:区别于桶排序要用二维数组存储桶的编号与该编号下的所有数据,基数排序有一种巧妙的方法,只需要一个一维数组,即十个桶,并且每个编号的桶只存储一个元素——数列中位数等于该编号的数据个数。原理:在数据范围(min~max)中分若干个区间(桶),将每个区间(桶)内的元素排序。
2023-08-30 10:44:33
101
原创 十大排序之『归并排序』
1.如何得到有序的子序列:继续划分,有序的子序列是由更小的有序子序列合并而成。很明显这是一个递归过程,划分直到子序列只有一个元素,一个元素即有序。2.如何将有序子序列合并成有序长序列:比较两个序列中的元素,小的先取出放在前面即可,运用双指针容易实现。原理:将已经有序的子序列合并,得到有序的完整序列。(3/3)第三个O(nlogn)的排序算法。
2023-08-30 10:04:51
62
原创 十大排序之『选择排序』(选择排序、堆排序)
取走大根堆堆顶元素走,左子树和右子树仍然是大根堆,只需将改变后的堆顶元素一步步下沉,比左右子结点中更大的那个结点小则交换,子树依旧递归交换,如此堆顶元素就可以下沉到正确的位置。原理:从数列0到k上维护一个大根堆,每趟从堆的顶端中取出最大的元素,放到位置k上,然后进行维护使得0到k-1成为一个大根堆,继续取堆顶最大的元素交换……(2/3)第二个O(nlogn)的排序算法,一共进行n趟,每趟维护大根堆(优先队列)的复杂度是O(logn)原理:每次从待排序序列中选出一个最小的元素,放在排好序的序列最后面。
2023-08-29 23:10:38
61
1
原创 十大排序之『交换排序』(冒泡、快速排序)
原理:元素之间两两进行比较,逆序则交换,这样第一趟下来最大的元素一定被交换到了最后面(反证法易理解),第二趟从前n-1个元素开始,第二大的被交换到倒数第二位……平均时间复杂度为O(nlogn)的算法,也是STL库中sort函数的实现原理,但在数组已经有序的情况下降低至O(n^2)2.扫描数,比基准数小的元素放在基准数左边,大的则放在右边,得到左右两个区间。值得注意的是,如过某一趟中没有进行过交换,说明数组有序,跳出即可。1.先从数列中取出一个数(一般是中间的数)作为基准数。
2023-08-29 22:49:41
67
1
原创 十大排序之『插入排序』(直接、折半、希尔排序)
原理:易知插入排序在数列有序度较高的情况下时间复杂度较低(可降至O(n)),基于此,希尔排序的思想是:先将待排序序列分割为若干个子序列,分别进行直接插入排序,待整个数列基本有序,再对全体序列进行一次直接插入排序。,增量序列是一组递减并且互质的数,并且最后一个数一定是1,对于t趟的希尔排序,增量序列可以是dlta[k]=2^(t-k+1)-1。值得一提的是,目前希尔排序的最优增量序列仍是数学界尚未解决的难题。原理:类比扑克牌理牌原理,将未排序序列中的元素一个个插入到已排序序列的正确位置上。
2023-08-29 22:29:44
63
1
原创 LIS——最长上升子序列
一.基本模板(n²)#include<iostream>using namespace std;int f[10001],a[10001],n;int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; f[i]=1; } for(int...
2020-03-25 20:51:28
123
3
原创 信息奥赛c++学习笔记——贪心算法
一,算法在当前状态下找出局部最优解,转化为全局最优解。二,活动安排问题1.问题描述:给定n个开区间(ai,bi),在给定范围内尽量选择多个区间,使得这些区间两两没有公共点。2.算法:按照结束时间bi从小到大排序,然后按照排序顺序依次考虑每个活动,如果没有和已选活动冲突,就选,否则不选。3.代码#include<iostream>#include<algorithm&...
2020-02-19 15:20:56
404
1
原创 信息奥赛c++学习笔记——字符串的读入(易错)
一维字符串第一种#include<iostream>#include<cstdio>#include<cstring>using namespace std;char a[2000];int main(){ int len; scanf("%s",a); len=strlen(a); for(int i=0;i<len;i++) pr...
2019-12-14 20:48:47
195
原创 信息奥赛C++学习笔记——RMQ
RMQ——ST算法求解一.简介RMQ即询问静态区间最值问题,采用ST算法求解。相比于线段树,更为快捷,但没有修改操作二.算法思想基于动态规划,二分与打表算法。先进行预处理(本质为通过动态规划求解所有状态进行打表),O(nlog)完成,再进行O(1)查询。三.前提知识位运算a<<b表示a的二进制数左移b位,低位补零。即a*pow(2,b),故1<<j可以表示pow...
2019-11-23 19:39:58
887
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人