自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 TCP/IP详解卷二实现:第一章:概述

第一章概述主要讲述了一个执行发送消息和接受消息的UDP程序,内核经历了哪些事。其中发送和接受的数据都存储在mbuf这个数据结构。

2024-01-25 10:05:28 1203

原创 ceph之rados设计原理与实现第七章:在线数据恢复——Recovery和Backfill

由于每个写操作都需要产生和操作日志,所以处于效率考虑,必须定时对日志进行裁剪。由于PG保存的日志条目有限,按照能否依靠日志进行数据恢复,存在两种数据恢复方式,分别为Recovery和Backfill。Recovery指只需要修复副本(PG)上与权威日志不同步的那部分对象(即降级对象即可)。missing已经记录Backfill指以PG全体对象为目标的数据迁移过程。例如所在OSD离线太久而期间产生大量客户端发起的读写请求,或者Ceph自身出于数据重平衡需要而执行Backfill。

2024-01-23 15:33:51 1464

原创 ceph之rados设计原理与实现第六章:移动的对象载体——PG

Peering确保PG的所有对象副本在OSD间的一致性,但为了尽快恢复业务(Peering时无法接受客户端读写请求,所以Peering时间要尽可能短),Peering过程标记出降级的PG(比如OSD故障导致PG降级)即可算完成,之后这些故障的OSD上面的数据需要通过增量日志或者全量同步的方式恢复到由CRUSH或者PG Temp计算出的新OSD上,会触发Recovery或Backfill,数据恢复的过程就是Recovery或Backfill。这样就造成了Acting与Up不一致的Remapped状态。

2024-01-23 09:52:18 1382

原创 ceph之rados设计原理与实现第五章:高效的本地对象存储引擎Bluestore

由于FileStore底层仍然通过操作系统自带的本地文件系统管理磁盘,所以为了能够使用本地文件系统,所有针对RADOS的操作都需要转换成POSIX语义。所以引入了BlueStore直接管理文件。

2024-01-09 17:07:31 1288

原创 ceph之rados设计原理与实现第四章:存储的基石OSD

OSD本质上是凌驾于操作系统之上的进程,拥有cpu、内存、网络带宽等资源,用于实现对象存储,并兼容各种类型的文件系统。OSD之间利用集群网络互相监督,出现故障及时上报Monitor,由Monitor修改OSDMap后,再由OSD之间互相点对点传播最新OSDMap。

2024-01-04 14:25:47 841

原创 ceph之rados设计原理与实现第三章:集群的大脑monitor

Monitor和核心是OSD Monitor,利用分布式领域的一致性算法Paxos来维护集群唯一的一张表OSDMap。Monitor采用分担负荷的方式,一个集群可以有多个Monitor节点,任何时刻,任何客户端或者OSD都可以通过和任意一个Monitor进行交互,以索取或者请求更新集群表OSDMap。

2024-01-03 13:59:18 666

原创 ceph之rados设计原理与实现第二章:计算寻址之美与数据平衡之殇crush

因为针对上述参数的调整都是需要人工干预,都是多次微调实际非常麻烦,并且实际生产环境ceph扩容或者故障导致的pg自动迁移非常频繁,每次pg迁移后之前的调整都付之东流,因此自动化调整应运而生。"crushmap"包含了数据中心、机架、主机、osd等整个拓扑结构,除了osd都是虚拟的,并且记录了每个osd的weight和reweight,weight和reweight直接影响了随机哈希算法结果,但是由于crush是随机的,所以调整weight、reweight并不能精确控制pg在osd上的分布。

2023-12-29 15:12:29 589

原创 自制编程语言基于c语言实验记录之七:总结第八章之内建类及方法

1.Bool类及方法//返回核心类name的value结构static Value getCoreClassValue(ObjModule* objModule, const char* name) { int index = getIndexFromSymbolTable(&objModule->moduleVarName, name, strlen(name)); if (index == -1) { char id[MAX_ID_LEN] = {'\0'};

2023-11-26 16:02:16 675

原创 自制编程语言基于c语言实验记录之六:总结三四五六七之编译例子manager.sp

