<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[GetnextWindow的专栏]]></title><description><![CDATA[大爱开源]]></description><link>https://blog.youkuaiyun.com/GetNextWindow</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; GetNextWindow]]></copyright><item><title><![CDATA[Linux cpu bus虚拟总线]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/149149404</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/149149404</guid><author>GetNextWindow</author><pubDate>Sun, 06 Jul 2025 10:07:59 +0800</pubDate><description><![CDATA[的定义和初始化代码位于 Linux 内核的 drivers/base/cpu.c。]]></description><category></category></item><item><title><![CDATA[Linux pelt算法的get_pelt_divider计算原理]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/149065889</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/149065889</guid><author>GetNextWindow</author><pubDate>Wed, 02 Jul 2025 11:47:22 +0800</pubDate><description><![CDATA[上面我们明白了LOAD_AVG_MAX，那么get_pelt_divider直接返回LOAD_AVG_MAX不久好了吗，内核为什么还要考虑period_contrib呢？由于n趋近无穷大，那么公式可以简化为 1024/ （1-y)，由于y^32 = 0.5，所以这个等比数据的值就是47742，即LOAD_AVG_MAX。我们知道PELT一个小周期是1ms（1024us），如果一个任务持续运行无限个1ms周期其负载贡献值是多少呢？所以get_pelt_divider实现的时候将B段时间去掉了。]]></description><category></category></item><item><title><![CDATA[高通camx ThreadManager]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/147010681</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/147010681</guid><author>GetNextWindow</author><pubDate>Sat, 05 Apr 2025 13:52:26 +0800</pubDate><description><![CDATA[m_pCore->AcceptNewJob是将一个Job或者任务插入一个Queue，有一个工作线程循环从Queue中取Job任务执行，执行任务就是回调任务中的callback函数，AcceptNewJob实现。调用AddToPriorityQueue将任务添加到queue任务队列，那么什么时候从这个queue中取任务执行呢？有个线程循环执行DoWork，最终调用checkAndDequeue取任务执行。]]></description><category></category></item><item><title><![CDATA[从设备驱动的角度看电源管理]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/145378976</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/145378976</guid><author>GetNextWindow</author><pubDate>Mon, 27 Jan 2025 11:59:50 +0800</pubDate><description><![CDATA[但经过上面的分析，传统的suspend/resume已经很明确了，无非是按照pm_domain—>device driver或者class—>device driver或者bus—>device driver的顺序，调用相应的回调函数。哦，有runtime PM相关的两个回调，有一个宏定义：USE_PLATFORM_PM_SLEEP_OPS，该宏定义指定了dev_pm_ops的suspend回调为platform_pm_suspend（其它的类似）。再对比3.1，3.2小节的描述，是不是豁然开朗了？]]></description><category></category></item><item><title><![CDATA[Linux memcg lru lock提升锁性能]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/142308267</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/142308267</guid><author>GetNextWindow</author><pubDate>Mon, 16 Sep 2024 22:35:44 +0800</pubDate><description><![CDATA[继续检查，这个页是否在swapcache中，如果在，返回这个页地址加虚拟地址地址在页中的偏移，如果不在，获得一个内存页， 到swap设备上读取内容填到这个页，此处产生IO， 为Major page fault. 接下了就上把这个页加到swapcache，加入 LRU, 加入page table, 关联到所属的memcg， 并且添加反向映射，然后用户就可以正常使用了。解决的根本是改变页加入lru list和memcg的次序：如下所示，先关联memcg， 然后在加入lru list.get lru_lock;]]></description><category></category></item><item><title><![CDATA[Linux per memcg lru lock]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/142308156</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/142308156</guid><author>GetNextWindow</author><pubDate>Mon, 16 Sep 2024 22:29:33 +0800</pubDate><description><![CDATA[原来， 内核在引入 per memcg lru lists 后，并没有使用 per memcg lru lock， 还在使用旧的全局 lru lock 来管理全部 memcg lru lists。其实这些补丁和 Hugh Dickins 的补丁毫无关联， 并且在和 Johannes 的持续讨论中，解决方案的核心：page->memcg 的线性化已经进化了几个版本了， 从 relock 到 lock_page_memcg，再到 TestClearPageLRU，和 Google 的补丁是路线上的不同。]]></description><category></category></item><item><title><![CDATA[Linux匿名映射]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/142289778</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/142289778</guid><author>GetNextWindow</author><pubDate>Sun, 15 Sep 2024 22:06:19 +0800</pubDate><description><![CDATA[在切入逆向映射的历史之前，我们还是简单看看一些基础的概念，这主要包括两个方面：一个是逆向映射的定义，另外一个是引入逆向映射的原因。

