- 博客(92)
- 收藏
- 关注
原创 分布式数据一致性小结
分布式一致性问题包括数据一致性问题和事务一致性问题。在此仅关注数据一致性问题数据一致性问题是因为分布式系统下数据需要复制而导致的。而数据一致性模型就是规定在并发的进行数据复制时,每个节点应该看到的视图是怎样的。不同的数据一致性模型对于视图的规定不一样。假设:有两个进程p1和p2,各自发生的事件为p1_1、p1_2和p2_1、p2_2。如果不做任何限制,那么这四个事件在全局所有节点看来有4!种可能(由于网络波动或者任何原因,这些事件会完全的乱序由别的节点感知到)。而一致性模型。
2024-08-25 22:02:44 1094 5
原创 java 对象模型的个人理解
的主要作用是为java应用提供一个灵活的访问方法区内容的接口,而这通常用于反射或者通过。,我的理解是增加直接指向,每个对象需要多加一个成员,浪费内存,而获取。那为什么我不在创建实例对象的地方用。文件被加载后,其会在堆上同样的创建一个。,存储在方法区,这样子每个对象实例。的指针就可以访问自己的方法了。进行反射等操作是一个低频的操作)的接口,这样子反射才能获取到。指针的原因(实例对象不直接指向。但是需要注意的是,当一个。示例:(图是网上找的)等抽象(反射的基础)创建则是分开的两步,因此,堆上保存了每个。
2024-07-25 21:51:39 308
原创 java 中断机制的个人理解
java 的中断更多是一种通知协作机制只是简单的引入一个标记,不同的对象或者方法对该标记可以有不同的逻辑,抛出不同的异常,比较灵活。
2024-07-16 13:24:15 169
原创 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 750
原创 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 973
原创 6.s081 学习实验记录(十)file system
该实验需要我们增大xv6文件的最大大小,目前xv6的最大文件大小为 268个块,即。这是因为 xv6 包含12个直接块号 和 一个一级间接块号最大索引 12 + 256 = 268 个块。bigfile命令将创建xv6允许的最大文件,并报告其大小,未进行实验前结果如图:我们需要让xv6支持二级间接块,这样支持的索引块号最大为个,这样即可满足bigfile的测试要求。我们的任务:修改 bmap() 函数让其可以支持二重间接块号,实现符号链接(软链接)目标:实现系统调用,该系统调用在path。
2024-02-13 22:59:51 966
原创 6.s081 学习实验记录(九)lock & parallelism
这个程序会对xv6的内存分配器进行压力测试,该测试中三个进程会扩大缩小其地址空间(使用),而这会导致kmem.lock的竞争。该测试会在acquire中打印出为了获取锁而循环等待的次数,这可以作为锁竞争的粗略指标。在未进行任何优化前,打印如下图:这里竞争严重的问题原因是空闲内存由一个链表来维护,多个核情况下存在并发竞争,需要锁来保护。因此,一个简单的思想是每个核都维护一个空闲链表,每个核的空闲链表拥有自己专门的锁来保证并发安全。
2024-02-13 17:47:30 857
原创 6.s081 学习实验记录(七)Multithreading
切换到thread分支git fetchmake clean实现用户态线程的上下文切换机制,该实验已准备了和makefile添加了构建规则。但是缺少了创建用户态线程以及线程切换的代码。我们的任务就是实现一套机制,包含创建用户态线程以及保存/恢复线程上下文的功能。完成实验之后,执行make qemu,并运行uthread在中完善和函数在中完善目标是保证首次调度一个给定的用户态线程时,该线程需要在它的栈上执行通过创建线程时传递的函数。
2024-02-13 11:10:17 1012
原创 6.s081 学习实验记录(六)copy on write fork
在创建子进程的时候仅创建一个页表,而实际的内容(PTE)仍然指向父进程。当进程需要写某些内容的时候,发生页错误,在页错误的处理函数中为进程分配一个新的页面,并拷贝该页面的内容(不管是父进程还是子进程,谁先触发谁拷贝)。cow会使得物理页的回收变得麻烦,因为一个物理页可能被很多进程共享,只有最后一个引用该页面的进程释放该页面,该页面才能得到回收。系统调用创建的子进程会赋值父进程所有的用户态内存,如果父进程比较大,那么这个复制过程会很耗时,而且一般通过。因此,我们需要实现一个具有cow功能的。
2024-02-12 11:33:45 838
原创 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 1027
原创 6.s081 学习实验记录(四)page tables
许多操作系统通过共享一系列信息到用户态只读页面来加速某些系统调用的执行时间,因此我们需要实现该功能来加速系统调用getpid()每当进程创建的时候.,在USYSCALL(该VA定义在) 处映射一个只读的物理页,这个物理页的起始位置存储一个(同样定义在),初始该结构体存储当前进程的PID。当前实验,用户态已经准备好了一个应用pgtbltest,该应用使用ugetpid()函数获取进程pidugetpid()函数实现非常简单,就是从用户态的USYSCALL虚拟地址处读取usyscall中记录的pid。
2024-02-03 17:51:16 1087
原创 链接&装载(一)虚拟地址与物理地址
当我们写出一个程序,即便是最基本的 Hello World,都需要经过 预处理、编译、汇编、链接才能生成最终的可执行文件。预处理:预处理过程主要处理源代码中以 开始的预编译指令,主要处理如下:编译:将预处理好的文件经过一系列的词法分析、语法分析、语义分析产生汇编代码汇编:将汇编代码转为机器指令链接:将不同的机器指令文件链接形成一个可执行文件我们在学习过OS之后,都知道进程拥有自己的虚拟地址空间,需要经过页表映射到物理地址空间。那么,计算机在真正执行代码的时候,是如何将一个变量与一个逻辑地址相关联起来的呢?初
2022-12-04 18:49:58 1227
原创 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 252
原创 CSAPP Lab6:Malloc
实现一个动态内存分配器。由于隐式链表就是一块连续的内存区域,将其切分成不同的内存块,每个块首先开头都有一个header,末尾有一个footer。header和footer的内容是一样,都占据4B,前27bit记录该内存块的总长度,后三位表示该内存块是否分配出去。因此可以定义一些基本的宏,方便我们操作。结合书籍p599的内容,将其改为自己更好的理解其含义的宏。块的相关函数我们需要实现分配初始化堆、分配内存块、释放内存块、内存块重分配,除了这几个题目要求的函数,我们还需要实现一些必要的函数:mm_ini
2022-11-27 22:33:20 1232
原创 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 817
原创 CSAPP Lab4: Cache
在csim.c中实现一个缓存模拟器,以valgrind内存跟踪作为输入,模拟缓存内存的命中/未命中行为,并输出命中、未命中、缓存替换的总数,缓存替换算法使用LRU。使用./test-csim验证功能的正确性。
2022-11-13 17:05:16 955
原创 CSAPP学习记录 3.1---程序的机器级表示
文章目录一、汇编一、汇编C语言中低位转高位,先转大小再转类型有符号数使用带符号扩展,即高位补符号位无符号数使用零扩展,高位补0进行数据转换时,高位类型转地位类型(如 int 转 char),先加载高位到寄存器,然后读低位字节指针存储在寄存器中,解指针相当于使用寄存器间接寻址移位操作时特别的,操作数1是偏移量,操作数二是要移动的数,其中偏移量是立即数或者从寄存器%cl中取出的,%cl占8位,因此偏移量最大是255...
2022-05-18 23:55:04 358
原创 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 414
原创 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 620
原创 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 508
原创 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 4158
原创 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 860
原创 C++的一些小知识点
一、私有虚函数是否可被重写?可以,但是子类重写以后,如果使用父类指针指向一个子类对象,调用该方法会报错,除非是父类的成员函数或者友元才可以。如果是子类的指针,则会执行子类重写后的逻辑。这是因为 virtual 只是修饰该方法可以被子类重写,被virtual修饰的成员函数不论他们是private、protected还是 public 的,都会统一放置到虚函数表。子类会继承拥有相同偏移地址的虚函数表,子类在重写时可以为函数定义新的属性,不过这只是表示子类重写的该函数在子类中的访问属性为public,父类的
2022-04-02 21:37:33 654
原创 基于RDMA的RPC框架(三)框架设计
文章目录一、整体设计二、Agent模块设计三、详细设计一、整体设计考虑到框架的跨语言性,RPC借助了Service Mesh的思想,即主体为一个Proxy Agent作为Sidecar单独部署,同时提供一个特别轻量的SDK以进行流量劫持。类似于:etcd为注册中心,可以自己替换为自己的实现或者其他的开源实现。主体部分的Agent部分除了最普通的消费服务、注册服务、进行Rpc调用外同时还要负责服务治理,包括熔断、限流、服务降级等功能。通信协议:字段作用magic魔数
2021-11-01 16:16:37 2150 1
原创 基于RDMA的RPC框架(二)DISNI库的使用
文章目录一、简介二、类介绍三、基本流程四、示例示例一:ReadClient & ReadServerReadClientReadServer整体逻辑示例二:SendRecvClient & SendRecvServerSendRecvClient:SendRecvServer:一、简介RDMA是一种概念,在两个或者多个计算机进行通讯的时候使用DMA, 从一个主机的内存直接访问另一个主机的内存。DISNI是IBM开源的RDMA库,是 jVerbs库替代,提供了低级的 verbs API和
2021-10-28 17:01:55 1266
原创 基于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 1690
原创 长连接、连接复用、I/O复用、连接池
文章目录一、长链接二、连接复用三、I/O复用四、连接池一、长链接长连接是发送完一次tcp请求之后,连接不断开,可以继续发送。但是此时由于请求没有唯一识别的标记,所以请求只能串行发送,即一个请求只有接到响应之后才能继续发送。解决的是客户端与服务端频繁建立tcp连接带来的三次握手等开销问题。并没有提升服务器的并发能力,对客户端的响应速度也没有特大的提升(因为仅仅省去了几次连接的建立开销)。所以http1.1 采用了多链接的方式进一步提升,即每次建立多个长连接,并行去请求服务器。这是因为http请求
2021-08-14 16:33:56 2791
原创 云原生基础
文章目录一、容器技术一、容器技术docker相比cloud foundary等paas平台的优势,是方便了部署,将整个文件系统打包部署(容器镜像),使得不用更改任何配置,项目就可以在别的机器上运行。容器本身没有价值,容器编排才有价值对一个应用来说,操作系统才是它运行所需要的最完整的“依赖库”一个进程,可以选择加入到某个进程已有的namespace中,从而达到“进入”这个进程所在容器的目的,也就是docker exec的实现原理...
2021-08-09 22:34:22 538
原创 关于容器、K8s的一点认知
文章目录一、什么是容器二、什么是容器镜像三、什么是Volume四、什么是k8s、Pod五、k8s里的volume五、k8s的控制器模式一、什么是容器容器实质上是一个进程,只是这个进程通过linux提供的namespace机制进行了隔离,以及通过cgroups限定了这个进程可以占用的系统资源。而且容器进程就代表我们的应用本身,并没有一个专门的容器应用,容器只是帮我们在启动我们的进程之前,帮我们做了一些隔离和资源限制地设置。(容器是一个单进程的模型,即容器所代表的这个进程,运行的就是我们要跑的程序本身。)
2021-08-09 22:16:24 1328
原创 最长字串、子序列、回文字串、回文子序列
文章目录一、最长公共子序列二、最长公共子串三、最长回文子序列四、最长回文子串、五、最短回文子串六、最长重复子串七、最长公共前缀一、最长公共子序列题目描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。样例:text1 = “abcde”,text2 = “ace”,输出3思路:想象一个二维数组,找的是一条不连续的从左上到右下的最长路径因为是子序列,不要求连续,可以在比对两个串值是否相等给二维数组赋值的过程中顺
2021-07-28 10:31:33 553 1
原创 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 508 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 423 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 2153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人