自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux基础

一、计算机基础Linux 磁盘分区文件名:SATA硬盘为/dev/sd(a-p),虚拟磁盘为/dev/vd(a-p)磁盘分区方式:MBR和GPT,MBR只使用64B来管理磁盘,所以最多只能划分4个主分区或者延伸分区,延伸分区最多只有一个,可以通过延伸分区划分其他的逻辑分区。MBR的磁盘挂载之后如果分区,则具体的分区为/dev/sda1往后延伸,如果是延伸出来的虚拟分区则从sda5开始往后,因为1-4为主分区保留开启引导程序:BIOS和UEFI二、基本命令date:显示当前日期cal:显示

2024-03-23 14:49:34 692

原创 6.s081 学习实验记录(八)Networking

/TODO。

2024-02-17 20:56:41 492

原创 6.s081 学习实验记录(十一)mmap

切换到 mmap 分支。实现mmap以及munmap系统调用,mmapmmap的用处很多,当前实验仅关注内存映射文件的功能。addr参数表示映射的虚拟地址的起始,也可以指定为0,此时内核将会决定映射文件的起始虚拟地址,mmap成功后会返回该地址,失败则返回。length参数表示要映射的字节,可以与文件的长度不同prot参数表示内存是否映射为可读、可写、可读写、可执行等,可以假设prot为PROT_READ或者PROT_WRITE或者两者flags参数只能为MAP_SHARED或者。

2024-02-14 09:07:55 905

原创 6.s081 学习实验记录(十)file system

该实验需要我们增大xv6文件的最大大小,目前xv6的最大文件大小为 268个块,即。这是因为 xv6 包含12个直接块号 和 一个一级间接块号最大索引 12 + 256 = 268 个块。bigfile命令将创建xv6允许的最大文件,并报告其大小,未进行实验前结果如图:我们需要让xv6支持二级间接块,这样支持的索引块号最大为个,这样即可满足bigfile的测试要求。我们的任务:修改 bmap() 函数让其可以支持二重间接块号,实现符号链接(软链接)目标:实现系统调用,该系统调用在path。

2024-02-13 22:59:51 919

原创 6.s081 学习实验记录(九)lock & parallelism

这个程序会对xv6的内存分配器进行压力测试,该测试中三个进程会扩大缩小其地址空间(使用),而这会导致kmem.lock的竞争。该测试会在acquire中打印出为了获取锁而循环等待的次数,这可以作为锁竞争的粗略指标。在未进行任何优化前,打印如下图:这里竞争严重的问题原因是空闲内存由一个链表来维护,多个核情况下存在并发竞争,需要锁来保护。因此,一个简单的思想是每个核都维护一个空闲链表,每个核的空闲链表拥有自己专门的锁来保证并发安全。

2024-02-13 17:47:30 806

原创 6.s081 学习实验记录(七)Multithreading

切换到thread分支git fetchmake clean实现用户态线程的上下文切换机制,该实验已准备了和makefile添加了构建规则。但是缺少了创建用户态线程以及线程切换的代码。我们的任务就是实现一套机制,包含创建用户态线程以及保存/恢复线程上下文的功能。完成实验之后,执行make qemu,并运行uthread在中完善和函数在中完善目标是保证首次调度一个给定的用户态线程时,该线程需要在它的栈上执行通过创建线程时传递的函数。

2024-02-13 11:10:17 873

原创 6.s081 学习实验记录(六)copy on write fork

在创建子进程的时候仅创建一个页表,而实际的内容(PTE)仍然指向父进程。当进程需要写某些内容的时候,发生页错误,在页错误的处理函数中为进程分配一个新的页面,并拷贝该页面的内容(不管是父进程还是子进程,谁先触发谁拷贝)。cow会使得物理页的回收变得麻烦,因为一个物理页可能被很多进程共享,只有最后一个引用该页面的进程释放该页面,该页面才能得到回收。系统调用创建的子进程会赋值父进程所有的用户态内存,如果父进程比较大,那么这个复制过程会很耗时,而且一般通过。因此,我们需要实现一个具有cow功能的。

2024-02-12 11:33:45 777

