Linux系统与内核分布式系统
GMP模型 ReferenceGMP 并发调度器深度解析之手撸一个高性能 goroutine pool - Strike Freedom[Golang三关-典藏版] Golang 调度器 GMP 原理与调度全分析 | Go 技术论坛Golang深入理解GPM模型\_哔哩哔哩\_bilibiliGolang 深入理解GMP\_郭传志的技术博客\_51CTO博客GMP模型 — 深入Go语言之旅深入理解 Go | 调度:GMP 模型(第三部分) | ∞基本概念Go的GMP是指它的调度器(scheduler)使用的一种并发模型,也称为M:N调度器。在这种模型中,M个goroutine(Go协程)被映射到N个操作系统线程(OS threads)上,其中M和N都是可配置的。GMP的工作原理如下:G:代表Goroutine,是Go语言中轻量级的执行单元;M:代表Machine,是Go语言中的执行线程,负责执行Goroutine;P:代表Processor,是Go语言中的处理器,负责调度Goroutine。在GMP模型中,所有的Goroutine都被放在一个全局的队列中。当一个M空闲时,它会从队列中取
自我介绍未来的职业规划是什么?你的优势和劣势是什么?项目里遇到的最大技术困难是什么,如何解决的?面试注意事项。
适用sql查询方法的kv数据库及其创建方法.pdf三篇文章了解 TiDB 技术内幕 - 说计算 | PingCAP如何将SQL数据映射到KV数据库weixin33804582的博客-CSDN博客关系模型到 Key-Value 模型的映射有多种方式可以将关系模型映射到键值存储模型,以下是其中的几种:使用主键作为键:关系模型中每个表格都有一个主键,可以将主键作为键,将包含该行数据的JSON对象作为值存储到键值存储中。使用复合键:如果关系模型中的表格中没有唯一的主键,可以使用多个列组合成一个复合键作为键,将包含该行数据的JSON对象作为值存储到键值存储中。使用索引作为键:在关系模型中,我们通常会创建索引来提高查询性能。可以将索引作为键,将包含该行数据的JSON对象作为值存储到键值存储中。使用冗余数据:在关系模型中,我们可以将某些数据冗余存储以提高查询性能。可以将这些冗余数据作为键,将包含该行数据的JSON对象作为值存储到键值存储中。以上这些方式各有优缺点,需要根据具体情况选择合适的方式进行映射。需要注意的是,在使用这些方式进行映射时,需要确保数据的一致性和完整性。关于表的元数据,可以使用一个
LSM树详解 - 知乎LSM Tree原理详解 - 简书(13条消息) 最容易理解的LSM树--以示例讲解合并查找过程\_lsm树示例\_土豆西瓜大芝麻的博客-CSDN博客
leveldb笔记之20:写入与读取流程 - Ying
LevelDB存储6:适者生存 —— Cache - 知乎LevelDB LRUCache浅谈 - 掘金LevelDB 源码解析之 Cache 缓存 - 掘金问题集数据什么时候过期?参考源码include/leveldb/cache.h: 定义Cache接口 util/cache.cc: 实现LRU缓存 table/table.cc: 读取Data Block时使用缓存 db/table_cache.cc:实现一个Table结构的缓存原理shardedLRUCache定义了多个LRUCache,用来实现分段式锁。每个LRUCache其实就是hashtable和hashnode。而in_use\_和lru\_只是从另外二个维度将hashnode使用双向链表连接起来。最新插入的数据排在链表尾部。就是将hashtable中的node分成了两组:in_use\_:正在被使用的放一组,通过双向链表把他们连接起来lru\_:没有被使用的node,最新的在最前面。所以每次淘汰从最后取。如果in_use\_使用结束的node放入lru,lru中被使用的节点要移动到in_use\_。中图的插入和淘汰只是
当前版本的引用计数至少是1。生成新版本时,将旧的当前版本Unref,就是引用计数减1。MANIFEST简而言之:每次启动都会根据当前 current文件指向MANIFEST文件进行恢复,MANIFEST第一条记录了一个版本的全部信息,后面是迭代的变化记录。根据当前MANIFEST生成一个版本后(当前版本+改变=最新版本),就会新建一个MANIFEST,存放新建的版本,后续将其他的变化记录在这个文件中。如果数据库本身没有重启,这个manifest会一直增长,即每次重启新建MANIFEST。manifest文件专用于记录版本信息。leveldb采用了增量式的存储方式,记录每一个版本相较于上一个版本的变化情况。VersionEdit的内容将持久化到MANIFEST里的。即:MANIFEST里面保存的是VersionEdit。一个Manifest内部包含若干条Session Record,其中第一条Session Record记载了当时leveldb的全量版本信息,其余若干条Session Record仅记录每次更迭的变化情况。因此,每个manifest文件的第一条Session Record
入口函数MaybeScheduleCompaction() void DBImpl::BackgroundCompaction()CompactionMinor Compaction:Immutable Memtable向level-0中的SSTable文件的转换(优先级高)。Major Compaction:将SSTable移到更高的Level去,需要保证Level 0以上的SSTable每层之间的键有序无重叠。Major Compaction其实就是一个归并排序的过程,对多个输入的SSTable,多路归并,输出多个连续的SSTable,代替原来的文件。根据Level 0的特殊性,可以分为两种类型:Level 0 -> Level 1Level n -> Level n + 1 (n > 0)将多个小SSTable合并成一个大SSTable,可以解决查找的效率问题。但是,如果不断地有新的小SSTable进来,这些小SSTable都需要和这个大的SSTable进行合并,不管多大的SSTable来合并,都需要读取所有的磁盘数据,并且写入所有的磁盘数据。大的SSTabl
可以通过布隆过滤器快速判断对应的键有没有在这个SSTable里。如果判断键在SSTable,那也只有很小的概率是键不在这个SSTable里。这是典型的用空间换时间的思想,选择布隆过滤器是因为布隆过滤器的空间占用非常小,可以加载到内存中,进行快速判定。
YJ-Ma的小屋🍉
勿在浮沙筑高台