自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

私房菜

探索是一种乐趣,总结是一种习惯,坚持就是人生!

  • 博客(550)
  • 资源 (6)
  • 收藏
  • 关注

原创 Linux 内存管理全面剖析

还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~在Android 项目中接触内存管理相关的有一段时间了,中间看了很多代码,看了忘,忘了看,反反复复,索性就抽点时间整理出来~~该专栏通过剖析 Linux 5.4 版本的源码,尽可能清晰、完整地总结内存管理相关的知识点,进而展示Linux 内存管理的所有模块的原理。该专栏中的原理会在持续、长期、反复地的剖析中进行补充说明。

2023-05-26 09:52:19 1458

原创 Linux内存管理(八十四):Page Extension 详解

为了动态使用 page extension 的扩展功能,这里的结构体数组 page_ext_ops 将包含所有的扩展功能,而系统通过 page extension 实际使能的扩展功能,则通过各扩展功能的 need callback,详细查看下文 invoke_need_callback() 函数。在page_ext 初始化时,在函数 invoke_need_callbacks() 中统计 page_ext_ops 数组中支持的所有扩展功能占用的大小,也就是page_ext 的大小。

2025-03-31 07:07:08 319

原创 Linux内存管理(外四):page table

在中有个 PageTables 的属性值,该属性值具体统计的是哪些内存呢?在用户层的虚拟内存与物理内存映射时,是怎么样的映射方式?如何通过虚拟地址找到手机的物理地址?在内存老化、回收时,系统如何扫描,又如何通过扫描页表识别冷、热页?页表查询过程简述TTBRn:由虚拟地址最高位 bit[63] 决定,如果该位为 1,表示这个地址用于内核空间,页表的基地址寄存器用TTBR1;若该位为0,表示这个地址属于用户空间,页表的基地址寄存器用 TTBR0。

2025-03-26 16:26:41 477

原创 Linux内存管理(八十三):Memory allocation profiling 原理简介

Memory allocation profiling 是 Linux 6.12 中的重要功能。帮助开发者和系统管理员理解内存的使用情况,在MAP 中每一次的内存分配都可以精确地追溯到具体的代码行,可以轻松地识别分配的源头。无论是内核代码还是需要加载的模块代码。

2025-03-23 11:11:26 459

原创 Linux 中的 likely 和 unlikely

likely()、unlikely() 原理是利用了GCC 的内建函数(),通过编译器预测代码分支;GCC 编译器会将不希望的代码分支放最后;GCC 可能优先执行期盼的执行,再进行判断,不同的编译器版本实现方式不同;likely() 表示该表达式为 “True” 的概率大一些,unlikely() 表示改表达式为 “True” 的概率小一些;likely()、unlikely() 通过分支预测指令的预取能提高代码的执行效率。

2025-03-16 17:37:43 817

原创 Linux内存管理(外三):zero page

在实际应用程序场景中,经常存在其虚拟内存已经申请,且只对该内存进行读取过,但是从未对该内存进行过写操作,如果针对此场景发生只读page fault时,也为其虚拟内存区域全部申请对应物理内存将会极大浪费内存 因为后面从没有对该内存真正进行写过。当内存先读后写时,会触发两次page fault,先触发读内存page fault 使用zero page刷新对应映射,然后由于写内存会再次触发 page fault才生成新的实际物理内存,相对之前一次触发page fault,消耗可能会增多。

2025-03-02 15:11:44 70

原创 Linux内存管理(外二):struct page 成员参数详解

当alloc_pages() 分配page 后,后面每一个引用该 page 的用户,都需要通过 get_page()将此 page->_refcount++,代表再多一个用户使用该 page。站在buddy 分配器的角度来看,此时的 pages 相当于被分配出去,memblock 在使用所有的pages。在 buddy 分配器初始化时,从memblock_free_all() -> __free_pages_core() -> set_page_count() 将。用以初始化 _refcount 为 1;

2025-02-12 11:27:00 382

原创 Linux内存管理(外一):mlock 与 Unevictable