原创 6.s081 学习实验记录(五)traps

git checkout traps,切换到traps分支文件在我们输入之后会被汇编为call.asmf、h、maincall.c 中的代码比较简单:return x+3;exit(0);当发生错误时,打印当前的调用栈。每个函数栈帧包含一个返回地址以及一个指向caller栈帧的(我理解就是caller的rsp)在中实现一个,在sys_sleep中插入对该函数的调用,然后运行bttest,该用户程序会调用sleep系统调用,此时应该打印堆栈bttest在qemu中执行完毕之后,新开一个窗口执行。

2024-02-05 23:05:02 967

原创 6.s081 学习实验记录(四)page tables

许多操作系统通过共享一系列信息到用户态只读页面来加速某些系统调用的执行时间,因此我们需要实现该功能来加速系统调用getpid()每当进程创建的时候.,在USYSCALL(该VA定义在) 处映射一个只读的物理页,这个物理页的起始位置存储一个(同样定义在),初始该结构体存储当前进程的PID。当前实验,用户态已经准备好了一个应用pgtbltest,该应用使用ugetpid()函数获取进程pidugetpid()函数实现非常简单,就是从用户态的USYSCALL虚拟地址处读取usyscall中记录的pid。

2024-02-03 17:51:16 960

原创 6.s081 学习实验记录(三)system calls

【代码】6.s081 学习实验记录(三)system calls。

2024-01-28 21:17:44 953

原创 6.s081 学习实验记录(二)xv6 and unix utilities

该实验主要用来熟悉xv6以及其系统调用。

2022-12-25 15:14:38 854 1

原创 6.s081 学习实验记录(一)环境准备

6.s081实验环境准备

2022-12-24 19:53:58 937

原创 链接&装载(一)虚拟地址与物理地址

当我们写出一个程序,即便是最基本的 Hello World,都需要经过 预处理、编译、汇编、链接才能生成最终的可执行文件。预处理:预处理过程主要处理源代码中以 开始的预编译指令,主要处理如下:编译:将预处理好的文件经过一系列的词法分析、语法分析、语义分析产生汇编代码汇编:将汇编代码转为机器指令链接:将不同的机器指令文件链接形成一个可执行文件我们在学习过OS之后,都知道进程拥有自己的虚拟地址空间,需要经过页表映射到物理地址空间。那么,计算机在真正执行代码的时候,是如何将一个变量与一个逻辑地址相关联起来的呢?初

2022-12-04 18:49:58 918

原创 CSAPP学习及实验记录

文章目录一、环境准备二、笔记三、实验3.1 Lab1:Data Lab3.2 Lab2:一、环境准备二、笔记2.1 数据表示与补码2.2三、实验3.1 Lab1:Data Lab3.2 Lab2:

2022-12-04 09:47:00 175

原创 CSAPP Lab6:Malloc

实现一个动态内存分配器。由于隐式链表就是一块连续的内存区域,将其切分成不同的内存块,每个块首先开头都有一个header,末尾有一个footer。header和footer的内容是一样,都占据4B,前27bit记录该内存块的总长度,后三位表示该内存块是否分配出去。因此可以定义一些基本的宏,方便我们操作。结合书籍p599的内容,将其改为自己更好的理解其含义的宏。块的相关函数我们需要实现分配初始化堆、分配内存块、释放内存块、内存块重分配,除了这几个题目要求的函数,我们还需要实现一些必要的函数:mm_ini

2022-11-27 22:33:20 772

原创 CSAPP Lab5:Shell

此实验目的是为了更加熟悉进程控制和信号。该实验内容是实现一个简单的Unix Shell程序,其支持job control。准备步骤及基础要求make,编译测试程序每次修改,都需要make clean,再重新make参考 tsh.c,掌握shell 程序的架构,实现其中的空函数eval:解析命令行参数的主函数,大约70行builtin_cmd:识别内置命令,包括quit、fg、bg、jobs,大约25行do_bgfg:实现内置命令,fg和bg,大约50行。

2022-11-20 12:34:29 733

原创 CSAPP Lab4: Cache

