变量

变量的绑定与解构 手动设置可变性 在rust语言中可以手动设置变量的可变性。这是灵活性和安全性的结合。但是这样肯定会在编码的过程中付出更多的思考,但这也是权衡之后做出的选择。 变量绑定 在rust语言中变量和标识符之间是一种绑定关系,直接是所有权的改变。 简单来说任何一块有意义的内存都有所属,而且这个关系是唯一的。 这样就以为这变量和内存之间只能真诚的进行1v1了。 变量可变性 rust语言的变量在默认情况下是不可变的,但是可以通过mut关键字让变量变为可变的。 下面我们进行编码进行实践操作 fn main() { let x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); } 我们可以预想的到这样的代码会报错 由于我们对x发生了两次赋值。我们遵循报错给出的建议,使用mut对变量进行修饰。 这样由于显示的规定变量是否可以被修改,在多线程的编程过程中能让我们少死很多脑细胞,对程序员也是一种保护。 let mut x=5; println!("the value of x is:{}",x); x=6; println!("the value of x is:{}",x); 这次非常的顺利运行结果没有任何问题。 使用下划线忽略未使用的变量 在日常编程的过程中经常会发出“变量从未使用”的警告,如果此时你正在设计一个项目,你可能会拥有很多的未使用的变量。此时你可以使用下划线作为变量的开头,屏蔽警告。 fn main() { let _x = 5; let y = 10; } 这样的话就不会对未使用的变形进行警告了。 ...

February 3, 2025 · 1 min · Theme PaperMod

xv6-环境搭建