同 mlock(),这里也是通过 apply_vma_lock_flags() 修改 vma->vm_flags,只不过 mlock() 带入的是 VM_LOCKED,而这里是0.该demo 使用 mlock 确认memory 的统计,申请了 10M 的内存,并通过 mlock() 进行锁定,确认这部分内存的归属。锁定的内存都会被计入/proc/meminfo 中的Mlocked,同时也会计入到。

2025-02-08 10:58:56 274

原创 Android-V lmkd 中的那些属性值

LOW_MEM 原因查杀时,指定的 min_score_adj 最终与 PERCEPTIBLE_APP_ADJ + 1 比较,取最大值。当 cycle_after_kill && wmark < WMARK_LOW 时,指定min_score_adj。swap 内存的利用率,用以确定是否有可回收的内存,如果达到该阈值,则表示因无法swap引起的内存压力。严重失速限定值,当 FULL_10 大于该值,标记严重失速,min_score_adj 将指定到0。

2025-01-16 14:29:09 1608

原创 Linux内存管理(七十三):Linux PSI 详解(3)

在《PSI 详解(2)》上一文中详细剖析了 PSI 初始化过程、数据采集过程、状态更新过程,也将cgroup 关于PSI 的注意点和流程一并整理。本文将继续上文,重点剖析 PSI 接下来对于数据的统计过程,包括对每个 psi_trigger 的poll 机制的响应,以及显示需要的运行平均值计算。负责 psi trigger 的polling 功能,入口函数为 psi_schedule_poll_work();

2024-11-14 14:29:27 303

原创 Python 制作自定义库实践

随着工具开发的功能日益强大,模块化已经是大势所趋,所以,需要将整个工具项目的公共部分提取并制作为自定义的库。网上很多优秀的文章可以参考,作为小白的笔者结合了自己的实践经验,做一个小结,利己利人~~

2024-11-04 14:30:50 1198

原创 Android 中ebpf 的集成和调试

在 2013 年,Alexei Starovoitov 对 BPF 进行彻底地改造,这个新版本被命名为eBPF(extended BPF),与此同时,将以前的 BPF 变成 cBPF (classic BPF)。新版本出现了如映射和尾调用 (tail call)这样的新特性,并且 JIT 编译器也被重写了。新的语言比 cBPF 更接近于原生机器语言。并且,在内核中创建了新的附着点。bpf(2)

2024-08-27 22:09:20 2081

原创 Linux 中的同步机制——rwsem

读写信号量的原理与读写锁类似,读写信号量归根到底是“信号量”,读写锁归根到底是“自旋锁”,而信号量与自旋锁的区别一个可以睡眠,一个只能自旋。允许多个读者同时进入临界区;读者与写者不能同时进入临界区(读者与写者互斥);写者与写者不能同时进入临界区(写者与写者互斥);

2024-08-15 21:59:07 1148

原创 Linux 中的同步机制

指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。指在每个线程中访问临界资源的那段代码。由于临界资源需要互斥访问,因此每个线程的临界区代码在执行时需要确保没有其他现成同事访问该资源。

2024-08-13 09:48:00 1229

原创 Android 埋点信息分析——内存篇

在前一篇《Android statsd 埋点简析》一文中简单剖析了Android 埋点采集、传输的框架,本文在其基础对埋点信息进行解析,来看下Android 中埋下的内存信息有哪些。

2024-08-06 09:42:16 1338

原创 Android dex2oat 编译线程简析

名称说明要求 post_bootcomplete 为false要求 for_restore 为 true,备份prop 为 dalvik.vm.dex2oat-threads要求 background_job_compile,备份prop 为 dalvik.vm.dex2oat-threads通常作为备份的prop,上述prop 没有配置时,会使用这个备份prop。

2024-07-26 18:12:08 1098 2

原创 Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

2024-07-26 11:37:18 1356

原创 记:我在 优快云 的4096天

我也是在这些巨人的影响下,一点一滴地分享着自己的 “所见所闻”,从最开始学习优秀博主的创作风格,到现在形成自己的创作流程;,他们毫不吝啬地将自己所了解的最新讯息、最前言的技术、最完整的分析过程都毫无保留地分享给读者,让后来的小伙伴们能在巨人的肩膀上继续耕耘在自己的一份土地上。5. 别真的傻站着等被裁员,你没工作的时候,很痛苦,所以,知道要干嘛吗?4. 被裁员了,别抱怨,是你自己没那实力,所以,知道要干嘛吗?天的创作,也是自己留给自己的人生轨迹中弥足珍贵的回忆。3. 还没退休呢,继续努力吧,中年;