在csim.c中实现一个缓存模拟器,以valgrind内存跟踪作为输入,模拟缓存内存的命中/未命中行为,并输出命中、未命中、缓存替换的总数,缓存替换算法使用LRU。使用./test-csim验证功能的正确性。

2022-11-13 17:05:16 760

原创 CSAPP Lab3:Attack

文章目录一、准备二、ctarget三、rtarget一、准备二、ctarget三、rtarget

2022-06-04 22:51:27 448

原创 CSAPP学习记录 3.1---程序的机器级表示

文章目录一、汇编一、汇编C语言中低位转高位,先转大小再转类型有符号数使用带符号扩展,即高位补符号位无符号数使用零扩展,高位补0进行数据转换时,高位类型转地位类型(如 int 转 char),先加载高位到寄存器,然后读低位字节指针存储在寄存器中,解指针相当于使用寄存器间接寻址移位操作时特别的,操作数1是偏移量,操作数二是要移动的数,其中偏移量是立即数或者从寄存器%cl中取出的,%cl占8位,因此偏移量最大是255...

2022-05-18 23:55:04 219

原创 CSAPP Lab2:Bomb Lab

文章目录简介一、阶段一二、阶段二三、阶段三四、阶段四五、阶段五六、阶段六简介实验提供了一个可执行文件bomb,并且埋下了6个"炸弹"。需要通过反汇编查看bomb,找出6把钥匙字符串,破解6个炸弹。反汇编命令:objdump -d xxx一、阶段一第一阶段,炸弹所在函数为phase1,其反汇编代码为: 400ee0: 48 83 ec 08 sub $0x8,%rsp //创建栈帧,大小为8个字节 400ee4: be 00 24 40 00

2022-05-18 23:54:48 235

原创 CSAPP Lab1:Data Lab

文章目录一、实验要求二、实验2.1 bitXor:2.2 tmin2.3 tmax一、实验要求二、实验2.1 bitXor:只使用一元运算符 & 和 ~ 实现 ^:A^B为A的每一位与B中对应的每一位进行异或。因此需要 A & ~B得到A中为1,B中为0的位,然后并上 ~A & B,即B中为1,A中为0的位,然后进行 | 运算即可。即:(A&~B)|( ~A&B)由于没有 | 操作,因此需要用 & 和 ~ 来模拟 | 的效果。模拟|运算我们只需

2022-05-12 23:45:29 310

原创 CSAPP学习记录2.1---数据表示与补码

文章目录一、补码的含义二、数据表示一、补码的含义我们首先介绍'10'的概念,这里所指的‘10’并不表示我们日常生活中使用的十进制中'十'这个概念,而是所有进制中产生进位后的第一个数。例如:二进制:0,1,10四进制:0,1,2,3,10八进制:0,1,2,3,4,5,6,7,10十进制:0,1,2,3,4,5,6,7,8,9,10因此,我们在某个进制固定位数下计算的时候,最大的数就是‘10’的前一个数字所组成的数字,比如十进制下1000以内的加减法,则999是最大的数,八进制下1000以

2022-05-10 17:27:40 417

原创 brpc学习笔记(1)

文章目录一、简介及各个文档学习1.1 bvar1.2 bthread1.3 client1.4 server1.5 内置服务1.6 工具参考一、简介及各个文档学习brpc是一款RPC框架,基于brpc可以在一个端口上搭建支持多种协议的服务。1.1 bvarbvar是多线程环境下的计数器类库,方便统计和查看用户程序中的各类数值(例如qps、平均延时等等),使用thread_local减少了cache bouncing。brpc集成了该模块,因此需要在多线程环境中计数的场景可以第一时间考虑bvar,但

2022-04-26 14:19:02 3768

原创 go语言小知识点

文章目录Go基础1、panic与defer2、string3、slice4、map5、make & new6、nil7、go关键字8、闭包9、interface10、channelGo程序的执行流程Go程序调度M0 & G0创建协程的过程协程的生命周期序列化问题Go基础1、panic与deferdefer会采用头插形成一个链表,从而达成类似于栈的执行效果,即越后面的defer越先执行panic则是尾插,达成类似于链表的执行效果,即按先来先执行的逻辑来执行panic程序如果正常执行失

