【WALT】top task 相关代码详解

WALT调度器:toptask结构与初始化、清理函数详解
本文详细解读了Linux4.9Android-msm-crosshatch-4.9-android12中WALT调度器的toptask相关代码,涉及结构体定义、内存初始化与清理、窗口翻滚时的toptask更新以及计算toptask负载的过程。

【WALT】top task 相关代码详解

代码版本:Linux4.9 android-msm-crosshatch-4.9-android12

结构体

我们先来看看与 top task 有关的结构体。

#define NUM_TRACKED_WINDOWS 2
#define NUM_LOAD_INDICES 1000

#define DECLARE_BITMAP_ARRAY(name,nr,bits) \
	unsigned long name[nr][BITS_TO_LONGS(bits)]
	
struct rq {
   
    
	……
#ifdef CONFIG_SCHED_WALT
	……
	struct load_subtractions load_subs[NUM_TRACKED_WINDOWS];
	DECLARE_BITMAP_ARRAY(top_tasks_bitmap,
			NUM_TRACKED_WINDOWS, NUM_LOAD_INDICES);
	u8 *top_tasks[NUM_TRACKED_WINDOWS];
	u8 curr_table;
	int prev_top;
	int curr_top;
#endif
	……
}

top_tasks_bitmap 是一个位图,一个位有 2 种状态,即 0 和 1。位图本质上是数组,适用于大规模数据,但数据状态又不是很多的情况,通常是用来判断某个数据存不存在的。

top_tasks_bitmap 的作用是可以快速找到当前 CPU 的运行队列在上一个窗口(prev)和当前窗口(curr)中有哪些区间在执行任务。

  • 区间:一个窗口被分为了 NUM_LOAD_INDICES 个区间。(默认为 1000 个)

在一个 CPU 的运行队列的结构体中,通过 top_tasks 数组来跟踪 prev 和 curr 两个窗口的 top task 情况,通过 curr_table 来标识哪一个 top_tasks 是 curr 的。curr_table 非 0 即 1。

prev_top 和 curr_top 的值为 prev 窗口 和 curr 窗口中最后一个任务执行结束时的时间所处区间的下标。换句话说,它们指示了 prev 窗口 和 curr 窗口中最后一个还在执行任务的区间。

初始化 & 清理函数

#define NUM_TRACKED_WINDOWS 2
#define NUM_LOAD_INDICES 1000

void walt_sched_init(struct rq *rq)
{
   
   
	……
	for (j = 0; j < NUM_TRACKED_WINDOWS; j++) {
   
   
		memset(&rq->load_subs[j], 0,
				sizeof(struct load_subtractions));
		rq->top_tasks[j] = kcalloc(NUM_LOAD_INDICES,
				sizeof(u8), GFP_NOWAIT);
		/* No other choice */
		BUG_ON(!rq->top_tasks[j]);
		clear_top_tasks_bitmap(rq->top_tasks_bitmap[j]);
	}
	……
}

static const unsigned int top_tasks_bitmap_size =
		BITS_TO_LONGS(NUM_LOAD_INDICES + 1) * sizeof(unsigned long);
		
void clear_top_tasks_bitmap(unsigned long *bitmap)
{
   
   
	memset(bitmap, 0, top_tasks_bitmap_size);
	__set_bit(NUM_LOAD_INDICES, bitmap);
}

static inline void clear_top_tasks_table(u8 *table)
{
   
   
	memset(table, 0, NUM_LOAD_INDICES * sizeof(u8));
}

初始化就是分配内存。如果分配是从一个原子上下文中进行的,例如中断处理程序,使用 GFP_NOWAIT 。这个 标志可以防止直接回收和IO或文件系统操作。因此,在内存压力下, GFP_NOWAIT 分配 可能会失败。(该段话来自《内存分配指南》

更新 top task

#
### 关于 Walt 的学习资料和使用教程 Walt 是一种基于 JavaScript 风格语法的工具,用于简化 WebAssembly (Wasm) 文本格式的操作[^1]。它旨在让开发者更容易编写、调试和优化 Wasm 代码。以下是关于如何学习和使用 Walt 的一些资源和建议: #### 官方文档与项目地址 官方文档通常是学习任何技术的最佳起点之一。对于 Walt 来说,可以从其项目的 README 文件入手,其中通常包含了安装指南、基本概念以及简单的示例代码。 - **项目地址**: [https://gitcode.com/gh_mirrors/wa/walt](https://gitcode.com/gh_mirrors/wa/walt)[^1] 在这个仓库中可以找到详细的说明文件,这些文件会帮助理解 Walt 的设计目标及其核心功能。 #### 基础入门 为了更好地掌握 Walt,推荐按照以下路径逐步深入: 1. **熟悉 WebAssembly** 虽然 Walt 提供了一种更接近 JavaScript 的方式来操作 WebAssembly,但了解基础的 WebAssembly 概念仍然是必要的。可以通过阅读 Mozilla 开发者网络上的相关文章或者观看在线课程来获取基础知识。 2. **尝试简单例子** 利用 Walt 编写并执行几个小型程序可以帮助快速上手。例如创建一个模块导出函数,并通过浏览器加载验证结果是否符合预期。 ```javascript // example.walt.js export function add(a, b) { return a + b; } ``` 编译上述脚本至 `.wasm` 文件后即可调用 `add()` 函数测试输出正确性[^1]。 #### 进阶主题 当具备一定实践经验之后,可进一步探索高级特性比如性能优化技巧或是与其他框架集成的方法等。特别注意的是,在某些场景下可能涉及到调度策略调整等问题,则需参考具体实现细节如引用[2]-[4]所描述的内容有关 task demand 及 CPU load balancing 方面的知识点[^2][^3][^4]。 另外值得注意的一个同名却完全不同用途的开源项目也叫作 "WALT", 主要应用于测量手机和平板电脑物理传感器延迟等方面的工作[^5]。如果兴趣偏向硬件层面的应用开发的话也可以查阅该项目的相关文档作为补充参考资料。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值