2024-07-15 10:38:31 483

原创 Linux内存管理(七十六):memcg v1 简介

全局 LRU 会swap out 任意的页数,swap out 意味着内存搬移到swap,对于memory +swap 是没有变化的。也就是说,当我们想限制swap 使用而没有影响全局 LRU,-站在操作系统的角度,限制 memory+swap 要比限制swap 好。

2024-06-28 10:13:08 705

原创 Linux内存管理(七十五):memcg v2 简介

memory.swap.high与max 略微不同,当cgroup 的swap使用量达到该 limit,将对cgroup 的分配进行节流,以允许用户空间实现自定义内存不足的过程。如果cgroup的内存使用量在该值下限内,则该cgroup 的内存将不会被回收,除非不受保护的cgroup中没有可用的可回收内存。如果在该 cgroup 中调用OOM killer,则无论其祖先 cgroup的 memory.oom.group为何值,都不会kill 该cgroup 以外的任何tasks。

2024-06-27 15:48:05 719

原创 Linux内存管理(七十四):cgroup v2 简介

术语:cgroup:control group 的缩写,永不大写(never capitalized);单数形式的 cgroup 用于指定整个特性,也用作等术语中的修饰符;复数形式的 cgroups 显式指多个独立的;cgroup 是一种机制,它将系统进程按照分层组织,并沿着这种分层以一个可控、可配置的方式来分配系统资源。

2024-06-27 10:17:23 490

原创 Virtualbox 安装 ubuntu + qemu

关于 Virualbox 安装虚拟机的优秀文章太多了,笔者主要是着重梳理一些安装小细节,利己利人!!如果需要保姆式的安装教程,可以查看后续的参考链接。

2024-06-04 10:44:28 1497 1

原创 Linux内存管理(七十二):Linux PSI 详解(2)

在《PSI 详解(1)》上一文中整理的 PSI 的原理和一些重要的数据结构,本文将在其基础上,详细剖析 PSI 初始化过程、数据采集过程、数据统计过程,也将cgroup 关于PSI 的注意点和流程一并整理。PSI 功能依赖CONFIG_PSI,当该 config 没有使能,psi.c是不会被编译到 image的。

2024-05-29 19:00:15 1327

原创 设置线程 CPU 亲和性的几种方式

线程CPU 亲和性分两种:软亲和性和硬亲和性。软亲和性主要由操作系统来实现,Linux 操作系统的调度器会倾向于保持一个进程不会频繁在多个 CPU 之间迁移,通常情况下调度器都会根据各个 CPU 的负载情况合理地调度运行中的进程,以减轻繁忙 CPU 的压力,提高所有进程整体性能。硬亲和性由用户调用系统 API 实现自定义进程运行在指定的 CPU 上,从而满足特定进程的特殊性能需求。

2024-05-21 22:06:53 2567

原创 dumsys meminfo 细节之 memtrack

从前文中得知,无论是 getMemoryInfo() 还是 getPss() 函数,都会调用函数收集 graphics 的内存。这其中涉及dmabuf 等相关信息,本文将各个类型的 memtrack 的统计过程。

2024-05-21 10:47:46 1648

原创 Android ART 虚拟机简析

用来执行显示GC,例如 system.gc() 接口;,用来执行并行GC,只能被 ART 运行时内部的GC 守护线程调用;,ART运行时内部调用的GC 接口,可以执行各种类型的GC;ART runtime 将空间划分:Image Space、Malloc Space、Zygote Space、Bump Pointer Space、Region Space、Large Object Space。

2024-05-20 13:52:35 1318

原创 Android ashmem 原理分析

ashmem称为匿名共享内存(Anonymous),它以驱动程序的形式实现在内核空间中。它有两个特点:能否辅助内存管理系统来有效地管理不再使用的内存块(pin / unpin);通过Binder进程间通信机制来实现内存共享;虽然 Binder机制已经可以实现了跨进程的高效通信,但是Binder 通信所允许的数据是有限制的(如下代码),如果需要大量数据交互就有限制了。