2022-04-16 00:05:25 538

原创 C++的一些小知识点

一、私有虚函数是否可被重写?可以,但是子类重写以后,如果使用父类指针指向一个子类对象,调用该方法会报错,除非是父类的成员函数或者友元才可以。如果是子类的指针,则会执行子类重写后的逻辑。这是因为 virtual 只是修饰该方法可以被子类重写,被virtual修饰的成员函数不论他们是private、protected还是 public 的,都会统一放置到虚函数表。子类会继承拥有相同偏移地址的虚函数表,子类在重写时可以为函数定义新的属性,不过这只是表示子类重写的该函数在子类中的访问属性为public,父类的

2022-04-02 21:37:33 300

原创 基于RDMA的RPC框架(三)框架设计

文章目录一、整体设计二、Agent模块设计三、详细设计一、整体设计考虑到框架的跨语言性,RPC借助了Service Mesh的思想,即主体为一个Proxy Agent作为Sidecar单独部署,同时提供一个特别轻量的SDK以进行流量劫持。类似于:etcd为注册中心,可以自己替换为自己的实现或者其他的开源实现。主体部分的Agent部分除了最普通的消费服务、注册服务、进行Rpc调用外同时还要负责服务治理,包括熔断、限流、服务降级等功能。通信协议:字段作用magic魔数

2021-11-01 16:16:37 1918 1

原创 基于RDMA的RPC框架(二)DISNI库的使用

文章目录一、简介二、类介绍三、基本流程四、示例示例一:ReadClient & ReadServerReadClientReadServer整体逻辑示例二:SendRecvClient & SendRecvServerSendRecvClient:SendRecvServer:一、简介RDMA是一种概念,在两个或者多个计算机进行通讯的时候使用DMA, 从一个主机的内存直接访问另一个主机的内存。DISNI是IBM开源的RDMA库,是 jVerbs库替代,提供了低级的 verbs API和

2021-10-28 17:01:55 987

原创 基于RDMA的RPC框架(一) 环境搭建

文章目录一、简介二、编译内核三、引用一、简介二、编译内核我使用的是 Ubantu 14.04,内核版本为:安装 4.9 版本的内核git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux下载成功:Cloning into ‘linux’…remote: Counting objects: 5548596, done.remote: Compressing ob

2021-09-09 19:18:48 1325

原创 自己动手写Docker

2021-09-05 11:22:45 413

原创 长连接、连接复用、I/O复用、连接池

文章目录一、长链接二、连接复用三、I/O复用四、连接池一、长链接长连接是发送完一次tcp请求之后,连接不断开,可以继续发送。但是此时由于请求没有唯一识别的标记,所以请求只能串行发送,即一个请求只有接到响应之后才能继续发送。解决的是客户端与服务端频繁建立tcp连接带来的三次握手等开销问题。并没有提升服务器的并发能力,对客户端的响应速度也没有特大的提升(因为仅仅省去了几次连接的建立开销)。所以http1.1 采用了多链接的方式进一步提升,即每次建立多个长连接,并行去请求服务器。这是因为http请求

2021-08-14 16:33:56 2314

原创 云原生基础

文章目录一、容器技术一、容器技术docker相比cloud foundary等paas平台的优势,是方便了部署,将整个文件系统打包部署(容器镜像),使得不用更改任何配置,项目就可以在别的机器上运行。容器本身没有价值,容器编排才有价值对一个应用来说,操作系统才是它运行所需要的最完整的“依赖库”一个进程,可以选择加入到某个进程已有的namespace中,从而达到“进入”这个进程所在容器的目的,也就是docker exec的实现原理...

2021-08-09 22:34:22 186

原创 关于容器、K8s的一点认知

文章目录一、什么是容器二、什么是容器镜像三、什么是Volume四、什么是k8s、Pod五、k8s里的volume五、k8s的控制器模式一、什么是容器容器实质上是一个进程,只是这个进程通过linux提供的namespace机制进行了隔离,以及通过cgroups限定了这个进程可以占用的系统资源。而且容器进程就代表我们的应用本身,并没有一个专门的容器应用,容器只是帮我们在启动我们的进程之前,帮我们做了一些隔离和资源限制地设置。(容器是一个单进程的模型,即容器所代表的这个进程,运行的就是我们要跑的程序本身。)

