02 2021 档案
摘要:GFS是Google在2003年提出的一个分布式文件存储系统,是Google三剑客之一。GFS主要适用于大文件的顺序读取以及追加写。 GFS由一个master和多个chunck server构成。master负责维护文件和块命名空间、文件到块的映射和每个块副本的位置,以及对块租约、chunck se
阅读全文
摘要:当我们对链表等数据结构进行并发读写时,通常会通过读写锁进行保护。但是,每一次对读写锁的操作都必须直接在内存中进行,不能够使用cache,这也就导致了读写锁的效率其实是比较低的。即使是在没有写者的情况下,每一次上读锁仍然需要访问内存。更严重的是如果多个CPU同时执行到CAS指令,每一次CAS指令的执行
阅读全文
摘要:MapReduce是Google在2004年发表的论文《MapReduce: Simplified Data Processing on Large Clusters》中提出的一个用于分布式的用于大规模数据处理的编程模型。 原理 MapReduce将数据的处理分成了两个步骤,Map和Reduce。M
阅读全文
摘要:在Kafka中,发送的消息是字节数组,因此就需要一个方法来将消息对象序列化为字节数组,在消费者端再反序列化为对象。最常用的序列化格式就是JSON了。虽然JSON对人类非常友好,但是对于机器来说,更容易进行序列化和反序列化的格式还是二进制的格式。 Protobuf(Protocol buffers)是
阅读全文
摘要:消息引擎(消息队列)是后端最常用的中间件,其主要功能有解耦、异步、削峰。而Kafka是Apache开发的最常用的消息引擎之一。 安装 直接到Kafka的官网下载二进制包然后解压就行了,Kafka需要Java的运行环境。首先启动Zookeeper作为Kafka的服务协调工具,之后启动Kafka就行了。
阅读全文
摘要:最后一个实验是要实现一个IP路由表,只需要实现添加路由表项和前缀匹配两个部分,不涉及路由协议。这个实验就很简单了,就20行代码就差不多了。 实验的关键在于如何存储路由表,最简单当然也是最慢的方法就是直接保存在一个数组中,然后一个个匹配过去,时间复杂度为O(n)。 一种方法是通过哈希表来进行改进,但哈
阅读全文
摘要:第五个实验主要的内容是ARP地址解析协议。ARP协议位于IP层的底部,用于将下一跳的IP地址转换成MAC地址传给数据链路层。在主机中一般会有一个ARP缓存表,用于缓存最近的IP和MAC地址对应信息。ARP数据包是封装在以太网帧当中发送。 ARP请求的源IP地址和源MAC地址设置为本机的IP和MAC地
阅读全文
摘要:Lab1-4 分别是完成一个流重组器,TCP接收端,TCP发送端,TCP连接四个部分,将四个部分组合在一起就是一个完整的TCP端了。之后经过包装就可以进行TCP的接收和发送了。 代码全部在github上了。 Lab1 流重组器 这一个实验是要实现一个流重组器,传入数据的片段以及起始位置,之后对其进行
阅读全文
摘要:CS144的实验就是要实现一个用户态TCP协议,对于提升C++的水平以及更加深入学习计算机网络还是有很大帮助的。 第一个Lab是环境配置和热身,环境按照文档里的配置就行了,前面两个小实验就是按照步骤来的,就不细讲了。 Writing webget 这一个实验是要用他封装好的socket库写一个简单的
阅读全文
摘要:最后一个实验了,代码在Github上。 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数。不过看以前的实验好像还要实现上层socket相关的代码,今年就只有网卡驱动了。 虽然实验文档里面给了一本400多页的网卡文档,但其实也不需要怎么读这本厚厚的文档,实
阅读全文
摘要:代码在Github上。 这一个实验是要实现最基础的mmap功能。mmap即内存映射文件,将一个文件直接映射到内存当中,之后对文件的读写就可以直接通过对内存进行读写来进行,而对文件的同步则由操作系统来负责完成。使用mmap可以避免对文件大量read和write操作带来的内核缓冲区和用户缓冲区之间的频繁
阅读全文
摘要:代码在github上。 这次实验是要对文件系统修改,使其支持更大的文件以及符号链接,实验本身并不是很复杂。但文件系统可以说是XV6中最复杂的部分,整个文件系统包括了七层:文件描述符,路径名,目录,inode,日志,缓冲区,磁盘。 文件描述符类似于Linux,将文件、管道、设备、套接字等都抽象为文件描
阅读全文
摘要:几乎所有操作系统都会运行数量远多于CPU数量的进程,因此需要对CPU进行分时共享。理想情况下这种共享应该是对用户进程透明的。一个常用的方法是通过多路复用将进程分配到硬件CPU上,使每个进程有其自己的虚拟CPU。 多路复用 XV6在两种情况下会对CPU的进程进程切换从而实现复用:一种是XV6的slee
阅读全文
摘要:代码在github上 这一次实验是要对XV6内部的锁进行优化,减少锁争用,提高系统的性能。 Memory allocator (moderate) 第一个实验是对XV6内核的内存页面分配器进行改进,改进的策略在前面的章节中也讲过了。XV6原本是使用一个空闲页面链表,但是这样就会导致不同CPU上的ka
阅读全文
摘要:代码放在github上。 这一次实验感觉挺简单的,特别是后面两个小实验。主要就是对多线程和锁进行一个学习。 Uthread: switching between threads 这一个实验是要实现一个简单的用户级线程,写完之后发现原来用户级线程的简单实现也没有想象的那么复杂。 首先定义一个conte
阅读全文
摘要:在包括XV6的绝大部分操作系统都是多个任务交错执行的。交错的一个原因是多核硬件:多核计算机的多个CPU核心独立执行计算,如XV6的RISC-V处理器。多个CPU核心共享物理内存,XV6利用这种共享来维护所有核心都会读写的数据结构。而这种共享会导致一个CPU在读取某数据结构时,可能有另一个CPU正在对
阅读全文

浙公网安备 33010602011771号