Bustub中索引的实现 Bustub中的索引机制在catalog类中,有这样一个成员index_names_,它记录了某个表所有的索引。 1std::unordered_map<std::string, std::unordered_map<std::string, index_oid_t>> index_names_; 我们先从函数CreateIndex出发,了解一下Bustub中索引的实现。 2024-03-05 数据库 > CMU_15445 #数据库 #CMU_15445
Bustub中表的设计 Bustub中的Table首先,我们先来看一下Bustub数据库中表的设计的结构图: 首先,Bustub 有一个 Catalog。Catalog 提供了一系列 API,例如 CreateTable()、GetTable() 等等。Catalog 维护了几张 hashmap,保存了 table id 和 table name 到 table info 的映射关系。table id 由 Catalog 2024-03-05 数据库 > CMU_15445 #数据库 #CMU_15445
Bustub中并发控制 可串行化在数据库系统中,事务是并发的,那么应该如何保证事务并发的正确性。比如说事务T1从A账户转账50到B账户,事务T2计算A账户和B账户的和,T1和T2是并发执行的,那么可能会存在事务T2计算的结果并不等于A+B的原本的和。 最容易理解的正确性保证就是串行调度,即不允许事务并发,所有事务排队,一个接着一个串行执行,其正确性是显然的,同时,执行效率低也是显然的。 为了提高数据库的执行效率,显然我们 2024-03-05 数据库 > CMU_15445 #数据库 #CMU_15445
页表 Page Tablexv6是采用了三级页表。每一个pte页表条目都是8字节(8*512 = 4096刚好是一个page的大小),其中低10位表示标志位,还有44位表示PPN,因为xv6中一个页的大小为4096个字节,也就是12位,所以整个页表可以表示的物理地址范围是[0, 2^56-1]。 我们先来看walk函数:这个函数给定一个虚拟地址va和一个pagetable,也就是第一级页表 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读
管道的实现 管道的实现1int pipe(int*); 在Linux中,一切皆文件,管道也是一种文件! 我们来看在xv6中,管道究竟是如何被实现的。我们直接来看sys_pipe函数。 我们首先获取到传进来的数组fdarray,这是数组在进程地址空间中虚拟地址,然后就调用pipealloc向向操作系统内核申请两个文件。 struct file是操作系统管理的,而文件描述符则是进程所有的。操作系统有一个fta 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读
文件系统的构建 xv6文件系统的构建我们再次回到如何通过qemu启动xv6操作系统的问题,qemu的命令是: 1qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio- 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读
xv6的启动 xv6启动(1)我们的xv6操作系统是运行在qemu模拟器上的,如果我想要知道究竟是如何启动这个操作系统的,那么我就要知道是如何启动qemu,并传入一些什么参数的。通过make -nB,有如下命令: 1qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读
Shell shell这部分的笔记主要来源于user/sh.c文件,这里面有很多代码的技巧,很值得学习。这部分主要弄清楚xv6中的shell是如何工作的。 一条完整的命令是如何开始运行的 是如何实现重定向的 ( > 符号) 是如何执行管道命令的 ( | 符号) 以及List命令,后台执行等。 首先sh程序会打开三次console 文件,使得0,1,2三个文件描述符都指向console 。然后就可 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读
Printf的实现 printf函数的实现在介绍printf 函数之前,我们先要来了解一下C语言里面是如何实现边长参数的。printf 正是通过变长参数来实现格式化的打印的。 C 可变参数声明方式为: 1int func (int arg1, ...); 其中... 表示可变参数列表。 请注意,函数 func() 最后一个参数写成省略号,即三个点号(**…**),省略号之前的那个参数是 int,代表了要传递的可变参 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读
Fork&&Execve的实现 Fork我们来看一下fork函数是如何实现的,fork是完全把父进程的状态机复制了一份。 首先,先获取当前进行系统调用的线程,然后再allocproc申请一个新的进程。在xv6操作系统中,进程的管理是一个proc数组。 12345678910int fork(void){ int i, pid; struct proc *np; struct proc *p = myproc(); 2024-02-29 操作系统 > xv6代码阅读 #操作系统 #xv6代码阅读