2024-05-11 16:33:46 1500 2

原创 dumpsys meminfo 流程中细节

另外,当该 flag 为true时,dump 流程会调用 thread.dumpMemInfo() 函数,会通过 getRuntime() 获取app 进程dalvik 的 totalMemory 和 freeMemory,并计算出 dalvikAllocated,得到app 进程虚拟机内存使用情况。无论 getMemoryInfo() 之后在 AMS 中计算,还是getPss() 在 android_os_Debug.cpp 中计算,total 的pss,都是需要加上 swap out pss;

2024-05-06 16:51:39 1456 2

原创 dumpsys meminfo 详解(U)

不同的版本 meminfo 的统计还是出现了少许的变化,本文继《meminfo 详解 R版本》一文,进一步补充U 版本的dumpsys meminfo 的统计流程。

2024-05-06 10:23:36 1692

原创 Linux 内核 delayacct 原理分析

用以统计此次 swapin 的耗时,当成功获得IO 资源后,此次 IO 耗时会被统计到 swapin_delay 里,而不被统计到 blkio_delay。即 blkio_delay 统计的是非swapin 的IO 耗时,而 swapin_delay 统计的是 swapin 的 IO 耗时。在内存紧张时会进行内存回收,最终会调用到 do_try_to_free_pages() 函数,这里会统计整个回收过程所产生的耗时(调用 shrink_zones 函数)。中会检测 task_struct 中。

2024-04-28 12:00:00 1444

原创 Linux 内核复合页(compound page)原理分析

复合页() 只是将两个或更多物理上连续的页面组合成一个单元,在许多方面可以将其视为单个更大的页面。它们最常用于创建大页面,在hugetlbfs或透明大页(transparent huge pages)子系统中使用,但它们也出现在其他场景中。复合页可以用作匿名内存或用作内核中的buffers;但是,它们不能出现在page cache中,page cache只能处理单个页面。分配复合页面是调用 alloc_pages() 并设置__GFP_COMP分配标志和页帧数大于1, 即order至少为1。

2024-04-15 17:50:43 1642

转载 Linux下/proc目录简介

在linux的根目录下存在一个/proc目录,/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口,通过它能够查看和改变各种系统属性.proc目录通常情况下是由系统自动挂载在/proc目录下,但是我们也可以自行手动挂载./proc目录下的大部分文件都是只读的,部分文件是可写的,我们通过这些可写的文件来修改内核的一些配置;/proc目录下还有许多目录,但是本文并没有介绍,主要原因是这些信息在平时查询或者使用都比较少,所以没有介绍.如果有兴趣,可以自行阅读proc手册。

2024-04-09 09:33:45 2234

原创 Linux内存管理(二十五):buddy 分配器之rmqueue

经过zone_watermark_fast() 函数进行水位判断,如果无法达到水位要求,会尝试第7、8 两节的流程,但如果第7、8 两节的逻辑都无法满足,那只能跳到下一个 zone 进行分配。当水位检测通过时,或者此次分配不用关注水位时,会接着调用 rmqueue() 函数,这里是内存分配的核心处理函数:

2024-02-04 10:42:38 281

原创 Linux内存管理(四十二):CMA 分配器——分配原理

上一篇博文是延续《memblock初始化》一文,对 dts 中 reserved-memory 节点进行详细剖析,阐述 CMA 分配器中核心数组 cma_areas 的创建过程。本文将重点剖析 CMA 分配器的分配、释放流程,对应接口是 cma_alloc() 函数、cma_release() 函数。将 cma 分配过程通过 5 张图阐述总结,核心逻辑都在图1,此时 CMA 的内存正在被非 cma 驱动使用,其中绿色表示普通页面,紫色表示干净的文件页,此时内存还是 MIGRATE_CMA 类型;图2,

2024-01-08 16:42:14 1251

原创 ramdump 中的memory统计

ramdump是指某个时刻系统或者子系统发生crash等异常,系统将内存中的数据通过一定的方式保存下来,相当于一个系统内存快照,用以开发者离线分析系统异常问题。

2023-12-30 10:32:57 1099

原创 OH中的 sanitizer 详解

