- 博客(184)
- 资源 (7)
- 收藏
- 关注
原创 linux swap slot机制
其基本的思想是:swap slot cache从swap area中批量申请一些slots,之后内核在swap out操作申请slot时,直接从swap slot cache中获取,内核进行swap in释放slot时,也直接归还到swap slot cache中,这样比每次都向swap area逐个申请和释放要更加快速。判断的具体门限是以"SWAP_SLOTS_CACHE_SIZE"大小的倍数计,低于2倍时(相当于low watermark)就关闭swap slot cache。
2024-08-23 09:24:27
220
原创 zram机制 - zram_bvec_write为什么要调用zram_free_page
或者swap_writepage找一个空闲的slot,但是之前这个slot调用zram_slot_free_notify时,由于zram_slot_trylock失败,也没有在zram_slot_free_notify中调用zram_free_page,所以在本次写zram时,释放。有条件释放swapcache,看下面代码, 条件之一是mem_cgroup_swap_full(),也就是判定swap是否已经使用了50%,如果超过了50%,就要调用folio_free_swap进一步释放;
2024-08-22 23:22:06
339
原创 linux memory cgroup的memory.move_charge_at_immigrate含义
最开始某个进程是在cgroup A中,后面要迁移到cgroup B中,那么进程的内存计数是否要完全迁入B中,就是通过memory.move_charge_at_immigrate控制,如果目标cgroup也就是B设置了1到该字段中,那么进程的内存记账也要从cgroup A中去掉(uncharge from A),同时计算到B中(charge to B)。
2024-08-20 22:34:19
250
原创 源码视角看memory cgroup目录下创建目录以及读写节点发生了什么
【代码】源码视角看memory cgoup目录下创建目录以及读写节点发生了什么。
2024-08-17 09:52:39
86
转载 linux cgroup设计与实现机制
cgroup的全称为,中文翻译为控制组。内存CPUI/O和网络等。如下图所示,使用cgroup来限制进程组对内存的使用:在上图中,我们创建了 2 个cgroup(每个 cgroup 有 4 个进程),并且限制它们各自最多只能使用 2GB 的内存。如果使用超过 2GB 的内存,那么将会触发错误。cgroup通过把进程划分成控制组(一个控制组包含一个或多个进程),并且可以对控制组进行资源使用的控制,也就是说cgroup作用对象是控制组。cgroup提供了将进程组织成控制组的能力,然后通过使用。
2024-08-16 23:44:57
27
原创 linux 公平调度关键点记录
这里计算了curr任务的运行时间,二now是直接从当前cpu的cfs_rq记录的所有任务的物理运行时间,如果update_curr调用时候有curr之外的任务运行那就不正确了,可以看到对于-20和15两个进程的情况下,其虚拟运行时间是基本相同的,这正式cfs公平调度的核心,所谓的公平是指在虚拟机运行时间的层面是完全公平的。怎么计算出来-20和15两个任务的实际运行时间和虚拟运行时间呢?-20任务的realruntime = 88761/(88761+36) x 10ms = 9.996ms。
2024-07-20 23:34:15
312
原创 Linux Swap机制关键点分析
参考文章:Linux Swap 从 userspace 到 kernel详解_kernel swap-CSDN博客Linux Swap 与 Zram 详解 - 泰晓科技一文聊透 Linux 缺页异常的处理—— 图解 Page Faults(下) - 简书
2024-06-30 18:17:58
400
原创 zram压缩机制看swapon系统调用
上面代码read_mapping_page是能够读取内容的关键是mapping对象,因为mapping->aops有readpage函数,但是这里mapping和mapping->aops是什么时候设置的?上面命令调用了linux的swapon系统调用启动zram0交换分区;mkswap命令向块设备文件/dev/block/zram0写入了swap_header信息。那么swapon_all命令执行了哪里的代码呢?但是这是什么代码路径设置进去的呢?
2024-06-29 22:27:54
397
原创 Android13屏幕旋转的基本逻辑
2.设置user_rotation和GSensor哪个优先级更高,比如user_rotation = 0期待竖屏,但是打开屏幕旋转且处于横屏时,应该是横屏还是竖屏。现在我们知道,屏幕方向旋转是通过加速度传感器或者重力传感器来获取,但Sensor上报的原始数据还得通过一系列计算得到最终的旋转角度,这部分逻辑在。答案:设置用户期望的屏幕转向,0代表:Surface.ROTATION_0竖屏;3.systemui中的“自动旋转”按钮影响的是哪个数据和系统的值。答案:此时GSensor优先级更高,横屏显示,
2024-05-12 13:30:58
1016
1
原创 HWUI源码剖析(二) - 终于讲清楚OpenGL渲染的MVP矩阵的来龙去脉
研究android8.1 HWUI源码的过程中,发现OpenGL是绕不过的一个知识点,不理解OpenGL的绘制基础,必然无法很好的理解Hwui基本原理,同时熟悉OpenGL之后,HWUI也是一个非常优秀的OpenGL 2D渲染的代码,本文将介绍一下OpenGL绘制图形的重要原理,为学习HWUI源码扫清障碍,本文我们将以会一直一个白色的矩形为例,结合代码实践加以说明。
2023-10-22 21:57:22
499
原创 HWUI源码剖析(一) - 渲染中RenderProxy视角看一种很有用的编程模式
实际的工程项目中,往往都是多线程编程,也就是必然有某些业务逻辑或者功能要运行在特定的线程,比如android开发中常见的IO线程,UI线程,Render线程,这样会涉及从线程A向这些工作线程通信或者函数调用的代码编程,具体实现上可以有多种多样,但是他们的核心思想其实都是一致的,Android Handler/Looper视角看UI线程的原理_nginux的博客-CSDN博客。
2023-10-15 19:45:44
291
原创 Android Handler/Looper视角看UI线程的原理
Handler/Looper机制是android系统非重要且基础的机制,即使在rtos或者linux操作系统上开发应用框架时,也经常借鉴这个机制。通过该机制机制可以让一个线程循环处理事件,事件处理逻辑即在Handler的handleMessge种。本文建议android8.1源码分析这套机制的实现原理。
2023-10-14 16:46:49
848
原创 multi-generation lru系列 - workingset的适配
Linux 内存workingset Refault Distance算法源码及源码解析-CSDN博wen一文中我们分析了workingset算法的实现原理,内核引入mglru之后workingset算法也要做相应的适配,因为mglru算法使用了PID控制反馈算法,这其中就要统计refaulted次数和eviction次数,这些数据的统计就在workingset.c中实现的,接下来我们以v6.1源码分析workingset对于mglru的适配更新。
2023-10-03 20:46:46
362
原创 Linux回收内存的时候遇到PageWriteback和PageDirty脏页怎么处理?
我们知道内存回收会遇到各种情况的page,比如正在回写的page(PageWriteback)和脏页(PageDirty)的page,内核会等待PageWriteback完成回写呢,还是说直接跳过正在回写的页面。这两种选择各有优劣,如果等待Writeback完成会影响内存分配性能;如果直接跳过呢可能影响内存回收的效率。PageDirty的page也面临类似的问题,所以我们来看下内核v4-14源码中是如何处理这两种情况的。
2023-10-03 09:39:30
466
原创 multi-generation lru系列 - 怎么决定回收anon还是file
Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?-CSDN博客。
2023-10-02 23:26:31
326
原创 Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?
Linux内核为了区分冷热内存,将page以链表的形式保存,主要分为5个链表,除去evictable,我们主要关注另外四个链表:active file/inactive file,active anon和inactive anon链表,可以看到这主要分为两类,file和anon page,内存紧张的时候,内核开始从inactive tail定量回收page,那么这里面就有个很重要的选择:inactive file和inactive anon lru链表的回收比例到底怎么确定?
2023-09-29 22:36:29
530
转载 LWN:多代LRU方案的未来!
当一个 page 被访问时,它们会从较老的一代 list 移动到较新的一代,当需要回收内存时,会先从最古老的一代来开始回收 page。每一代的 page 都会随着时间的推移而变得老化,当最老的一代中的 page 都被回收掉了的时候,就会创造出新的一代。自这项工作的第一次发布以来最大的变动是在 "tier" (层)的定义上,tier 这个词现在被用来细分各代 page,这反过来又可以帮助更好地决定哪些 page 需要回收(reclaim),特别是在那些需要使用大量 buffered I/O 的系统中。
2023-09-24 22:34:44
214
原创 Linux 内存workingset Refault Distance算法源码及源码解析
内核mm子系统中有一个workingset.c实现了refault distance算法,发现网络逻辑介绍该算法的文章主要是黏贴自奔跑吧内核一书中的内容,军比较雷同,讲述的角度比较难以理解,我第一看到的时候琢磨了2天才明白,本文希望从更容易理解的角度来分析何为refault distance算法,以及内核引入该算法的原因,这就要从内核回收page面临的挑战说起。本文源码:v5.9。
2023-09-24 22:26:11
759
原创 Linux qemu启动内核rootfs挂载失败VFS: Cannot open root device问题解决方案
【代码】Linux qemu启动内核rootfs挂载失败VFS: Cannot open root device问题解决方案。
2023-09-22 08:26:17
1026
原创 Linux关于memory cgroup的几个要点
进程的内存可以分很多类型,比如page cache,slab,anon memory等,到底是限制的哪些内存?如果进程A已经运行起来占用了一些内存,之后,再将A加入memory cgroup限制,原来占用的内存会统计入新的memory cgroup?memory cgroup有memory.soft_limit_in_bytes和memory.limit_in_bytes,假设进程使用内存超过这两个限制,内存回收时机和路径是怎么样的?
2023-09-17 17:59:53
1173
原创 Linux mmap读/写触发共享文件页生命周期
Linux的mm内存子系统的核心功能就要要管理各种类型的page,确保能高效分配和释放,让物理内存得以最大化使用。初识内存系统往往关注的是page的申请和管理流程,容易忽略page的释放回收流程,其实理解mm中的内存回收和释放也是最核心的机制。
2023-09-11 23:52:07
384
原创 linux的dirty page回写磁盘过程中是否允许并发写入更新page?
众所周知Linux内核write系统调用采用pagecache机制加速写入过程,避免write系统调用长时间block应用进程,用户态进程执行write调用的时候,内核只是将用户态buffer copy到内核的pagecache当中,write系统调用就返回了,完全不需要等待数据完全写入存储设备,因为存储设备是的写入可能是个耗时很长的过程。内核正在回写page到存储设备的过程中,是否允许应用层同时更新page内容?应用层更新page是否会被block?本文将从理论和内核源码两个方面彻底分析该问题。
2023-09-10 07:59:17
551
原创 Linux page migration源码分析
Linux 内核page migration设计文档_nginux的博客-CSDN博客前文介绍了page migration迁移的设计思路,且内核文档介绍得知,总计需要20个steps完成迁移过程,本文目标是以源码视角对应到这20个step上面,加深对于页面迁移的理解。内核源码版本:Linux-5.9。下面再贴一下内核描述的20个step:__unmap_and_move函数//page:需要迁移的page//newPage: 迁移的目标page。
2023-08-27 10:41:38
422
原创 Linux 内核page migration设计文档
page migration设计之初是在numa system的各个node之间迁移physical pages,意味着进程页面的虚拟地址不会变化,物理地址发生改变,migration的目的将page迁移到临近的cpu上降低内存访问延迟。
2023-08-26 20:44:10
484
转载 自旋锁 spin_lock、 spin_lock_irq 以及 spin_lock_irqsave 的区别
能够停留下来认真读这篇文章的人大部分都已经了解了什么是自旋锁,至少知道自旋锁就是不停的询问资源有没有准备好的一把锁,这个从概念上很容易理解,当然他的内在也是很容易实现。
2023-08-23 11:10:53
800
原创 Linux源码剖析struct page结构体flags成员
/跟page reclaim的二次机会法有关//page缓存内存和磁盘数据一致//代表是脏页PG_dirty,//page在lru链表中PG_lru,//page在active lru链表中PG_active,//IO错误PG_error,//page是对应的是slab内存PG_slab,PG_arch_1,//不能换出//正在回写//马上开始回收,回收前设置//匿名页和shmem page设置该条件//被mlock了#endifPG_young,PG_idle,
2023-08-13 23:26:21
382
原创 Linux源码剖析匿名共享内存shmem原理
进程间共享匿名内存有两种重要的方式,其一是mmap设置MAP_SHARED | PRIVATE创建的虚拟地址区域,这片区域fork执行之后,由父子进程共享。其二是主动调用shmget/shmat相关接口。此外android操作系统的ashmem匿名共享内存也是基于linux内核的shmem实现。本文我们将从源码角度剖析内核shmem的设计和实现原理。
2023-08-13 17:18:43
1510
1
原创 Linux mmap系统调用视角看缺页中断
实际开发过程中经常使用或者看到mmap函数,具体细节可以man mmap查看相关细节。这个系统调用是个多面手,应用空间申请内存(比如glibc库申请大内存使用的是mmap),还是读写大文件,链接动态库,多进程间共享内存都可以看到mmap的身影,要想真正的理解这个系统一方面是从这几种使用场景的需求上理解mmap,更重要的必须基于内核源码,深入剖析其每个参数具体对应的内核实现。内存拷贝次数以mmap映射文件场景来讲,mmap读写文件与read/write的相比少一次内存拷贝。
2023-08-07 22:16:35
636
原创 linux页框回收之shrink_node函数源码剖析
Linux内存回收入口_nginux的博客-CSDN博客》前文我们概略的描述了几种内存回收入口,我们知道几种回收入口最终都会调用进入shrink_node函数,本文将以Linux 5.9源码来描述shrink_node函数的源码实现。
2023-07-30 11:31:37
621
原创 Linux内存回收入口
内存回收主要是有kswapd异步回收和direct reclaim同步回收两种入口,其中逻辑非常复杂,本文主要只概要描述不同回收场景下内核设计的主要思想,源码细节不同版本有不少区别,具体的分析后续会有专门的文章分析。
2023-07-29 14:27:00
320
原创 搞懂sparsemem稀疏内存模型
随着大内存和内存热插拔技术发展,内核物理内存越来越不连续,内核管理这种非连续物理内存的元数据metadata也需要随之发展,避免内存浪费,内核的sparse mem稀疏内存模型就是解决该问题。数据结构mmzone.h//根据sec number计算属于哪个root,即mem_section二位数组第一维的index//2048//相当于是[2048][256]的二维数组,每个数组元素是struct mem_section//为了节省空间,这个字段包含很多信息,具体见下面源码的解释/*
2023-07-28 23:00:00
706
原创 page _refcount和_mapcount字段
linux page有两个非常重要的引用计数字段_refcount和_mapcount,都是atomic_t类型,其中,_refcount表示内核中应用该page的次数。当_refcount = 0时,表示该page为空闲或者将要被释放。当_refcount > 0,表示该page页面已经被分配且内核正在使用,暂时不会被释放。
2023-07-24 22:59:08
868
原创 ext4 mballoc之buddy算法
ext4_mb_init_cache,而是ext4_mb_load_buddy就会调用ext4_mb_init_cache,这里init cache就是指保存磁盘data block bitmap的pagecache和buddy bitmap。ext4_mb_init_group和ext4_mb_load_buddy都会调用ext4_mb_init_cache,我们就以ext4_mb_init_group调用为启动分析。
2023-07-23 15:55:53
646
原创 ext4 delay allocation之ext4_writepages页回写源码剖析
ext4 write写入pagecache之后,再合适的时机会回写到磁盘,ext4文件系统中是通过ext4_writepages写入磁盘,本来将在源码角度分析该过程。建议先参照ext4 - delay allocation数据结构_nginux的博客-CSDN博客看下涉及的重要数据结构。
2023-07-23 01:03:21
513
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人