CMU 15-445 Project 2: B+Tree index 这个实验2真的是折磨死我了。 Tree Index索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。 hash table的时间复杂度是$O(1)$。在B+ Tree中,因为它是平衡的,所以它的时间复杂 2022-02-15 数据库 #CMU 15-445
CMU 15-445 Project 0 & 1 写在前面正如CMU 15-445的主讲教授所说,这门课并不会教你如何使用数据库去构建应用程序或网站,也不是教你如何去部署和管理数据库的课,这门课的核心课程是有关数据库管理系统的设计与实现。 PROJECT #0 - C++ PRIMER这个热身实验只是让我们把项目文件下载到本地,配置好相关的git,检验一下自己的C++能力,因此对其简要说明。 在这个项目中,您将实现三个类模板:Matrix、Row 2022-02-03 数据库 #CMU 15-445
MIT 6.S081 Lab 4: Traps 先来说说trap我们知道,用户态切换到内核态的有两种情况:一种是系统调用(syscall),另一种是异常(trap)或中断(interruption),在前面的实验中我们学习了系统调用。我们先来回忆一下在lab1中做过的sleep任务。在进入内核后,会调用sys_sleep函数。关于用户态转到内核态我们在lab2中已经讲过了。 trap机制在x86中我们常常说中断,但是在xv6中我们都是使用tra 2022-02-01 操作系统 #MIT 6.S081 Lab
MIT 6.S081 Lab 3: Page tables 当我第一次学习它,还是一个学生的时候,我想它是很直接的,能有多难,就是一个表要将虚拟地址映射到物理地址。或许有点复杂,但不是那么复杂。只有当用它编程时,我才知道虚拟内存是巧妙的,迷人的,非常强大。 在本次实验中,您将探索页表并修改它们以简化将数据从用户空间复制到内核空间的函数。在讲解实验之前,我们先要了解页表结构。 页表(pagetable)是做地址翻译与权限控制的:把 Virtual Add 2022-01-19 操作系统 #MIT 6.S081 Lab
Stanford CS144 Lab 4: TCP connection 在这一关要求实现一个TCPConnection类,基于TCP的有限状态机,将 sender 和 receiver 封装起来。也就是说,作为一个TCP客户端,我们有自己的sender和receiver,现在要用这个客户端与其他主机进行联系,所以我们要实现TCP的各种FSM。 在tests文件夹中,我们可以看到很多关于fsm的测试文件,这些就是基于不同的有限状态机的测试,因此,我们掌握了TCP的有限状 2022-01-13 计算机网络 #Stanford CS144 Lab
MIT 6.S081: xv6 实验参考书解析 第0章操作系统接口本书通过xv6操作系统来阐述操作系统的概念,它提供Unix操作系统中的基本接口,同时模仿Unix的内部设计。 xv6提供了传统的内核概念,即一个向其他运行的程序提供服务的特殊程序,每一个运行中的进程都有指令、数据、栈的内存空间。进程通过系统调用使用内核服务。系统调用会进入内核,让内核执行服务然后返回。所以进程总是在用户空间和内核空间之间交替运行。 我们看到上面加粗的那句话: 2022-01-10 操作系统 #MIT 6.S081 Lab
MIT 6.S081 Lab 2: System calls 在上一个实验中我们使用系统调用编写了一些utilities,在这个实验中我们需要为xv6增加一些系统调用,以便我们理解系统调用是如何工作的,并向我们展示xv6内核的一些内部结构。 我们先来说说什么是系统调用,操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务,主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。应用程序通过系统调用请求操作系统的服务。系统中的各种共享资 2022-01-10 操作系统 #MIT 6.S081 Lab
Go Goroutine 与 GMP 调度器 Goroutine 是由 Go runtime 管理的轻量级并发执行单元。它和操作系统线程不是一一对应关系:runtime 会把大量 goroutine 复用到少量线程上执行。goroutine 初始栈很小且可按需增长,因此单进程可以承载大量并发任务。 我在前面的文章MIT 6.S081: xv6 实验参考书解析中讲过进程/线程的切换方式,当切换的时候要从用户态->内核态->另一个进程 2021-12-17 Go语言 #Goroutine #Go runtime
Go 内存管理与 GC:从逃逸分析到三色标记 Go 的自动内存管理并不是“程序员完全不用关心内存”。更准确地说,Go runtime 接管了对象生命周期判断和堆内存回收,程序员仍然需要理解对象何时逃逸、哪些分配会给 GC 制造压力,以及写屏障为什么会影响吞吐。 手动内存管理的问题C/C++ 这类语言把内存释放责任交给程序员,灵活性很高,但错误也很隐蔽。最典型的问题有两个: 悬空指针:内存已经释放,但还有指针指向原来的地址。 内存泄漏:对象已 2021-12-16 Go语言 #Go runtime #内存管理
浮点数精度丢失:IEEE 754、舍入误差与工程实践 问题现象先看一个很常见的例子: float f = 0; for(int i=0;i<100;i++){ f+=0.1f; } printf("%f\n",f); 数学上 $0.1 \times 100 = 10$,但这段代码可能输出 10.000002。这不是 C 语言算错了,而是 0.1f 本身无法被二进制浮点数精确表示,循环累加又把每一步 2021-12-13 杂文 #浮点数