braft - lease机制 braft中和lease相关的定义:1234567891011121314151617181920212223// State of a lease. Following is a typical lease state change diagram:// // event: become leader become followe...
CPP - 清空vector vector中一般是三个指针:beginendcapacitybegin ~ capacity为vector的容量,决定了vector在堆上所占的内存大小。begin ~ end为vector所拥有元素数量。end指针通过 resize 改变,capacity指针通过 reserve 改变。但是其中要注意的是,resize在缩小时,不会改变capacity指针。如果要减小v...
./remake 算法 - 二叉树的最近公共祖先(LCA) 问题描述lca问题的描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”对于如下二叉树:节点0和1的lca为1(一个节点也可以是它自己的祖先)节点7和6的lca为5(深度最深)思路与实...
mit6.s081 - xv6系统调用过程(用户态陷入内核) 核心问题:xv6是如何执行系统调用的?系统调用时用户进入内核的一种手段(一般是受限直接执行(Limited Direct Execution, LDE)机制)。如下图所示:有三种事件会导致CPU搁置普通指令的执行,强制将控制权转移给处理该事件的特殊代码。系统调用:当用户程序执行ecall指令要求内核为其做某事时。异常:一条指令(用户或内核)做了一些非法的事情,如除以零或使用无效的虚拟地...
mit6.s081 - xv6建立虚拟地址映射 核心问题:xv6虚拟地址空间到物理地址空间的映射是由页表实现的,那页表中的内容是怎么写入的?也即:xv6虚拟地址空间到物理地址空间的具体映射关系是如何建立的?内核地址空间在xv6的实现上,所有的进程的内核地址空间是共享的(也即,内核线程的页表都是一个)。每个CPU初始化后采用同一个页表:1234567891011121314151617181920212223// start() jum...
mit6.s081 - lab3 page tables 本文为本人完成6.s081 2021fall时的一些记录,仅作为备忘录使用。代码仓库地址:代码task 1: Speed up system calls (easy)题意描述When each process is created, map one read-only page at USYSCALL (a VA defined in memlayout.h). At the start...
mit6.s081 - xv6虚拟地址转换 核心问题:xv6如何实现虚拟地址转换的?即给定一个虚拟地址,xv6如何读写到真实的物理内存上。为什么需要虚拟内存?实现操作系统的隔离性,使各个进程之间互不干扰,自以为独占内存。地址空间一个进程的地址空间包含运行的程序的所有内存状态。虚拟内存系统负责为程序提供一个巨大的、稀疏的、私有的地址空间的假象,其中保存了程序的所有指令和数据。操作系统在专门硬件的帮助下,通过每一个虚拟内存的索引...
mit6.s081 - xv6物理内存分配器 核心问题:xv6是如何管理物理内存的?RISV-V中的物理地址、虚拟地址RISC-V 指令(用户和内核)操作的是虚拟地址。物理内存(RAM)是用物理地址来做索引的。RISC-V的页表硬件(MMU)通过将每个虚拟地址映射到一个物理地址将这两种地址联系起来(地址映射)。虚拟地址空间和物理地址空间的映射关系如下图:从右边的物理地址空间格局可以看出其主要分为以 0x80000000 为界限...
mit6.s081 - xv6启动过程 核心问题:xv6实验中,执行 make qemu CPUS=1 后 xv6是如何启动运行的?RISC-V的3种工作模式在了解启动流程之前,首先需要明确RISC-V的3种工作模式M-mode (Machine Mode)S-mode (Supervisor Mode)U-mode (User Mode)M-mode (Machine Mode)M-mode是最底层的模式,也是每一个...
mit6.s081 - lab2 system calls 本文为本人完成6.s081 2021fall时的一些记录,仅作为备忘录使用。代码仓库地址:代码task 1: System call tracing (moderate)题意描述In this assignment you will add a system call tracing feature that may help you when debugging later labs....
操作系统 - 受限直接执行(Limited Direct Execution, LDE) 概述虚拟化 CPU的概念:操作系统需要以某种方式让许多任务共享物理CPU,让它们看起来像是同时运行。在本节需要解决的关键问题是:如何高效、可控地虚拟化 CPU?解决方法:采用受限直接执行(Limited Direct Execution, LDE)机制直接执行的概念直接执行:直接在CPU上运行程序即可。使用正常的调用(call)跳转到用户程序的main(),用户程序结束后返回内核。直接...
操作系统 - PETERSON算法 Peterson算法概述Peterson算法是一种实现进程/线程间互斥访问临界区的算法。(线程间共享内存地址空间,进程需要采用共享内存实现)关键术语:临界区:一段代码,进程/线程在这段代码中进程将访问共享资源,当另外一个进程已在这段代码运行时,其他进程就不能在这段代码中运行。互斥:当一个进程/线程在临界区访问共享资源时,其他进程/线程不能进入临界区访问任何其他共享资源的情形。wiki定...
操作系统 - I/O设备 I/O设备综述I/O设备定义I/O设备是硬件中由人(或其他系统)使用与计算机进行通信的部件。例如,键盘或鼠标是计算机的输入设备,而监控器和打印机是输出设备。计算机之间的通信设备(如电信调制解调器和网卡)通常运行输入和输出操作。操作系统需要控制计算机的所有I/O设备。I/O设备划分根据信息交换的单位可讲I/O设备可分为块设备(block device)和字符设备(character devic...
操作系统 - 操作系统的整体结构 操作系统的大致内容的思维导图:操作系统在传统意义上都会有以下内容:进程与线程内存管理文件系统I/O死锁操作系统导论将操作系统视作三个简单的部分:虚拟化、并发、持久化。我认为是比较合理的,结合操作系统导论和现代操作系统的内容也能更好的学习操作系统。reference[1] 操作系统导论[2] 现代操作系统...
操作系统 - 进程 进程综述定义进程是正在执行程序的实例,包括程序计数器、寄存器和变量的当前值。进程不只是程序代码,程序代码称为文本段(代码段),还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示。此外,进程还包括进程堆栈段(临时数据、函数参数、局部变量、地址)和数据段(包括全局变量。还可能包括堆(heap),是在进程运行期间动态分配内存。程序和进程的关系:程序是被动实体,进程是活动实体(进程有...
操作系统 - 进程调度 进程调度概述定义进程存在的核心目的:虚拟化CPU,从而支持多个进程在少量的物理CPU上运行(每个进程以为它独享一个CPU)。进程调度就是选择一个可用的进程(可能从多个可用进程集合中选择)到CPU上执行。单处理器系统从来不会有超过一个进程在运行。如果有多个进程,那么余下的则需要等待CPU空闲并重新调度。调度队列进程进入系统时被加入到作业队列中,该队列包含系统中所有进程。驻留在内存中等待运行的...
操作系统 - 操作系统定义与历史 什么是操作系统操作系统是在硬件和应用之间的软件层“操作系统是管理硬件资源、控制程序运行、改善人机界面 和为应用软件提供支持的一种系统软件。” [计算机百科全书(第2版)]操作系统 = 管理 + 服务操作系统为应用提供的一些服务:为应用提供计算资源的抽象CPU:进程/线程,数量不受物理CPU的限制内存:虚拟内存,大小不受物理内存的限制I/O设备:将各种设备统一抽象为文件,提供...
操作系统 - 操作系统内核架构 操作系统设计原则操作系统的重要设计原则:策略与机制的分离策略(Policy):要做什么 —— 相对动态机制(Mechanism):怎么做 —— 相对静态 操作系统可仅通过调整策略来适应不同应用的需求例子策略机制登录什么用户、以什么权限登录输入处理、策略文件管理、桌面启动加载调度调度算法:Round-robin、 Earliest Deadline Firs...
操作系统 - 系统调用 系统调用概述系统调用:运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。系统调用需要了解的点:系统调用将处理器从用户态切换到核心态,以便 CPU 访问受到保护的内核内存。每个系统调用都由一个唯一的数字来标识。系统调用可以有一套参数,用于用户空间与内核空间之间相互传递信息。(x86-64中最多使用寄存器传递6个参数,参考资料如...
操作系统 - 多级反馈队列 概述1962年,Corbato首次提出多级反馈队列,应用于兼容时分共享系统(CTSS)。Corbato因在CTSS中的贡献和后来在Multics中的贡献,获得了ACM颁发的图灵奖(Turing Award)。该调度程序经过多年的一系列优化,出现在许多现代操作系统中。多级反馈队列需要解决两方面的问题:优化周转时间(T 周转时间= T 完成时间−T 到达时间 )降低响应时间(T 响应时间= T...