6.824 Lab2 Leader Election
Lab-2A Leader Election
Lab-2A Leader election
根据论文,任何服务器节点都处于三种状态之一:领导人、跟随者或者候选人。
Raft 把时间分割成任意长度的任期,任期使用连续的整数标记。每一段任期从一次选举开始,此时一个或多个候选人尝试成为领导者。如果一个候选人赢得选举,他就在接下来的任期内充当领导者的责任。在某些情况下,一次选举过程会造成选票的瓜分。在这种情况下,这一任期以没有领导人结束;一个新的任期(和一次新的选举)会很快重新开始。Raft 保证了在一个给定的任期内,最多只有一个领导者。
Raft 采用心跳机制来触发领导人选举,当服务器程序启动时,他们都是跟随者身份。一个服务器节点继续保持着跟随者状态只要他从领导人或者候选者获取有效的 RPC。 领导人周期性向所有跟随者发送心跳包(即不包含日志项内容的附加日志项 RPCs)来维持自己的权威。如果一个跟随者在一定时间内没有接收到消息,他就会认为系统中没有可用的领导人,从而重新发起选举。
跟随者会通过增加自己的任期号,并向即群众其他服务器节点发送请求投票。当一个候选人从大多数服务器节点获得 ...
6.824 MapReduce
Lab-1 MapReduce
之前的版本是用 goroutine 写的,写错了,重新梳理一下想法:
首先,Master 启动并初始化状态,然后等待 Worker 来请求,此时的 Master 并不知道有多少台 Worker 工作,因此他会维护一个 WorkerState 的数组,此时这个数组为空,当 Worker 来连接 Master 的时候,Master 在数组里为其加入状态,并为其添加 ID 号,并将其作为结果返回 Worker,此时 Worker 就知道自己的 ID 号了,在之后的请求中 Worker 将会带着这个 ID 号以便 Master 维护 Worker 的状态。
当 Worker 每次向 Master 请求并拿到 task 的时候,Worker 将会开启一个定时器来记录工作时间是否超时,倘若超时的话则说明 Worker 已经崩溃了,此时则将当前 Worker 运行的任务标记为 Idle, 当其他 Worker 请求的时候发送给其他 Worker。计时器计划采用 goroutine 来实现,为每一个 Worker 维护一个计时器,使用 channel 来发送消息,表示 ...
挪威的森林
这本书是我去南京旅游时候闲暇时读的,在乘坐高铁或者待在酒店里拿出来看一下,总共花了3天的时间看完。细细想来,我已经有一段时间没有安安静静地完整看完一本小说了,从前总将《挪威的森林》当做是一本严肃文学小说,因此在买了之后很长一段时间都没有看,但当我真正读完之后发觉《挪威的森林》虽然不是通俗的文学小说,但也不必将其当做严肃文学来看待,它更像是作者在中年时对于少年的回忆与反思。
村上在写完这本书后将其书称为“百分百的恋爱小说”,但据他自己所说,称其为恋爱小说其实仅仅是为了招徕顾客所用,事实上他所表达的是“百分百的现实小说”,因为在腰封上加上这个字眼不太合适,因此就选择了将恋爱小说作为醒目的标题来吸引眼球。但事实上,这本小说真的仅仅是讲的“恋爱故事”吗?依我来看倒不见得,与其将它视为是一本恋爱小说,倒不如将其看作是一部成长小说,恋爱并非是最重要的,而是活的人能够在死去的人身上得到什么,从而更加坚强地活下去。
在本书中,“性”是非常浓墨重彩书写的一部分,而书中的“性”与“爱”也是完全分离的,异性间发生性关系但互相之间却完全没有情感。这一点被很多人认为不应将《挪威的森林》看做是现实小说,因为将性与 ...
使用Rust实现FAT32文件系统
FAT文件系统知识概览
文件,其实就是数据。数据在计算机内以 0/1 表示,最基本的单位是bit(比特)。8 bit = 1 Byte,1024 Byte = 1 KB,1024 KB = 1 MB,如此如此。文件内容也是若干01串的组合。在读写文件的时候,我们会调用 kernel 中的函数 read()/write(),它们接受文件的描述符,然后读/写指定长度的数据。所有数据也都是 0/1 的形式,只不过我们在运用这些函数的时候,这些数据被转成了更加高级的表示,例如 char,int 或者其他类型。
磁盘是什么
现在的硬盘容量已经达到了TB的级别,它们的物理实现与原理又是怎样的呢?我就简单地带过一下,具体细节可以去 How a hard disk work?,里面很简洁地说明了他的工作原理。
磁盘最重要的就是扇面,扇面上面有一圈圈的磁道,这些磁道中储存着信息。如何进行读写呢?物理层面上,是通过用磁头改变磁道中每个存储单元的极性来实现的。
磁盘中的物理储存单位叫做sector(扇区),而文件系统中一个储存单位叫做 block (FAT 系统叫 cluster),每一个 cluste ...
xv6-rust锁机制
锁
自旋锁(Spinlock)
我们实现的自旋锁的定义如下:
1234567#[derive(Debug,Default)]pub struct Spinlock<T: ?Sized>{ locked:AtomicBool, name: &'static str, cpu_id: Cell<isize>, data:UnsafeCell<T>,}
locked由core::atmoic::AtomicBool来声明,这是一个原子布尔类型,即这是一个线程安全的值。而data的值则有UnsafeCell来包裹(wrap),这表明将有一些不安全的操作将作用在内部包裹的值中,使用该类型我们将没有办法获取内部变量的可变引用。我们可以通过.get()方法获取*mut T来对其内部进行操作。
对于一个锁变量,我们需要对其实现acquire()和release()方法:
1234567891011121314151617181920212223242526272829pub fn acquire(&a ...
Mini MIPS 32-bits CPU
Mini MIPS 32-bits CPU
32位单周期MIPS指令集CPU,仅仅支持10条指令:
lw, sw
lui, ori, addiu
addu, slt
beq, bne, j
具体实现可见:Mini-Mips32
部件构成
顶层模块:
CPU模块:
控制单元:
数据通路:
控制信号
指令
reg_write
reg_dst
alu_src
branch
mem_write
mem_to_reg
aluop
jump
select_imm
R-type
1
1
0
00
0
0
100
0
0
beq
0
x
0
01
0
x
010
0
0
bne
0
x
0
10
0
x
010
0
0
j
0
x
x
00
0
x
xxx
1
0
addiu
1
0
1
00
0
0
000
0
0
ori
1
0
1
00
0
0
011
0
0
lui
1
0
1
00
0
0
100
0
1
lw
1
0
1
00
0
1
000
0
0
sw
0
x
1
00
1
x
000
0
0
invalid_op
x ...
武侠已死
现在再去看武侠小说时,很少再有年少时的那种兴奋感了,这倒不是说我厌恶读武侠小说或者无法在读武侠小说的过程中取得快感了。只是因为我在读小说的过程中更加考虑小说的合理性。比如我会因为某些概率很小的时间在主角出现时接二连三的发生而感到很不适。有时为了逃避这种不适感我会选择掩卷不读。相反在我年少时我完全不会怀疑事件合理与否,看到主角武功大进、扬眉吐气、谈情说爱时(?)都会眉飞色舞。
在知乎看到了这样一篇文章,里面的观点很有意思,他说江南的《龙族》越写越差强人意,原因是因为江南的“艺术”已死,他还举了一个刘慈欣《赡养人类》中的一个例子:
一个贫穷的画家拒绝有钱人赠送的钞票,他永远待在一个破解的棚子里面,不管画作画的有多好,当别人想去买的时候,他总是漠不关心地说看着给吧,且每次仅抽取两张钞票,而他的理由是:
我的画都是描写贫穷与死亡的,如果一夜之间成了百万富翁,我的艺术就死了。 —《赡养人类》
而在文章的作者给出江南“艺术死亡”的分析是因为江南结婚之后,婚姻幸福、家庭美好、生活顺遂,再也无法遇到生活的不顺与求之不得的感情,他的笔下也就无法刻画出那种细腻的情感了。当他为celina学姐黯然 ...
520与伤春悲秋与杂感
每次到了这种日子,我总会有一些特殊的感觉。看着别人在QQ空间、朋友圈上形形色色的脱单、分手、秀恩爱之后,我心里总有一些不舒服的滋味。他们的经历好丰富,可是为什么我不能拥有这种经历呢?是啊,尽管在平时,我对这种无聊又琐碎的恋爱嗤之以鼻,认为这种事情会极大地消耗人的精力与耐力,使人会变成不自由的恋爱的附庸。可是,我又何尝不是在某一时刻,对恋爱之时的美好充满幻想呢?
二十年来,我从未尝试去谈过一场恋爱,仅有的也仅仅是无疾而终的暗恋,在无眠的夜里达到高潮而又随着时间的流逝而渐渐淡忘。这就像我曾经疯狂地迷恋上写小说一样,我一度迷恋上写小说但却因为学业被迫放弃,其中经历的思想斗争与辗转反侧十分痛苦,甚至让我一度到达了抑郁的程度。然而随着时间流逝,以前所苦苦追求的,到现在看来都像是笑话一样。那些暗恋过的过往,也云烟散去,那些我喜欢过的女孩子原来也是那么普通和拥有那么多的缺点,原来只是我的头昏脑热罢了。我不看甚至屏蔽了她们的朋友圈,这或许是由盛转衰的报复性行为吧,从西施到普通人还是有很大落差的。
在《霍乱时期的爱情》里记载了一段伟大的恋爱,延续了60多年的暗恋,这虽然很伟大和令人动容,但对我而言,这更 ...
xv6-rust中断机制
内核中断机制
中断代理
1234// delegate all interrupts and exceptions to supervisor mode. medeleg::write(0xffff); mideleg::write(0xffff); sie::write(sie::read() | sie::SIE::SEIE as usize | sie::SIE::STIE as usize | sie::SIE::SSIE as usize);
首先,我们在bootloader阶段进行中断代理,此时,我们仍处在M特权级,而我们的内核需要运行在S特权级。默认情况下,所有的陷阱中断都会在M态进行处理,因此我们需要将其代理到S态以便我们进行处理。
这里首先简要介绍一下medeleg(machine exception delegation register),mideleg(machine interrupt delegation register)以及sie(supervisor interrupt register)寄存器的作用:
medeleg和midel ...
xv6-rust关机机制
之前在做rCore的时候发现里面的panic()会直接调用sbi_call直接实现shutdown()。由于这次我自己写的OS自己写的bootloader没有使用SBI,于是想去自己去实现一个shutdown的功能。
由于我用的是QEMU来做硬件模拟,于是我去看了一下RustSBI关于shutdown的处理部分:
1234567891011121314151617181920212223242526pub fn handle_ecall(extension: usize, function: usize, param: [usize; 5]) -> SbiRet { match extension { EXTENSION_RFENCE => rfence::handle_ecall_rfence(function, param[0], param[1], param[2], param[3], param[4]), EXTENSION_TIMER => match () { #[cf ...