MIT 6.824 Lab3 KV Raft (2)
partB代码地址:[partB],参考了很多这位大佬的实现:这里 基本的过程 本节的主要内容就是在kv中再加上snapshot的内容。不是特别的难,只要按部就班的使用lab2中完成的几个raft快照功能就好。在lab的实验中,要考虑的两个主要问题就是: 什么时候去创建一个快照 在快照中要保存的东西有哪些 第一个问题: 测试脚本在创建一个kvser…
MIT 6.824 Lab3 KV Raft (1)
在上一个lab中,将raft的基本的内容都完成了。接下来这节,就是以raft为基础,来实现一个kv的数据库。part A部分还是比较简单的,不需要处理快照。只需要处理在RPC调用中出现的问题,比如说rpc丢失,调用超时等情况。具体的就到后面的代码还会有说到。 在正式开始前,要了解论文中section 7和8的内容,不然会有些不知所以然。代码实现在:…
MIT 6.824 Lab2 Raft (4)
写在前面,part D快照这部分没有完全通过,看debug 日志十分痛苦,所以就用了别人的raft直接快进到 lab3。如果以后有时间了再重新来看吧,目前这篇只是想记录下,part D最基本的测试点怎么过,以及理解part D中多出来的几个函数调用之间的关系。 我自己的partD实现在这里,不过有bug。别人的代码就暂时不贴了,未经别人同意。 函数…
MIT 6.824 Lab2 Raft (3)
在part A和part B当中,基本的将raft的东西都完成了。part C主要做的就是持久化的内容,也就是要将raft的一些状态信息保存下来,另外part C的测试脚本会模拟极端混乱的网络情况,并且会运行1000次,所以要对前面的代码做一个优化,不然无法通过part C。总的来说,part C要增加的代码不多,主要是持久化raft状态,以及一些…
MIT 6.824 Lab2 Raft (2)
Log Replication 基本的leader选举还是比较简单的,对于日志备份相比来说就是困难很多了。涉及到一些选举的优化,日志丢失的处理,以及一些现实中会出现的情况,比如说很多log entry丢失,导致log entry不能commit,leader掉线的日志的处理等内容。 我的2B代码中只是提供了最简单的实现,还有一些优化的空间,在2B中…
MIT 6.824 Lab2 Raft (1)
本文主要解释6.824中 lab2 Raft的part A和Part B部分。源代码链接:2A的代码,2B的代码 在这里,我不想讲述论文中的细节问题,只关注于如何实现代码,以及在编码的过程中可能需要考虑到的一些情况。 Leader Selection part A就是解决最简单的选举问题。所以对于论文中的figure 2中很多变量都是暂时不需要的。…
动态链接和静态链接
如果有过Linux编程的经验,基本上每个人都会看到过.o文件,.a文件,.so文件。一直没有认真的去了解过这些文件的区别。这些文件通常会在库文件中看到。比如说C语言的标准库。在任何一台Linux机器中,使用可以使用whereis命令来查找各个库文件的路径。下面是我在WSL中一个例子: 为了保持文章的完整性,我将.o文件也放到这里来一起讲解。 .o文…
CPU Cache
CPU Cache 缓存在现代计算机系统中有很大的作用。无论是CPU内的L1,L2,L3缓存,还是TLB缓存,还是内存上的对于一些应用数据的缓存。可以说缓存无处不在,CPU内的缓存可以让在运行的时候不需要多次去内存中取数据。那么为什么缓存能够为计算机系统带来这么大的好处呢? 归根到底就是,因为局部性(locality): 时间上的局部性 时间上的局…
惊群(thundering herd)
惊群(thundering herd) 本篇只是对惊群做一个实验性的学习.了解下epoll的为什么会产生惊群现象,并且可以如何处理.不过我的描述都是比较浅显的,暂时没有深入到内核中去学习. wiki-惊群 维基百科上对于惊群的解释是: In computer science, the thundering herd problem occurs w…
IO Multiplexing (二)
在前面一篇文章中,简要地介绍了在几个io多路复用的api的使用以及它们各自的优缺点.然而,对于epoll还有不少东西.如epoll的两种触发模式--边沿触发(edge trigger)和水平触发(level trigger).此外,epoll往往和非阻塞io搭配在一起使用,那么为什么epoll要和非阻塞io搭配在一起呢,是否有更好的效率呢? 本文用…