极简组调度-CGroup如何限制cpu

1. 说明

1> linux内核关于task调度这块是比较复杂的,流程也比较长,要从源码一一讲清楚很容易看晕,因此需要简化,抓住主要的一个点,抛开无关的部分才能讲清楚核心思想

2> 本篇文章主要是讲清楚在cfs公平调度算法中,CGroup如何限制cpu使用的主要过程,所以与此无关的代码一律略过

3> 本篇源码来自CentOS7.6的3.10.0-957.el7内核

4> 本篇内容以《极简cfs公平调度算法》为基础,里面讲过的内容这里就不重复了

5> 为了极简,这里略去了CGroup嵌套的情况

2. CGroup控制cpu配置

CGroup控制cpu网上教程很多,这里就不重点讲了,简单举个创建名为test的CGroup的基本流程

1> 创建一个/sys/fs/cgroup/cpu/test目录

2> 创建文件cpu.cfs_period_us并写入100000,创建cpu.cfs_quota_us并写入10000

表示每隔100ms(cfs_period_us)给test group分配一次cpu配额10ms(cfs_quota_us),在100ms的周期内,group中的进程最多使用10ms的cpu时长,这样就能限制这个group最多使用单核10ms/100ms = 10%的cpu

<think>好的,我现在需要分析用户提出的关于蓝牙HCI日志中出现的“BT_HCI btu_free_timer Unable to find expected alarm in hashmap”错误的原因及解决方法。首先,我应该理解这个错误信息的具体含义。 根据错误信息,系统在释放定时器(timer)时,无法在哈希表中找到预期的警报(alarm)。这可能意味着定时器在释放前已经被释放,或者定时器未被正确添加到哈希表中。接下来,我需要结合用户提供的引用内容来分析可能的代码路径。 用户提供的引用[^1]中提到了调用链:bluetoothHCLibInterface的preload方法触发事件HC_EVENT_PRELOAD,进而调用bt_hc_worker_thread,然后通过userial_open打开串口,最终调用vendor接口的userial_open函数。这说明在初始化过程中,涉及到定时器的创建和管理。 接下来,可能的原因有几个方面。首先是定时器管理中的竞争条件,比如在多线程环境中,定时器被释放后又被访问,导致哈希表不一致。其次,定时器可能被重复释放,例如在某个回调函数中错误地多次调用释放函数。另外,哈希表本身的操作错误,比如添加或删除时未正确加锁,导致数据不一致。 解决方法方面,需要检查定时器的生命周期管理,确保每次创建后正确添加到哈希表,释放时正确移除。同时,检查多线程同步机制,确保哈希表操作的原子性。另外,查看日志中是否有重复释放的迹象,或者定时器ID冲突的情况。可能还需要使用调试工具跟踪定时器的添加和移除过程,确认是否有遗漏或错误。 此外,用户提到的btu_free_timer和btu_free_quick_timer可能涉及不同的定时器类型,需要分别检查它们的处理流程。例如,快速定时器可能有不同的管理机制,或者更短的超时时间导致更频繁的触发和释放。 总结来说,这个错误通常与定时器管理的逻辑错误或并发问题有关,需要通过代码审查和日志分析来定位具体原因,并采取相应的同步或修正措施。</think>### BT_HCI "btu_free_timer Unable to find expected alarm in hashmap" 原因及解决方法 #### 错误原因分析 1. **定时器生命周期管理异常** 当系统尝试释放已标记为`BTU_FREE_TIMER`的定时器时,哈希表中未找到对应条目。可能原因包括: - 定时器被重复释放(如回调函数中多次调用`btu_free_timer`) - 定时器未被正确添加到哈希表(如初始化时未调用`alarm_set`或`alarm_new`) - 多线程竞争导致哈希表状态不一致(如线程A释放定时器后,线程B仍尝试操作) 2. **蓝牙协议栈与HCI层交互问题** 根据引用[^1]的调用链`bluetoothHCLibInterface->bthc_signal_event->bt_hc_worker_thread`,在HCI预加载阶段可能发生: - 硬件抽象层(HAL)与协议栈的异步通信不同步 - `userial_open`操作未完成时尝试操作定时器 ```c // 示例代码片段(模拟定时器操作) void btu_free_timer(alarm_t* alarm) { if (!hashmap_has_key(timer_map, alarm)) { // 触发错误的位置 LOG_ERROR("Unable to find expected alarm"); } } ``` 3. **内存管理缺陷** - 野指针问题:定时器指针被释放后未置空 - 内存越界:其他模块的内存错误污染了定时器管理区 #### 解决步骤 1. **日志增强分析** - 在`btu_free_timer`前后添加调试日志,记录哈希表状态: ```c LOG_DEBUG("Attempting to free timer:%p, current hashmap size:%d", alarm, hashmap_size(timer_map)); ``` - 检查`btu_start_timer`和`btu_stop_timer`的调用频率是否匹配 2. **线程同步加固** - 对哈希表操作添加互斥锁: ```c pthread_mutex_lock(&timer_mutex); hashmap_remove(timer_map, alarm); pthread_mutex_unlock(&timer_mutex); ``` 3. **代码审查重点** - 验证`bt_vnd_if->op(BT_VND_OP_USERIAL_OPEN)`的返回状态 - 检查`btu_task`与`bt_hc_worker_thread`的交互时序 - 确认`alarm_new()`是否在所有定时器创建路径中被正确调用 4. **复现与调试** - 使用Valgrind检测内存问题 - 在`userial_vendor_open`失败场景下测试定时器管理 #### 典型修复案例 某厂商在实现`btu_free_quick_timer`时未处理`USERIAL_PORT_1`异常关闭的情况,导致定时器未从哈希表移除。修复方案: ```diff + pthread_mutex_lock(&timer_mutex); hashmap_remove(timer_map, alarm); + pthread_mutex_unlock(&timer_mutex); - userial_vendor_close(); + userial_vendor_close_cleanup(); // 新增清理函数 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值