相对于Android中的Asan 和 HWAsan,鸿蒙中也配套有 sanitizer 用于内存异常检测。

2023-12-28 18:06:49 5648

原创 Linux 内核参数:vmallocinfo

内存管理是一个相对复杂的内核模块,错综复杂的数据结构和管理逻辑。Linux 内核为了帮助开发者从宏观上把握内存的使用情况,在几大核心数据结构中都有相应的计数统计,如物理页面使用情况、伙伴系统分配情况、内存管理区的页面使用情况、内存回收扫描回收情况、内存规整触发情况等等。在《vmalloc 详解》一文中详细地剖析了vmalloc 的分配、释放流程,系统提供了 /proc/vmallocinfo 节点来查看在vmalloc 区域中分配的内存详细信息。

2023-12-20 16:22:45 1336

原创 Linux内存管理(十七):percpu 分配器——初始化

上一篇博文我们剖析了 percpu 分配器基本概念,包括percpup 的静态变量的声明、定义、访问,也包括 percpu 动态变量的声明、定义、访问,并详细地总结了 percpu 分配器中的几个重要数据结构以及含义、原理。另外,我们得知内核初始化在 setup_arch()初始化完成后,会返回 start_kernel() 进行进一步的初始化,percpu 分配器初始化刻不容缓的通过调用函数完成。因为percpu 分配器初始化的流程内容太多,本文将其中核心函数单独抽出来剖析。

2023-12-18 15:24:08 973

原创 Linux 中的 waitqueue 机制详解

等待队列这个机制在Linux 内核中使用的频率很高,与进程调度机制紧密相关联,可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。网上关于等待队列使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的拙见,方便自己回头查看,也希望能有助于后来读者。

2023-12-14 20:20:57 2133

原创 Linux 中的 container_of 原理

这个宏函数在Linux 内核中使用的频率还是很多的。网上关于 container_of 使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的鄙见,方便自己回头查看,也希望能有助于后来读者。

2023-12-13 15:51:56 1226 1

基于main log 和event log 对内存问题分析脚本

usage: parse-log.py [-h] [-d] [-f] [-k] [-ki] [-p] [-p20] [-s] [-sk] Parse info of am_pss, am_proc_died and lmkd_kill. Name of source files must be: android_main_log android_events_log

2024-08-14

使用VSCode进行linux内核代码开发(一)

gen_compile_commands.py

2024-01-26

Linux内存管理(六十三):ION 内存管理器-system heap

system heap refill

2023-12-15

Android oom-adj 中trim Bservices 优化

在 OomAdjuster.updateAndTrimProcessLocked() 函数中针对 Bservice进行优化

2023-07-19

Android 中app内存回收优化(一):R版本

配合framework 下CachedAppOptimizer 中的关于 proc reclaim 节点的驱动patch。

2023-07-17

mxml 提炼公共接口

使用mxml 库指定一个标准的接口,使用putInt、getInt、putString、getString、putStringArray、getStringArray等。mxml的详解可以参考https://blog.youkuaiyun.com/shift_wwx/article/details/99677421

2019-08-16

gcc和g++详解

1、gcc包含的c/c++编译器 gcc、cc、c++、g++ gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序 -o参数用来指定生成程序的名字

2017-10-25

Linux Shell脚本攻略(第2版).pdf

1.1 简介 诸多类Unix操作系统的设计令人惊叹。即便是在数十年后的今天, Unix式的操作系统架构仍是有史以来的最佳设计之一。这种架构最重要的一个特性就是命令行界面或shell。 shell环境使得用户能与操作系统的核心功能进行交互。术语脚本更多涉及的便是这种环境。编写脚本通常使用某种基于解释器的编程语言。而shell脚本不过就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行。 本书使用的是Bash(Bourne Again Shell),它是目前大多数GNU/Linux系统默认的shell环境。 鉴于GNU/Linux作为基于Unix式架构最杰出操作系统的地位,书中大部分案例和讨论都假定是在Linux系统环境下进行的。

2017-09-05

Makefile.pdf

什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都 为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂 。这就好象现在有这么多的 HTML 的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML 的标识的含义。特别在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、 功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要 先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作, 因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

2017-09-05

空空如也

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

TA关注的人

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