1. Introduction 本章主要介绍进程相关的东西,不过是侧重于进程的执行环境的内容,main函数如何执行的,命令行参数是如何传递给程序的,以及程序的内存结构是什么样的,进程如何使用环境变量的。并且查看longjmp和setjmp函数和它们和栈之间的交互。 2. main Function 一个C语言程序从main函数开始执行,签名如下: …
1. Introduction 在本章我们介绍标准IO的内容,它们是由ISO C库定义的,并且已经在很多操作系统中被实现,不仅仅是UNIX系统。这里也就是说前面学的那些IO函数的可移动性并不好。标准IO库进行IO操作的时候都是带缓冲操作的,在前一章我们已经学过,代缓冲的IO具有更好的性能。 2. Streams and FILE Objects 第…
1. Introduction 前面一章主要介绍的都是如何操作文件,打开,读取,写入。本章是学习文件系统所提供的其他特性,以及UNIX系统是如何符号链接以及UNIX文件系统的结构。 2. Stat,fstat,fstatat and lstat Functions 这里的四个函数都是用于返回文件的相关信息的。 stat是返回文件名为pathname…
1. Introduction 首先从UNIX系统的几个IO文件的函数开始,即open,read,write,lseek,close.本章所描述的函数都是成为unbuffered IO,与之相对的是 standard IO,提供的是缓冲的IO操作,将会在后续章节描述.这里的unbuffered意思是每一个read,write都会调用内核的系统调用.…
正如前面所看到过的,每一个类定义了一个新的类型并且也定义了它相关的操作。在本章,我们学习的是类如何控制copy,assign,move,destroy。类通过copy constructor,move constructor , copy assignment operator,move-assignment operator,destructor…
partB代码地址:[partB],参考了很多这位大佬的实现:这里 基本的过程 本节的主要内容就是在kv中再加上snapshot的内容。不是特别的难,只要按部就班的使用lab2中完成的几个raft快照功能就好。在lab的实验中,要考虑的两个主要问题就是: 什么时候去创建一个快照 在快照中要保存的东西有哪些 第一个问题: 测试脚本在创建一个kvser…
在上一个lab中,将raft的基本的内容都完成了。接下来这节,就是以raft为基础,来实现一个kv的数据库。part A部分还是比较简单的,不需要处理快照。只需要处理在RPC调用中出现的问题,比如说rpc丢失,调用超时等情况。具体的就到后面的代码还会有说到。 在正式开始前,要了解论文中section 7和8的内容,不然会有些不知所以然。代码实现在:…
写在前面,part D快照这部分没有完全通过,看debug 日志十分痛苦,所以就用了别人的raft直接快进到 lab3。如果以后有时间了再重新来看吧,目前这篇只是想记录下,part D最基本的测试点怎么过,以及理解part D中多出来的几个函数调用之间的关系。 我自己的partD实现在这里,不过有bug。别人的代码就暂时不贴了,未经别人同意。 函数…
在part A和part B当中,基本的将raft的东西都完成了。part C主要做的就是持久化的内容,也就是要将raft的一些状态信息保存下来,另外part C的测试脚本会模拟极端混乱的网络情况,并且会运行1000次,所以要对前面的代码做一个优化,不然无法通过part C。总的来说,part C要增加的代码不多,主要是持久化raft状态,以及一些…
Log Replication 基本的leader选举还是比较简单的,对于日志备份相比来说就是困难很多了。涉及到一些选举的优化,日志丢失的处理,以及一些现实中会出现的情况,比如说很多log entry丢失,导致log entry不能commit,leader掉线的日志的处理等内容。 我的2B代码中只是提供了最简单的实现,还有一些优化的空间,在2B中…