xv6 启动! 万事开头难! 这是我所用的开发环境,Kubuntu+VsCode,这样的环境对我来说是比较舒服的,也是比较好用的在实际使用的过程中我没感觉ubuntu和kubuntu有任何的区别,反正我也不在乎桌面,我只在终端里用。 用debian系的有一个好处就是软件生态真的很不错,可别是最新的,版本什么的直接用apt都能直接获得,虽然不想archwiki那样完善,但是Google一下基本上问题也都能解决。 一个很有意思的工具 bear 我相信有很多同学在用vscode看项目代码的时候会发现,全是红线,项目变得根本就不可读,无法跳转,更无法获得依赖关系,只能把vscode当一个能用鼠标的阉割版的vim用。我们可以获取编译的命令行,然后让vscode知道然后把这些报错给消掉 1.make -nB 当然可以手动获取编译选项,但是这样也是比较复杂的而且十分的低效 2.bear 善于使用工具,君子性非异也,善假于物也。用bear把编译过程包起来就能自动获取编译选项。 如何在vscode中debug ==官方非GUI界面== make qemu-gdb 之后系统会在本地启动一个gdb,另起一个终端使用gdb连接。 到这就说明gdb启动成功了,但是后面会有一个小小的坑。 Type “apropos word” to search for commands related to “word”. warning: File “/home/learn_code/xv6-labs-2024/.gdbinit” auto-loading has been declined by your `auto-load safe-path’ set to “$debugdir:$datadir/auto-load:/home/learn_code/xv6-riscv/.gdbinit”. To enable execution of this file add add-auto-load-safe-path /home/learn_code/xv6-labs-2024/.gdbinit line to your configuration file “/root/.config/gdb/gdbinit”. To completely disable this security protection add set auto-load safe-path / line to your configuration file “/root/.config/gdb/gdbinit”. ...

January 4, 2025 · 1 min · Theme PaperMod

CMU15-445总结

先随便写几个要点,等整个结束了再详细写。 动手之前先计划,详细周到考虑 多动手,多试错 多读源代码,多练习debug 英语好好学,英语太重要了。

February 22, 2024 · 1 min · Theme PaperMod

Bustub架构简单分析

写在前面 在这篇文章中我们先抛开SQL在bustub的中的历程,直接快进到最后开始执行的阶段,这篇文章只关注设计上的细节。 至于如何理顺这些细节在[[CMU15-445 Project3 - Query Execution]]文章中会有详细的介绍,这里就不再赘述。😃 架构总览 上图中catalog其实不是特别准确,按照我的理解应该是下面这种情况👇。通过一个table_id双向映射表的名字和实体table。 接下来就按照从上到下的顺序依次介绍各个部分的结构。 Catalog 下面这个图是是整个catalog关于table的。👇这里引出了TableInfo. Catalog中不仅仅包含table的信息还储存了index的信息。这里引出了IndexInfo,但是后边用的不是很多。 接下来看TableInfo的组成。(TableInfo的定义就在Catalog.h文件中) TableInfo name_:就是表的名字 table_: 是一个每个节点都是tablepage的双向链表 oid_: 顾名思义就是表的id Schema_:其实到现在我都没有很弄懂这个是干什么的东西,但是chat给出了答案。 什么是Schema 按照我的理解应该是一个类似于表头的包含各种配置信息的一个抽象集合。现在就看看源码。👇 在bustub中schema的信息似乎没有包含很多,就是对每一个列的数据类型约束进行了记录。以及对所有的列进行一个汇总,方便获取到每一个列。 ==Column== 实际上每个列的实现实体是Column,在这个实体中包含列名,数据类型,长度等基本信息。 ⚠️值得注意的是column对于varchar单独做了处理🙂,变长数组终究还是不一样啊。 TableHeap 实质上就是配合TablePage里面的信息构成的双向链表,我觉得这个设计真的非常的巧妙。只用了基本的pre_page_id 和next_page_id这两个变量就把双向链表给建立起来而且耦合度非常的低。 first_page_id_: 就是第一个pageid bufferpool:所有的page都需要从bufferpool中去取。 TablePage的结构 ok看到这里有疑问了? 那么多的信息都存在那里, 这继承的加上初始化的也不够啊。 答案在这里👇 通过偏移量直接在page的剩余空间里去定义各种变量。 ==通过InsertTuple()函数了解详细结构== 直接看源代码: if (tuple.size_ + 32 > BUSTUB_PAGE_SIZE) { // larger than one page size txn->SetState(TransactionState::ABORTED); return false; } auto cur_page = static_cast<TablePage *>(buffer_pool_manager_->FetchPage(first_page_id_)); if (cur_page == nullptr) { txn->SetState(TransactionState::ABORTED); return false; } 这主要是判断一些前置条件的合法性 为什么要用tuple的大小+32进行比较呢? 文末给出答案 在第一页中进行插入,如果没有足够的空间就开一个新页然后插进去 ⚠️需要注意的是,在离开第一页的时候仍然要持有写锁,因为还要写next_page_id变量. 💡跟随代码跳转到TablePage::InserTuple(). ...

February 21, 2024 · 2 min · Theme PaperMod

数据库事务

事务 ==Transaction== 在英文中事务用transaction表示,一般约定俗成的缩写为txn,所以在数据库的源代码中看到txn的话多半就是事务。 ==事务诞生的背景== 我们假设一个银行的场景,转账这一操作在外界看来是单一的操作,但是在数据库内部涉及到很多的操作,假如转账操作发生了失败,那么数据的不一致是不能被接受的。所以这一连串的操作可以被归为逻辑上的一个操作集。要么整体都成功要么都失败。 事务的概念 在chatgpt上问事务的概念他会这样子进行回答。 这也正是事务的关键。 我们回归课本,看课本上给出的定义 事务的隔离性级别 我个人觉得对于隔离性的的理解是非常重要的,在后续的算子的实现当中几乎都要考虑事务的隔离等级,根据不同的隔离等级去进行不同的操作。(我个人现在比较迷茫的是怎么能比较周全的考虑不同隔离等级所带来的影响。:)。看来是时候找个大佬请教一下了。🙃

February 20, 2024 · 1 min · Theme PaperMod