1、什么是逆向映射（reverse mapping）？

在聊逆向映射之前，我们先聊聊正向映射好了，当你明白了正向映射，逆向映射的概念也就易如反掌了。所谓正向映射，就是在已知虚拟地址和物理地址（或者page number、page struct）的情况下，为地址映射建立起完整的页表的过程。例如，进程分配了一段VMA之后，并无对应的page frame（即没有分配物理地址），直]]></description><category></category></item><item><title><![CDATA[终于讲清楚了，Linux Cgroup机制以及其树形结构怎么创建的]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/142267581</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/142267581</guid><author>GetNextWindow</author><pubDate>Sun, 15 Sep 2024 14:19:56 +0800</pubDate><description><![CDATA[了解Linux Cgroup机制的都清楚，cgroup机制最终是通过树形结构表示的，既然是树形结构，我们必须搞清楚这个树形结构是怎么创建起来的，以及在内核源码中是怎么表达这种树形结构的，我们是否非常清楚怎么遍历整个树，本文将基于Linux5.15源码分析cgroup树形结构的创建过程。假设我们有如下层级结构：app就是test1和test2的父节点，test1和test2是兄弟节点，我们按照这个例子具体展开分析。]]></description><category></category></item><item><title><![CDATA[[Linux Kernel Block Layer第一篇] block layer架构设计]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/142014206</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/142014206</guid><author>GetNextWindow</author><pubDate>Sun, 08 Sep 2024 08:58:12 +0800</pubDate><description><![CDATA[随着SSD快速存储设备的发展，内核社区越发发现，存储的性能瓶颈从硬件存储设备转移到了内核block layer，主要因为当时的内核block layer是single hw queue的架构，导致cpu锁竞争问题严重，本文先提纲挈领的介绍内核block layer的架构演进，然后根据最新的架构研究内核源码的实现细节，直击内核block layer本质原理。]]></description><category></category></item><item><title><![CDATA[Linux block_device gendisk和hd_struct到底是个啥关系]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141974287</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141974287</guid><author>GetNextWindow</author><pubDate>Sat, 07 Sep 2024 00:18:35 +0800</pubDate><description><![CDATA[根据块设备号dev，从blockdev_superblock拿到inode节点，为什么这里能拿到块设备文件（/dev/block/zram0)的inode，就是因为bdev_add时候将inode对象加入到blockdev_superblock的inode hash表中了，这里就能拿到。blkdev_get_by_dev函数返回了一个block_device，这个block_device跟前面zram块驱动blk_alloc_disk 生成的block_device有啥关系？]]></description><category></category></item><item><title><![CDATA[2024年Linux内核社区关于large folio和mthp的关键进展]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141780570</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141780570</guid><author>GetNextWindow</author><pubDate>Sun, 01 Sep 2024 10:23:45 +0800</pubDate><description><![CDATA[所以唯一可行方案是THP recovery，也就是在被split的1GBTHP基础上，保留未被重新分配的页，并将已被重新分配的页的数据复制到额外的4KB页，然后将原有的1GB物理区域“物归原主”成THP。由于 mTHP 的 size 大于 4KiB 的 small folios，理论上，它更容易出现 false sharing 的情况，频繁迁移会导致内存跨 NUMA Node 来回 ping-pong，因此，在算法上，mTHP 暂时借用了 PMD-mapped 的 2-stage filter 机制。]]></description><category></category></item><item><title><![CDATA[Linux TLB和cache]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141758571</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141758571</guid><author>GetNextWindow</author><pubDate>Sat, 31 Aug 2024 21:01:49 +0800</pubDate><description><![CDATA[Linux TLB和cache。]]></description><category></category></item><item><title><![CDATA[linux每个memory cgroup的lru链表是什么创建的 - 5.15内核]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141687002</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141687002</guid><author>GetNextWindow</author><pubDate>Thu, 29 Aug 2024 19:46:30 +0800</pubDate><description><![CDATA[对Linux memory子系统有基本了解的都知道，linux内核通过LRU管理物理内存，不知道是否有思考过如下问题：LRU是全局一套，还是说每个memory cgroup拥有单独的一套LRU链表？直接揭晓答案：每个memory cgroup都会单独的LRU链表。]]></description><category></category></item><item><title><![CDATA[linux swap slot机制]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141454283</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141454283</guid><author>GetNextWindow</author><pubDate>Fri, 23 Aug 2024 09:24:27 +0800</pubDate><description><![CDATA[其基本的思想是：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。]]></description><category></category></item><item><title><![CDATA[zram机制 - zram_bvec_write为什么要调用zram_free_page]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141439955</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141439955</guid><author>GetNextWindow</author><pubDate>Thu, 22 Aug 2024 23:22:06 +0800</pubDate><description><![CDATA[或者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进一步释放；]]></description><category></category></item><item><title><![CDATA[linux memory cgroup的memory.move_charge_at_immigrate含义]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141369921</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141369921</guid><author>GetNextWindow</author><pubDate>Tue, 20 Aug 2024 22:34:19 +0800</pubDate><description><![CDATA[最开始某个进程是在cgroup A中，后面要迁移到cgroup B中，那么进程的内存计数是否要完全迁入B中，就是通过memory.move_charge_at_immigrate控制，如果目标cgroup也就是B设置了1到该字段中，那么进程的内存记账也要从cgroup A中去掉(uncharge from A)，同时计算到B中(charge to B)。]]></description><category></category></item><item><title><![CDATA[源码视角看memory cgroup目录下创建目录以及读写节点发生了什么]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141276075</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141276075</guid><author>GetNextWindow</author><pubDate>Sat, 17 Aug 2024 09:52:39 +0800</pubDate><description><![CDATA[【代码】源码视角看memory cgoup目录下创建目录以及读写节点发生了什么。]]></description><category></category></item><item><title><![CDATA[linux cgroup设计与实现机制]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/141272107</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/141272107</guid><author>GetNextWindow</author><pubDate>Fri, 16 Aug 2024 23:44:57 +0800</pubDate><description><![CDATA[cgroup的全称为，中文翻译为控制组。内存CPUI/O和网络等。如下图所示，使用cgroup来限制进程组对内存的使用：在上图中，我们创建了 2 个cgroup（每个 cgroup 有 4 个进程），并且限制它们各自最多只能使用 2GB 的内存。如果使用超过 2GB 的内存，那么将会触发错误。cgroup通过把进程划分成控制组（一个控制组包含一个或多个进程），并且可以对控制组进行资源使用的控制，也就是说cgroup作用对象是控制组。cgroup提供了将进程组织成控制组的能力，然后通过使用。]]></description><category></category></item><item><title><![CDATA[关注GenieOS微博官方号，OS技术学起来]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/140814843</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/140814843</guid><author>GetNextWindow</author><pubDate>Wed, 31 Jul 2024 09:52:30 +0800</pubDate><description><![CDATA[Sina Visitor Systemhttps://weibo.com/u/6559724328]]></description><category></category></item><item><title><![CDATA[linux 公平调度关键点记录]]></title><link>https://blog.youkuaiyun.com/GetNextWindow/article/details/140579313</link><guid>https://blog.youkuaiyun.com/GetNextWindow/article/details/140579313</guid><author>GetNextWindow</author><pubDate>Sat, 20 Jul 2024 23:34:15 +0800</pubDate><description><![CDATA[这里计算了curr任务的运行时间，二now是直接从当前cpu的cfs_rq记录的所有任务的物理运行时间，如果update_curr调用时候有curr之外的任务运行那就不正确了，可以看到对于-20和15两个进程的情况下，其虚拟运行时间是基本相同的，这正式cfs公平调度的核心，所谓的公平是指在虚拟机运行时间的层面是完全公平的。怎么计算出来-20和15两个任务的实际运行时间和虚拟运行时间呢？-20任务的realruntime = 88761/(88761+36) x 10ms = 9.996ms。]]></description><category></category></item></channel></rss>