- 博客(30)
- 收藏
- 关注
原创 cmu15-445 Project #4 - LOGGING & RECOVERY
Project 4的主要工作是实现bustub中的Logging,Recovery和Checkpoints的功能Task #1 - LOG MANAGER为了实现bustub中原子性和持久性的目标,bustub中通过日志记录存储过程中的修改信息,日志保证已经commit的事务中所做的修改的有效性 ,同时保证发生系统崩溃时尚未提交的事务中所做的修改不生效。最常用的日志结构是WAL,WAL是一连串的记录,记录着数据库中所有的修改动作,在文件include/recovery/log_record.h中对WAL
2022-02-09 00:56:51
458
原创 cmu15-445 Project #2-Hash Table
在lab 2中需要实现一个使用线性探测方案的hash tableTASK #1 - PAGE LAYOUTS这个lab中的hash table的存储空间只能使用BufferPoolManager来获取,不能另外使用new或者malloc来获取存储hash table需要的空间。要实现的hash table必须支持持久化,在内存中写入硬盘后,重启DMBS也能重建该hash table。为了实现h...
2021-11-05 10:34:18
997
1
原创 cmu15-445 Project #1-Buffer Pool
TASK #1 - CLOCK REPLACEMENT POLICY实现src/buffer/clock_replacer.cpp中的函数:Victim(): 使用时钟算法淘汰一个frame,从时钟的指针指向的地方开始,找出第一个ref=0的frame。如果所指向的frame的ref=1,那么将其ref置为0。然后更新clock handPin():在一个页面被pin的时候调用,将对应的...
2021-11-05 10:33:53
411
原创 mit6.s081 lab11 networking
这个exercise的工作是完善kernel/e1000.c文件中的e1000_transmit()和e1000_recv()函数,从而使得驱动可以发送和接受packet。e1000_init()函数配置使得E1000从RAM中读取要发送的packet,以及将接收到的packet写入到RAM中,这就是DMA技术,RMA使得硬件可以直接从RAM中读写packet。有可能出现在短时间内出现大量待处理的packet的情况,因此需要缓冲区来缓冲那些无法被及时处理的packet,在xv6中使用RAM中的descr
2021-11-02 23:57:23
253
原创 mit6.s081 lab10 mmap
1.添加mmap和munmap的syscall2…为了追踪每个process使用mmap产生的映射区域,使用VMA去记录mmap时的address, length, permission, file等信息。可以创建一个固定大小的VMA数组来进行实现,16个VMA元素已经足够。在proc.h中定义VMA结构体,在proc中添加VMA数组,数组的大小为16。需要注意的是VMA结构体中有offset成员,用于记录addr对应在文件中的偏移量。struct VMA { uint addr; int of
2021-10-25 18:50:04
319
原创 mit6.s081 lab9 file system
Large files这个exercise的工作是提高xv6支持的最大文件大小,现在的inode结构如下图所示原始的xv6 inode结构中有12个直接索引,1个一级间接索引,所以当前xv6中文件的支持的最大block数为12 + 256 (每个block可以存储256个block num,一个sector为512 bytes,一个block为1024 bytes,一个block num为4 bytes)。现在要将inode结构修改为11个间接索引,1个一级间接索引,1个二级间接索引,可以支持的最大文
2021-10-23 21:03:08
401
原创 mit6.s081 lab8 locks
Memory allocator这个exericise的工作是通过为每个CPU维护一个freelist来减少kalloc时的锁竞争,当CPU对应的freelist为空时,从其他CPU的freelist中窃取page。1.为每个CPU都维护一个freeliststruct { struct spinlock lock; struct run *freelist;} kmem[NCPU];2.kinit时为每个CPU对应freelist初始化锁voidkinit(){ for (i
2021-10-22 00:26:50
556
原创 mit6.s081 lab7 Multithreading
chapter 7发生进程切换的时机:1.等待pipe或者设备I/O2.等待子进程退出3.调用sleep syscall4.进程运行时间过长进程切换时需要保存的当前运行的进程的寄存器和恢复即将运行的进程的寄存器当一个进程想要放弃cpu时需要获取进程锁,更新自身的state,然后调用sched,sched调用swtch保存进程的上下文并切换到scheduler的上下文(cpu->scheduler)。在swtch的过程中process必须要获取锁,否则有可能和其他cpu发生争抢。...
2021-10-13 20:17:20
323
原创 mit6.s081 lab6 Copy-on-Write Fork for xv6
Implement copy-on writecopy-on-write fork需要解决什么问题?xv6中的fork()调用需要拷贝所有父进程中的user space memory给子进程,如果user space memory中的空间很大,那么这个拷贝的过程需要消耗非常多的时间。而且这个拷贝的动作很多时候都是浪费的,因为在fork()后往往还会调用exec(),之前所拷贝的user space memory需要被丢弃掉。为了解决以上问题,需要实现copy-on-write fork。在COW fo
2021-10-10 17:14:27
527
原创 mit6.s081 lab5 lazy allocation
Eliminate allocation from sbrk()这个exercise的主要工作是从目前的sbrk()实现中删除分配内存的部分,只增加process的sz。具体步骤为在sys_sbrk中删除growproc的调用,但sz增加nuint64sys_sbrk(void){ int addr; int n; if(argint(0, &n) < 0) return -1; addr = myproc()->sz; // if(growpro
2021-10-09 15:45:24
327
原创 mit 6.s081 lab3 page tables
chapter 3Print a page table这个exercise的内容为打印page table,需要实现一个打印函数vmprint,参数为pagetable_t,传入根页表地址,打印对应的pagetable。在这个exercise中只需要打印init进程的pagetable,所以需要在exec函数(exec.c)中添加对进程的pid的判断,如果pid为1,打印该进程的pagetable打印的例子:page table 0x0000000087f6e000..0: pte 0x00000
2021-10-02 20:39:00
786
原创 CSAPP malloc lab
整体的设计:使用分离存储的方案,维护一个存储空闲链表的数组free_block_list,每个大小类一个空闲链表,根据2的幂来划分大小,块的设计采用书本上介绍的显示空闲链表的方案。当可供使用的空间不够时,就会扩展堆。在extend_heap中会增加堆顶的大小,并将新的空闲块挂载到free_block_list上。为了减少内存碎片,会根据新申请的块的前一个块是否空闲来决定是否与其合并。void ...
2019-12-31 11:00:32
852
原创 CSAPP buflab
level 0由getbuf中的0x08048fe6 <+6>: lea -0xc(%ebp),%eax可知buf所在的地址为%ebp-0xc,由栈帧的结构可知getbuf中的返回地址保存在%ebp+4中,所以输入16个字节后输入的内容为smoke的地址0x08048e20,输入的内容为64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 6...
2019-12-31 10:57:08
299
原创 CSAPP bomblab
Phase_1使用命令disas phase_1获取bomb程序的phase_1的反编译出来的汇编代码,其中有下面这几行代码: 0x08048b86 <+6>: movl $0x8049978,0x4(%esp) 0x08048b8e <+14>: mov 0x8(%ebp),%eax 0x08048b91 <+17>: mov ...
2019-12-31 10:55:22
596
原创 CSAPP datalab
1.bitXor函数功能:使用位运算实现异或思路:将x中为0y中为1,x中为1y中为0的位提取出来,使得位不同的位为0,最后取反。int bitXor(int x, int y) {return (((~x&y) & ((x&y))));}2.tmin函数功能:返回int类型最小值思路:int 类型的最小值是0x8000000,所以使用左移操作获取0x800...
2019-12-31 10:47:06
809
2
原创 mit6.828 lab2
获取lab2的代码add git git pullgit checkout -b lab2 origin/lab2git merge lab1文件说明kclock.c和kclock.h操作battery-backed clock和CMOS RAM(BIOS通过这个硬件来记录电脑中有多少物理内存)pmap.c中实现了从CMOS RAM中读取有多少内存在这个lab中主要处...
2019-09-19 20:25:37
838
原创 raft
共识算法:Raft https://www.jianshu.com/p/8e4bbe7e276c如何选主?Node有3个status,分别为Follower, Candidate和Leader。每个Node都有定时器,在Follower成为Candidate的这个阶段,定时器的间隔设为election timeout,当Follower经过election timeout后就会成为Ca...
2019-09-19 20:24:57
257
原创 mit6.824 Lab 1
Lab 1lab code流程:开启RPC Server等待workers来注册在schedule()中决定如何将tasks分配给workers,如何处理worker发生的错误对map task调用doMap(),doMap()的动作为读取对应的文件,并对其中的内容调用map function,最后将生成的key/value pairs写到对应的中间文件中。master调用doRed...
2019-09-19 20:24:40
479
原创 mit6.828 Lab1
Part 1熟悉x86汇编语言参考资料:https://pdos.csail.mit.edu/6.828/2018/readings/pcasm-book.pdf这本书中介绍的是使用nasm汇编器所支持的汇编(Intel Syntax),但在这个lab中实际使用的是GNU汇编器(AT&T Syntax)http://www.delorie.com/djgpp/doc/brenn...
2019-09-19 20:24:10
938
1
原创 bomb lab
phase 2int sscanf(const char *str, const char *format, …) 从字符串读取格式化输入,str是函数检索数据的源返回值:该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。function phase_2注意mov(一般操作数)和lea的区别,mov -0x4(%rbx),%eax等价于%eax = M...
2019-09-19 20:23:46
517
原创 华为云TaurusDB性能挑战赛note
不可重复读和幻读的区别如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializ...
2019-09-19 20:23:18
372
原创 Compiler implementation
mp1TODO1.找出bug1的原因2.完善lexer(注释部分)3.跑parsersource codebug & fixcool.flex中TYPEID的Action中未添加cool_yylval.symbol = stringtable.add_string(yytext);,解析bison_test_good.cl时发生段错误原因:StrTable stringt...
2019-09-19 20:21:14
361
原创 Kaleidoscope
LLVM Tutorialchapter 1Kaleidoscope语言介绍面向过程编译器支持JIT只有double数据类型用Kaleidoscope来计算Fibonacci数列# Compute the x'th fibonacci numberdef fib(x) if x &lt; 3 then 1 else fib(x-1) + fib(x-2)#...
2019-09-19 20:17:20
388
原创 flex & bison
flexyytext是匹配的字符串,yyleng是该字符串的长度scan的规则:If action code returns, scanning resumes on the next call to yylex(); if it doesn’t return, scanning resumes immediately.统计代码行数,字符数,数字字符数%{#include <...
2019-09-19 20:16:42
388
原创 pronet实现
update 1在TcpServer::readHandler中需要处理两种消息,一种是来自listenfd的EPOLLIN事件,需要创建新的channel,将TcpServer::readhandler注册为channel的回调函数(传递回调函数可传递正在调用的这个函数),然后调用Channel::enableReading(),将channel加入m_channelsList中,m_cha...
2019-09-19 20:15:43
720
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人