12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120...
存储结构本文章是对CMU-15445-2024fall的project1的一些总结。从开始编写到完成这个项目前后花了大概六天的时间。刚开始时,由于自己太菜,在写代码时十分痛苦,完全不知道从何下手。不过,还好自己没有放弃,在经历了六天的拷打后,总算是在gradescope上拿到了满分,不过我还没有对我的代码进行优化,所以性能不是很好,在排行榜上也只是100多名。后续,有时间的话可能会去优化吧。总之,这个项目对于我们理解数据库内核的存储结构还是很有帮助的,同时项目中也有对并发的控制。可以很好的锻炼我们并发编程的能力。其 实,该项目总体上不算很难,只要你理清楚它的架构,一切就迎刃而解了。
这是我理解的项目的架构。其中lru-k 负责在内存的帧满时,选出一个需要淘汰的页。dis-scheduler将产生的读写请求放入请求队列中。startwork 后台工作线程取出请求,并调用disk manager的接口。当请求完成时,通知调用者。
lru-k replacer这里,我用的是两个队列来实现lru-k算法。该算法比较简单,如果第一次知道该算法,推荐去网上搜一些教程。
disk_sch...
文本预处理下载数据集我这里使用的是Kaggle的环境。
1234567891011121314151617!pip install d2limport collectionsimport refrom d2l import torch as d2ld2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt','090b5e7e70c295757f55df93cb0a180b9691891a')# 下载数据def read_time_machine(): with open(d2l.download('time_machine'), 'r') as f: lines = f.readlines() return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]#转...
路由器的存储转发机制
🔧 问题设定:
一共有 P 个分组(packet)
每个分组大小为 L(比特)
链路速率为 R(比特/秒)
网络中有 N 条链路(意味着有 N+1 个节点,中间有 N 个转发节点)
✅ 1 个分组经过 N 条链路的时延:存储转发网络中,每一跳都要先完整接收到整个分组,再开始向下一个节点发送。
因此,一个分组通过一条链路的传输时延为:
1L / R
所以一个分组通过 N 条链路,总时延为:
1N × L / R
✅ P 个分组经过 N 条链路的时延:这是关键点。我们假设网络是流水线式传输的,也就是说:
当第一个分组发送到第 2 个节点时,第二个分组可以开始在第 1 条链路上传输;
所以不是简单的 P 倍时延!
结论:
P 个分组通过 N 条链路的总时延为:
1(N + P - 1) × (L / R)
🧠 为什么是 (N + P - 1) × (L / R)?
第一个分组需要 N 次传输,每次耗时 L/R,总耗时是 N·L/R;
后续每个分组在流水线中紧随其后,每个分组间的“间隔”为一跳的传输时...
创建socket套接字1.准备电话机,即创建一个socket套接字
123#include<sys/socket.h>int socket(int domain,int type,int protocol);//成功时返回文件描述符,失败时返回-1。
2.分配电话号码,即给套接字分配地址信息。
123#include<sys/socket.h>int bind(int sockfd,struct sockaddr *myaddr,socklen_t *addrlen);//成功时返回0,失败时返回-1
3.连接电话线等待来电,进行监听。
123#include<sys/socket.h>int listen(int sockfd,int backlog);//成功时返回0,失败时返回-1
4.拿起话筒进行对话
123#include<sys/socket.h>int accpet(int sockfd,struct sockaddr * addr,socklen_t *addrlen);//成功时返回文件描述符,失败时返回-1
一个基本的Makefile12hello: echo "hello world!"
使用make执行这个Makefile 结果是
12echo "hello world!"hello world!
创建一个hello文件后再make结果是
1make: 'hello' is up to date.
这是 make 的经典行为:
只要目标文件(hello)已经存在,并且所有依赖为最新,make 就不会重复执行。
但现在 hello 目标没有任何依赖,所以:
make 只看有没有 hello 这个文件
如果已经存在这个文件,并且没有任何依赖需要更新它
就会判断它是 up to date(已经是最新的)
Makefile语法一个Makefile由一系列rule组成,一个rule的基本结构为:
1234targets: prerequisites command command command
目标(targets)是文件名,使用空格分隔。通常每条规则只包含一个目标。
命令(commands)是一系列步骤,通常...
第一天本笔记参考github知名项目
将整数编译为可执行文件在这个提交中,主要的代码逻辑如下:
读取输入的整数:程序从命令行参数中获取一个整数值。
生成汇编代码:根据获取的整数值,生成对应的汇编代码。
调用汇编器和链接器:使用系统的汇编器(如 as)和链接器(如 ld)将生成的汇编代码转换为可执行文件。
具体步骤:
读取命令行参数:程序检查命令行参数,确保用户提供了一个整数值。
生成汇编代码:根据提供的整数值,生成一段简单的汇编代码,该代码在运行时会以该整数作为退出码。
写入汇编文件:将生成的汇编代码写入一个临时的汇编文件(如 tmp.s)。
调用汇编器和链接器:使用系统命令调用汇编器和链接器,将汇编文件转换为可执行文件。
清理临时文件:删除临时的汇编文件,保持工作目录的整洁。
1234567891011121314151617main.c#include<stdio.h>#include<stdlib.h>int main(int argc,char **argv){ if(argc != 2){ fpri...