- 博客(106)
- 资源 (2)
- 收藏
- 关注
原创 nfs 中 lockd 与 statd 的作用
lockd 是内核线程,statd 是用户态进程,二者用于 nfs v3 通信协议中,锁状态的恢复(v4 版本协议是有状态协议,无需依赖 statd来恢复状态)。
2024-10-21 19:26:43 504
原创 /proc/kcore 的结构
proc/kcore 的结构满足 elf 格式,共有一个程序头 + n 个 section header + 一个 note 段 + n-1 个内存段。它实际是所有内核态内存块的集合,以链表连接在一起。每个 section header 中的 offset 可以当作是读 /proc/kcore 文件的起始偏移。
2024-07-13 23:50:29 196
原创 xfs 的 sectorsize
下层设备写时还按物理的 sectorsize 为单位来写,但上层设备看到的写单位还是逻辑 sectorsize,下层设备会将同一物理 sectorsize 的几个逻辑写合并输出。设备上报的 sectorsize (也叫 topology sectorsize)有两种:逻辑 sectorsize + 物理 sectorsize,举个例子:早先设备用物理的 512 byte,后来物理的变为 4096 byte,为了兼容老的,逻辑的 sectorsize 还按 512 byte。
2024-06-17 12:21:51 203
原创 nfs 的 subtree_check 属性
subtree_check 是说在用一个 file handle 时,要检查它的挂载点变化,且到挂载点之间的目录均有访问权限。除此之外,如果a目录移动出挂载点,也是一样的。
2024-06-05 12:33:18 614 1
原创 starrocks对大量数据怎么实现hash join
在执行阶段FragmentExecutor::execute向GlobalDriverExecutor提交pipeline driver,当worker线程遍历到包含hash join node的driver节点时,调用PipelineDriver::process执行pipeline中每个pipeline算子,即从上游算子pull_chunk,再push_chunk到下游节点。执行分两步:FragmentExecutor::prepare,FragmentExecutor::execute。
2024-02-20 15:41:41 674 1
原创 linux ext3/ext4文件系统(part2 jbd2)
JBD2支持三种日志模式:journal、ordered和writeback。在journal模式下,数据块和元数据块的修改都被记录在日志中;ordered模式在数据块刷盘后记录元数据;writeback模式则只记录元数据,不等待数据块刷盘。日志块包含revoke块(记录删除的块)、normal块(包含数据/元数据)和commit块(包含checksum等信息)。JBD2会生成日志块,包括revoke块、normal块和commit块。如果系统发生错误,JBD2会进入abort阶段,将未checkpoint
2024-02-20 15:39:02 1503 2
原创 多继承与虚继承内存布局
6、实例化顺序与内存布局不同,是按写的顺序来的,本例中顺序为:va::a() -> va() -> b()::a() -> b() -> va2() -> b2::a() -> b2() 其中va2的构造不需要再调一次a的构造,因为虚类只有一个。4、虚继承的类会深度遍历添加虚爷类的内存,且只添加一次,后面用到这个虚爷类时可直接复用。4、子类的虚表与第一个实继承类的虚表合并,没有实继承类时,单独创建一个虚表在最顶部。5、子类的虚表与第一个实基类合并,如果没有实基类,则加一个子类的虚表。
2024-01-03 16:17:24 574
原创 linux 中 ext2文件系统实现
(图中关于buffer的部分,上下两部分是重复的,是从不同维度下看的buffer结构)linux内核本身不提供ext2文件系统的格式化功能,可以参考busybox中对mkfs.ext2的实现(在busybox中块大小与总大小有关,总磁盘大小至少是64k,64k-512m是4096B,512m-4T是8192B(4T以上不考虑了)。
2023-12-26 22:32:37 1201
原创 linux buffer的回写的触发链路
wb_workfn中调用wb_do_writeback->writeback_inodes_wb将wb->b_dirty上记录的inode转移至wb->b_io队列(queue_io),并最终对inode的脏页做回写(__writeback_inodes_wb->writeback_sb_inodes->__writeback_single_inode->do_writepages)。
2023-12-22 11:13:06 449
原创 linux 内核的 lru_list 的结构
在支持memory group的场景(memcg_aware = true),每个每个memory group都分配了一个lru_list数组,数组中每个元素是这个对象对应的memory group在一个numa node上的lru_list的头。在linux的slab分配的入口slab_alloc有一个传入参数lru,它的作用是使每个slab对象在unused,但可能后面继续使用的时候,不需要free,可以先放在lru_list上。
2023-12-20 18:48:39 538
原创 linux中deadline调度原理与代码注释
deadline调度是比rt调度更高优先级的调度,它没有依赖于优先级的概念,而是给了每个实时任务一定的调度时间,这样的好处是:使多个实时任务场景的时间分配更合理,不让一些实时任务因为优先级低而饿死。deadline调度不是说必须在这个deadline时间点前跑完任务,而是在一个调度周期内,期望在deadline之前调度一次这个任务。理论上这个任务跑的时间是有可能超过deadline时间点,甚至period时间点。
2023-12-19 18:52:31 1568
原创 linux中core调度器
开始把core调度器当成了linux的主调度器,导致查找网上资料时总觉得对不上,最后从linux的rust文档中明白了,core调度器是为了解决超线程场景下缓存漏洞(如mds、L1HF)而存在的。简单来说就是一个cpu上同时运行两个线程时,线程1预加载到缓存的数据可以被线程2看到。),没找到mds和L1HF的POC代码,不太理解超线程的漏洞具体怎么实现,只能找到非超线程的漏洞原理。
2023-12-15 18:32:36 1008
原创 linux vfs 路径解析代码注释
linux版本为 v6.7以chroot修改根目录为例,走一遍流程,重点在path_lookupat的实现。代码按逻辑组织,非真实代码顺序。由于涉及太多细节,每部分的开始会先做一个小结。
2023-12-14 11:26:44 1209
原创 理解linux中反向映射与应用
反向映射的作用是根据物理页,找到全部相关进程的vma。主要有两个结构,anon_vma_chain链表,和 anon_vma->rb_root红黑树。
2023-12-12 21:25:06 927
原创 linux中xarray与maple结构简析
当插入一段地址区间时[0x112100, 0x112233],假设最后一级node的shift是8,上一级的shift是16,则它的index为[21, 23],(2233align到8位是2300),它跨过了21,22,23三个slot,则21是一个value节点,22,23是sibling节点指向21,如果22, 23中有节点是已经分裂的有更小shift的node,则要把这个node free掉,相当于原有区间被新的更大区间覆盖。下层节点的slot可能存node、sibling、value。
2023-12-07 18:36:59 709
原创 linux中slab与slub的实现区别
CFLGS_OBJFREELIST_SLAB:所有index的长度不到一个对象的长度,随机选一个对象的位置作为freeindex数组的位置。CFLGS_OFF_SLAB:额外分配内存作为free index数组,条件是剩余的大小不能装下整个free index数组。free: slab使用期间即使自己的node有了内存,也不会将slab还回去,要等到slab上对象全释放后才可能还回去。CFLGS_ON_SLAB:取 slab 的前面部分作为free index数组的位置。
2023-12-06 16:07:17 526
原创 linux 中vmalloc实现简述
vmalloc只用于内核模块的逻辑地址分配,也就是说它的逻辑地址是挂在init_mm的pgd页表上的。它可将几段不连续物理区域合并分配一个连续逻辑区域。主要用于内核和驱动。
2023-11-30 18:41:41 599
原创 linux中 struct page 与物理地址的关系
以sparse模型为例,每个numa node 有自己的物理地址。在初始化时(sparse_init_nid)会将可用内存按section(比例32k个页)大小分成若干section,在大于dma区的内存中为他分配一个memmap,这个memmap 是struct page的集合。
2023-11-30 17:26:13 778
原创 python 制作3d立体隐藏图
2、需要指定FONT_PATH,为一个ttf文件,linux在/usr/share/fonts目录下,windows在C:\Windows\Fonts。1、建议不用中文,因为中文太复杂,生成立体图效果不好。3、建议字体TEXT_SIZE调大,不然不好分辨。5、多试几次,找到合适的纹理。4、指定的TEXT不要太长。
2023-11-30 14:03:44 1075
原创 linux 内存回收mglru算法代码注释2
旧的lru算法有active与inactive两代lru,可参考新的算法在引入4代lru的同时,还引入了tier的概念。
2023-11-24 11:44:16 2277
原创 linux 内存回收lru算法代码注释1
node_reclaim->__node_reclaim->shrink_node,这里调用shrink_node_memcgs回收后,要判断下是否分配内存速度比回收速度快太多,这种情况可能会尝试停一段时间等回收完成(reclaim_throttle),然后再看是否需要继续回收(should_continue_reclaim)。shrink_inactive_list会将部分页回收、送入swap区,或迁移到其它numa node上。
2023-11-22 17:55:21 941
原创 linux effective_protection函数实现
effective_protection实现如下,其多退少补的原则大概描述为:实际额度已用完,就按已分配的页数占总分配页的比瓜分额度;实际额度未用完,则在本节点已分配内存的基础上,按本节点使用超出额度的部分占所有使用超出额度部分的比瓜分剩余额度。函数的目的是根据 cgroup 的配额来计算它实际能从上层group中瓜分的额度。
2023-11-17 17:02:01 166
原创 linux boot阶段内存分配(x86)
memblock.memory指的是所有可用的内存,在init_numa或为driver分配内存时,将分配的区间绑定到memblock.memory上,后面就可以去这个区瓜分对应类型的内存。在转buddy分配器时(start_kernel->mm_core_init->mem_init->memblock_free_all)会将所有memblock.memory中没有使用的内存切下来放到reserved内存中,然后将所有reserved的内存切分到buddy中。
2023-11-03 18:09:19 180
原创 linux 中高精度timer的实现
软超时处理的入口是hrtimer_run_softirq,这个线程中会找到达到了软超时的task(__hrtimer_run_queues),判断它没有disable(tasklet_struct->count==0)且处于TASKLET_STATE_SCHED的task(软超时的任务,__run_hrtimer),执行它的func或callback,并更新下一个即将到达的软超时时间。,并更新超时时间,这样如果是用户调用的nanosleep,则在返回用户空间前,会自动重新调nanosleep。
2023-10-31 18:00:33 327
原创 linux PELT算法中的load计算
runqueue 的 load weight计算,用avg更合适,因为它比实时的weight更稳定,但由于avg的启动比较慢,在极端的场景要保证与用weight来表示的权重一致。一个entity 的share值指它在计算runqueue上的load时(load_avg)赋予的权重,这个权重用它所在的group的对应cpu上分得的share值来表示(group 在每个cpu上都有一个runqueue,cpu上分得的share用runqueue的share来表示): 是 runnable 的时间加权和。
2023-10-26 16:10:30 266
原创 jemalloc 5.3.0源码总结
注意:jemalloc 的最新版本里没有所谓的 huge class,bin 中slab外面也不再套一个run的概念了,看其它人分享的文章时需要注意。
2023-09-08 18:42:06 1121
原创 postgres 中 RegisteredSnapshot 与 PushActiveSnapshot 区别
是对外公布的 snapshot 其它进程或 logical restore 的实例可以感知到(exportsnapshot时也能export到文件里),在创建 index 和修改系统表时可能调用。
2023-07-26 17:44:58 197
原创 postgresql四种逻辑复制的状态
CreateCheckpoint,或者bgwriter启动时,或者创建logicalreplicationslot时都会调用LogStandbySnapshot 记录一个XLOG_RUNNING_XACTS类型的日志。日志中记录了所有提交的事务的xid(HistoricSnapshot)
2023-07-26 16:02:12 1053
原创 PGembedding 代码分析
遍历过程会维护一个距离目标点的距离最小堆(candidateSet)和最大堆(topResults),当为目标点找到的邻居超过maxelements(index 的 option)时,就取出最大距离的点,如果比这个最大的小,则pop出这个最大点,将新邻居插入topResults中。遍历每个邻居,看这个邻居是否idx_list満了,如果満了,则用最小堆做一个排序,更新这个邻居的idx_list。插入点过程与knn查找类似,先找邻近的n个点,更新自己的idx_list领居列表。label: 是点的标签。
2023-07-25 19:23:22 391
原创 pgvector 源码分析
pgvector 库是一种用于计算向量距离的库,它的核心是提供了聚类索引,棸类索引使用的算法是 kmeans++(相对于 kmeans 最主要的区别是初始化起点的位置)。
2023-07-25 15:29:35 1332
原创 null 值,谓词下推与 join 转换总结
target 中的 null 及相关计算就是 nullon/where 条件中的 null 及相关计算是 false 不是nullis null,is not null 判断在 target 与 on/where 条件中均表示 true 或 false,不是 null。无论 join 列还是百 join 列,where 条件可以下推 base 表,on 条件可以下推 join 表。cross join => inner joinouter join => inner joinfull join
2023-07-07 16:32:47 160
原创 优化器的优化规则 rule based optimizer
由于s与k 是 inner join且 k中的s2 is null 时 s2.j=1 是 not false (或null)所以 s2 与 s3 可从left join转 inner join。与select (select i from (values (1,2))b(i,j));a join b on a.i=b.i where a.i=6 ==> a.i=6 与 b.i=6。当 bar 为 空时,生成 dummy 的 输出(因为实际输出是空,而非foo.b的值,也非不输出)
2023-06-24 22:25:43 814
数据库笔记(思维导图)
2020-02-19
ticket_system.zip
2020-01-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人