var bonusbonus = vbonus = bsalary {compileModule -> (循环执行)compileProgram -> compileClassDefinition具体参考博客类定义。

2023-11-14 20:40:08 370

原创 自制编程语言基于c语言实验记录之五:虚拟机

如果外部函数的生命周期结束了,内部函数还需要继续引用外部函数的局部变量,这时的局部变量被称为closed upvalue。函数的局部变量存在函数的frame指向的小运行时栈中,函数内部是可以定义函数的,如果内部函数引用了外部函数的局部变量被称为open upvalue,那么该内部函数对应的线程会保存upvalue队列(objThread->openUpvalues),其中每个upvalue的upvalue->localVarPtr指向外部函数运行时栈中的局部变量。暂时忽略PRIM_METHOD_BIND。

2023-11-08 17:25:38 428

原创 自制编程语言基于c语言实验记录之三:总结三四五六七章之编译标识符

compileClassDefinition -> compileClassBody ->compileMethod ->compileBody ->compileBlock->compileProgram->compileStatment->expression-> id.nud方法(由于后面是等于,所以canAssign为True)->matchToken(cu->curParser, TOKEN_ASSIGN)->expression计算"f"即将f加载入栈,

2023-09-05 22:48:30 356

原创 自制编程语言基于c语言实验记录之二:总结三四五六七章之编译类定义

/编译类定义= -1) { //目前只支持在模块作用域定义类");");//读入类名//生成类名,用于创建类//生成加载类名的指令if (matchToken(cu->curParser, TOKEN_LESS)) { //类继承//把父类名加载到栈顶} else { //默认加载object类为基类//创建类需要知道域的个数,目前类未定义完,因此域的个数未知,//因此先临时写为255,待类编译完成后再回填属性数。

2023-08-25 16:57:35 1198

原创 在Windows10上利用wsl安装docker、hadoop以及运行WordCount

wsl2 docker hadoop WordCount

2022-10-30 22:22:54 936

原创 操作系统真象还原实验记录之实验三十四:实现管道

操作系统真象还原实验记录之实验三十四:实现管道1.管道相关知识总结先说我们操作系统的管道实现:上述图中,管道缓冲区就是一页内存,这一页内存被我们当成了环形缓冲区结构,当这页管道被创建出来后,全局打开文件表中某个表项记录会着这个管道,其中fd_inode记录着这页地址,fd_flag=PIPE_FLAG表示管道,fd_pos记录着此管道打开数。此表项会被安装到进程的fd_table中,占用两个fd用于读写,pipefd[0]、pipefd[1]分别保存这两个fd。由此看来,管道是一页环形缓冲区

2022-02-09 18:41:00 638

原创 操作系统真象还原实验记录之实验三十三:实现系统调用wait和exit

操作系统真象还原实验记录之实验三十三:实现系统调用wait和exit1.wait、exit、孤儿进程、僵尸进程exit由子进程调用,表面上功能是使子进程结束运行并传递返回值给内核,本质上是内核在幕后回收该子进程除了pcb一页外的所有资源。wait由父进程调用,表面上功能是使父进程阻塞自己,直到子进程调用exit结束自己时,获取子进程的返回值,本质上是内核在幕后将子进程的返回值传递给父进程后会唤醒父进程,并且将子进程pcb回收。孤儿进程就是子进程生命周期尚未结束,尚未调用exit,但是父进程提前结束,

2022-02-09 08:52:14 1085

原创 操作系统真象还原实验记录之实验三十二:加载用户进程

操作系统真象还原实验记录之实验三十二:加载用户进程1.实现execexec.c之segment_load#include "exec.h"#include "thread.h" #include "stdio-kernel.h"#include "fs.h"#include "string.h"#include "global.h"#include "memory.h"extern void intr_exit(void);typedef uint32_t Elf32_Word

2022-02-08 10:53:50 588 7

原创 操作系统真象还原实验记录之实验三十一:实现简单的shell

操作系统真象还原实验记录之实验三十一:实现简单的shellWindows中,图形界面的资源管理器和命令行窗口都是交互接口,尽管这些交互接口名字及外观各异,但他们往往统称外壳程序shell的功能是获取用户的输入,分析输入的命令,判断内部命令还是外部命令,然后执行不同的命令策略shell.c之print_prompt函数#define MAX_ARG_NR 16 // 加上命令名外,最多支持15个参数#define cmd_len 128 //最大支持键入128个字符的命令行输入

2022-02-06 18:43:18 1469 6

原创 操作系统真象还原实验记录之实验三十:fork的实现,增加read、putchar、clear系统调用

操作系统真象还原实验记录之实验三十:fork的实现,增加read、putchar、clear系统调用1. fork原理与实现fork是叉子,作用是将父进程克隆给子进程,并返回父进程pid。父进程先调用fork系统调用中断进入内核态,完成了拷贝父进程给子进程,并将子进程设置为就绪态后,中断返回父进程pid,执行fork之后的代码,打印父进程pid,父进程结束。调度执行子进程,设置好thread_stack,利用switch_to进入intr_exit,利用中断返回,从而跳转到子进程并返回子进程pid,

2022-02-05 17:25:59 1004

原创 操作系统真象还原实验记录之实验二十九:实现删除目录、工作目录、文件属性

操作系统真象还原实验记录之实验二十九:1.删除目录删除目录的本质是不断递归删除空目录与删除文件dir.c之dir_is_empty、dir_remove/* 判断目录是否为空 */bool dir_is_empty(struct dir* dir) { struct inode* dir_inode = dir->inode; /* 若目录下只有.和..这两个目录项则目录为空 */ return (dir_inode->i_size == cur_part->s

2022-01-30 15:22:05 1085

原创 操作系统真象还原实验记录之实验二十八:实现文件删除、创建与遍历目录

操作系统真象还原实验记录之实验二十八:实现文件删除文件的删除首先是格局。删除一个已被打开的文件,那么它内存的inode,磁盘的inode,打开文件表表项,以及pcb的文件描述符数组对应项,均无意义,相应的磁盘里的inode位图,inode数组也要修改。它占用的若干扇区也要回收,扇区地址记录在inode直、间接索引,相应block位图也要修改。最后它的目录项需要清除inode.c的基本函数inode_release、inode_delete(回收inode)inode_release:函数功

2022-01-30 09:22:11 867

原创 操作系统真象还原实验记录之实验二十七:文件的打开、关闭、写、读、读写指针定位

操作系统真象还原实验记录之实验二十七:文件的打开与关闭1. 文件的打开与关闭fs.c之sys_open完善switch (flags & O_CREAT) { case O_CREAT: printk("creating file\n"); fd = file_create(searched_record.parent_dir, (strrchr(pathname, '/') + 1), flags); dir_close(searched_record.parent_

2022-01-29 09:47:27 2583

原创 操作系统真象还原实验记录之实验二十六:创建文件

操作系统真象还原实验记录之实验二十六:创建文件创建一个普通文件波及的东西首先明确一点,创建是在磁盘创建,内存中不需要有任何关于此文件的信息,因为并不是打开,所以关注的应该是磁盘里那些东西需要修改、同步。(1)文件需要分区分配inode结点,于是这就会波及inode_bitmap、inode_table数组里的某一项。(2)文件需要存储在具体的扇区,inode->i_sector存储着文件扇区地址,需要向block_bitmap申请。(3)文件必须有一个目录项,存储于某个目录,所以它的目录的

2022-01-28 14:27:26 433

原创 操作系统真象还原实验记录之实验二十五:文件操作相关基础函数

操作系统真象还原实验记录之实验二十五:文件操作相关基础函数

2022-01-27 10:28:20 609

原创 操作系统真象还原实验记录之实验二十四:创建并挂载文件系统

操作系统真象还原实验记录之实验二十四:文件系统MBR.S用于加载某个分区的的操作系统引导块,可以理解成loader.s,而loader.s负责加载根目录、操作系统。不同的分区可以不同的操作系统。你可以加载c盘的Linux操作系统,也可以加载d盘的windows操作系统。根目录文件地址规定死,记录在超级块中。目录文件里有目录项,一个目录项对应一个文件,它的inode指针就是指向该文件。这个文件可以是目录文件,里面

2022-01-19 17:43:49 1216

原创 操作系统真象还原实验记录之实验二十三:硬盘分区,并编写硬盘驱动程序

操作系统真象还原实验记录之实验二十三:编写硬盘驱动程序1.硬盘分区1.1 创建Seven80.img硬盘./bximage -mode=create -imgmode=flat -hd=80 -q Seven80.img1.2 查看bochs配置的硬盘数1.3 修改bochsrc.diskata0-slave: type=disk, path="Seven80.img", mode=flat, cylinders=162, heads=16,spt=63柱面数=162,磁头数=16,

2022-01-16 20:37:28 2444 2

原创 操作系统真象还原实验记录之实验二十二:完善堆内存管理

操作系统真象还原实验记录之实验二十二:完善堆内存管理之前的内存管理基于创建的一个内核内存池,一个用户内存池,以及它们对应的位图,构造了一些用于分配内存的函数,但是这些函数每次分配最少也是4KB即一个页框。为了实现更小的内存分配,实现sys_malloc,这次实验增加了一些数据结构和对应的函数。1.实验代码(实现sys_malloc)1.1 memory.h增/* 内存块 */struct mem_block { struct list_elem free_elem;};/* 内存块描

2021-07-07 20:05:44 301

原创 操作系统真象还原实验记录之实验二十一:实现printf

操作系统真象还原实验记录之实验二十一:实现printf实现write系统调用略2.实验代码2.1 stdio.c#include "stdio.h"#include "interrupt.h"#include "global.h"#include "string.h"#include "syscall.h"#include "print.h"#define va_start(ap, v) ap = (va_list)&v // 把ap指向第一个固定参数v#define va

2021-07-07 12:25:45 339

原创 操作系统真象还原实验记录之实验二十:实现系统调用

操作系统真象还原实验记录之实验二十:实现系统调用1.实验代码1.1 interrupt.c(增加)#define IDT_DESC_CNT 0x81 // 目前总共支持的中断数extern uint32_t syscall_handler(void);/*初始化中断描述符表*/static void idt_desc_init(void) { int i, lastindex = IDT_DESC_CNT - 1; for (i = 0; i < IDT_DESC

2021-07-07 10:18:41 444

原创 操作系统真象还原实验记录之实验十九:实现用户进程

操作系统真象还原实验记录之实验十九:实现用户进程1.相关基础知识1.1 特权级(书P229)cs寄存器的最后两位就是CPL,表示了cpu当前特权级。对于访问数据段(type含有X可执行属性)CPL和RPL<=DPL对于访问非一致性代码段(type不含有X可执行属性)只能平级,如果想执行跟高级的代码段,只能采用调用门,中断门,执行后CPL会改变成非一致性代码段的DPL。特权级从低到高,调用门、中断门从高到低,iret,retf访问一致性代码段(type字段C为1)数值上CPL&gt

2021-07-06 13:46:39 1002 1

原创 操作系统真象还原实验记录之实验十八:环形缓冲区

操作系统真象还原实验记录之实验十八:环形缓冲区1.实验代码1.1 ioqueue.h#ifndef __DEVICE_IOQUEUE_H#define __DEVICE_IOQUEUE_H#include "stdint.h"#include "thread.h"#include "sync.h"#define bufsize 64 /* 环形队列 */struct ioqueue {// 生产者消费者问题 struct lock lock; /* 生产者,缓冲区不满时就

2021-07-01 13:12:53 373

原创 操作系统真象还原实验记录之实验十七:实现键盘输入

操作系统真象还原实验记录之实验十七:实现键盘输入1.相关基础知识8042位于南桥芯片8048位于键盘,通过USB接口与8042通信键盘按下一个键,8048向8042发出了改建的通码,8042收到后转化成第一套键盘扫描码,然后存入自己的输出缓冲区,然后8042向中断代理发中断8042输出缓冲区寄存器端口号0x60,大小只有1字节。键盘中断处理程序用in指令通过端口0x60读出扫描码。其他见书。2.实验代码2.1 键盘驱动前的小准备2.1.1 kernel.S增加VECTOR 0x21,

2021-06-30 17:09:15 609

原创 操作系统真象还原实验记录之实验十六:用锁实现终端输出

操作系统真象还原实验记录之实验十六:用锁实现终端输出1.相关基础知识信号量 初值代表可用临界资源可用个数PV操作P:信号量为0就阻塞,为1就减一V:信号量+12.实验代码2.1关中断解决临界区的竞争put_char的工作原理1.获取光标值(1)通知光标寄存器(显卡上的端口)获取高8位(2)获取光标值的高8位(3)通知光标寄存器(显卡上的端口)获取低8位(4)获取光标值的低8位2.将光标值转化成字节地址,[gs:bx]访问显存写入字符以及属性3.更新光标的值(1)通知光标寄存器

2021-06-30 15:24:54 658

原创 操作系统真象还原实验记录之实验十五:多线程调度

操作系统真象还原实验记录之实验十五:多线程调度对应书P428 9.4节1.相关基础知识2.实验记录2.1 实验流程上次实验中,实现了一个线程的运行:具体是1.申请了一页物理页作为PCB2.init_thread填写了位于PCB所在物理页最低地址处的PCB结构体3.thread_create留出位于PCB所在物理页最高地址的中断栈、线程栈的位置,并填写了线程栈的各个成员,其中eip赋值成了函数kernel_thread地址。4.最后一句内联汇编将esp置为线程栈首地址,ret开启了线程,执行

2021-06-20 15:25:11 863

原创 # 操作系统真象还原实验记录之实验十四:实现内核线程

操作系统真象还原实验记录之实验十四:内存管理系统对应书P409 9.2节1.相关基础知识总结进程有资源即页表,进程的所有线程公用进程的页表2.实验代码2.1thread.h#ifndef __THREAD_THREAD_H#define __THREAD_THREAD_H#include "stdint.h"typedef void thread_func(void*);/* 进程或线程的状态 */enum task_status { TASK_RUNNING, TAS

2021-06-18 21:37:44 526

原创 操作系统真象还原实验记录之实验十三:内存管理系统

操作系统真象还原实验记录之实验十三对应书P374 8.3节1.相关基础知识总结2.实验代码2.1 实现字符串操作函数2.1.1 针对size个字节的操作函数以字节为单位就是以字符为单位,内存是一个字节对应一个内存地址编号的,比如一个char a 或者一个uint8_t a。a均代表八位比特的数值(或ASCII码)。 *a代表这个ASCII码的内存地址。++(*a)代表a的下一个内存地址编号/* 将dst_起始的size个字节置为value */void memset(void* dst_,

2021-06-18 17:24:42 963

原创 操作系统真象还原实验记录之实验十二:实现ASSERT

操作系统真象还原实验记录之实验十二:实现assert断言,通过makefile完成编译对应书P367 第8.2节1.相关基础知识见书2.实验代码2.1 interrupt.c增加的代码#define EFLAGS_IF 0x00000200 // eflags寄存器中的if位为1#define GET_EFLAGS(EFLAG_VAR) asm volatile("pushfl; popl %0" : "=g" (EFLAG_VAR))/* 开中断并返回开中断前的状态*

2021-05-26 18:06:55 684

原创 操作系统真象还原实验记录之实验十一:实现中断处理(二)

操作系统真象还原实验记录之实验十一:实现中断处理(二)书p335 7.6.2 改进中断处理程序,并调快时钟1.实验代码第一次修改对应书p335 7.6.2 改进中断处理程序这次是上一次实验的修改在cpu获得中断向量号后,会调用中断处理程序,上次实验中断处理程序kernel.s是汇编写的,这次对kernel.s进行修改,在中断处理程序里调用了c语言写的处理程序来执行中断处理1.1 interrupt.c#include "interrupt.h"#include "stdint.h"#in

2021-05-24 20:21:49 767 4

原创 操作系统真象还原实验记录之实验十:实现中断处理

操作系统真象还原实验记录之实验八:实现中断处理书P3191.相关基础知识1.1 中断处理过程忽视细节,整体过程如下1.外设发出中断信号给8259A芯片2.8259A芯片处理信号,并向CPU发送中断向量号3.CPU根据中断向量号,在IDT表中找到对应的中断门描述符,从获取中断门描述符获取对应的中断处理程序所在代码段的选择子和偏移地址,开始执行中断处理程序4.中断处理程序执行结束,CPU返回原程序1.2 8259A芯片对应上述第二步,在8259A芯片的某个引脚接收到外设的中断信号后,发生

2021-05-24 14:56:53 1620 1

原创 操作系统真象还原实验记录之实验九:实现打印字符串函数和整数函数

操作系统真象还原实验记录之实验八:实现打印字符串函数书P276本次实验就是上次实验打印字符的连续调用。1.相关基础知识c编辑器会把字符串结尾自动填上0,并为该字符串分配连续的内存,如果传递参数是字符串的话,那么传递的是字符串的内存首地址。2.实验代码2.1 print.h#ifndef __LIB_KERNEL_PRINT_H#define __LIB_KERNEL_PRINT_H#include "stdint.h"void put_char(uint8_t char_asci);v

2021-05-15 17:49:02 702

原创 操作系统真象还原实验记录之实验八:用c与汇编混合编程实现打印字符函数

操作系统真象还原实验记录之实验八:打印函数对应书P2742.实验代码2.1 print.sTI_GDT equ 0RPL0 equ 0SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0[bits 32]section .text;------------------------ put_char -----------------------------;功能描述:把栈中的1个字符写入光标所在处;-------

2021-05-15 00:36:03 904 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除