2021-08-09 22:16:24 1146

原创 最长字串、子序列、回文字串、回文子序列

文章目录一、最长公共子序列二、最长公共子串三、最长回文子序列四、最长回文子串、五、最短回文子串六、最长重复子串七、最长公共前缀一、最长公共子序列题目描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。样例:text1 = “abcde”,text2 = “ace”,输出3思路:想象一个二维数组,找的是一条不连续的从左上到右下的最长路径因为是子序列,不要求连续,可以在比对两个串值是否相等给二维数组赋值的过程中顺

2021-07-28 10:31:33 326

原创 K8s学习

文章目录一、基础概念1.1 Kubelet1.2 Kube proxy1.3 Container1.4 Pod二、构建K8s集群三、资源四、Pod声明周期五、pod控制器六、服务发现七、存储八、调度器九、集群安全机制十、HELM10.1 原理10.2 定义模板10.3 部署十一、运维11.1 k8s高可用11.2 Kubeadm源码修改一、基础概念1.1 Kubelet管理容器的声明周期1.2 Kube proxy负责写入服务映射访问规则1.3 Container1.4 Podpod分为自主

2021-07-22 19:33:56 182 1

原创 操作系统的一些问题

文章目录一、进程、线程、协程1.1 进程、线程、协程在OS层是如何实现的?1.2 内核态与用户态1.3 僵尸进程、孤儿进程、守护进程二、进程同步与通信2.1 进程通信的方式2.1.1 低级通信方式(同步与互斥)2.1.2 高级通信方式2.2 OS是如何实现的?三、内存管理3.1 虚拟内存与物理内存3.2 内存映射&零拷贝四、IO4.1 IO控制方式有哪些4.2 IO模型(BIO\NIO\AIO)select\poll\epollreactor\parator五、CPU5.1 内存屏障synchron

2021-06-26 21:20:25 187 1

原创 selector、epoll详解

文章目录基础一、Selector1.1 原理1.2 示例二、epoll2.1 原理2.2 示例2.3 总体流程三、Reactor基础首先,我们要明确同步、异步的层级。在这里讨论经常会出现各种同步、异步的概念让人迷惑,例如Netty用的是多路复用,而多路复用是同步非阻塞的I/O模型,但是Netty却宣称自己是异步的处理框架。其实这都是因为这里的同步、异步是针对不同线程,不同层级来说的。同步、异步在I/O模型中是针对I/O线程的,但是在后面的Reactor模型中是针对业务线程。所以Netty是一个异步框架

2021-05-15 23:29:39 1915

原创 关于Spring依赖注入的一些问题

文章目录一、例子总结:注意:二、原理参考:一、例子先说结论:@Autowired注解进行注入的时候,如果我们需要注入一个List或者Map这样的容器接口对象,会将泛型类型的所有元素找出来,组合成一个List或者Map,然后进行注入,如果没有泛型类型的Bean对象,则找List< T>的子类,例如ArrayList< T>或者LinkedList< T>,此时如果ArrayList< T>和LinkedList< T>都存在,则报错。@Au

2021-05-15 15:35:55 259 2

原创 Spring MVC(5)------@RequestMapping的映射处理过程

文章目录一、注册---MappingRegistry二、查找一、注册—MappingRegistry负责注册HandlerMethod对象,将@RequestMapping中的条件作为key,对应的方法封装对象作为value注册到RequestMappingHandlerMapping中。二、查找...

2021-05-07 21:14:07 76

原创 Spring MVC(4)------请求处理流程

文章目录一、MVC处理请求流程一、MVC处理请求流程

2021-04-08 13:31:58 94

原创 Spring MVC(3)------Tomcat加载DispatcherServlet及MVC启动流程

文章目录一、Tomcat如何将请求传递到SpringBoot中的MVC框架?一、Tomcat如何将请求传递到SpringBoot中的MVC框架?

2021-04-04 19:04:53 1049 1

空空如也

空空如也

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

TA关注的人

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