- 博客(9)
- 收藏
- 关注
原创 Linux CMA简介及使用案例
1. 背景在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。CMA(Contiguous Memory Allocator)连续内存分配,是一种用于申请大量的,并且物理上连续的内存块的方法,是 Linux Kernel 内存管理系统的扩展,目的在于解决驱动设备需要预留大量连续内存导致运行内存紧张的问题。通过这套机制,我们可以做到不预留内存,这些内存平时是可用的,只有当需要的时候才被分配给C
2020-08-21 17:06:55
2661
原创 CFS对vruntime的迭代更新
cfs调度器对vruntime的迭代更新是调度器实现公平调度策略的核心机制,下面我们来分析vruntime的迭代更新机制。1. 调度实体描述vruntime是调度实体的成员,所以我们先明确调度实体的相关描述:(1)load用以追踪进程组和进程的权重信息,进而影响vruntime的增加速度。(2)虚拟运行时间,用于cfs决策选择哪一个进程作为即将要运行的进程。(3)当前调度实体隶属于的队列。(4)进程组的就绪队列,非空表示进程组,NULL表示进程。2. 调度实体vrntime的设置2.1 v
2020-08-17 19:54:30
721
原创 InteractiveGovernor调频策略
本文基于eval_target_freq分析InteractiveGovernor如何根据cpu负载变化来实现调频策略。1. InteractiveGovernor的运转和原理框图1.1 InteractiveGovernor的运作框图(1)linux进程管理和调度框架会在合适的时机调用irq_work_queue去enqueue governor的irq_work,这个irq_work会计算是否需要变频,如果需要变频,那么会唤醒实时进程speedchange_task进行变频。(2)speedc
2020-08-14 20:00:32
707
原创 CFS对linux周期性调度的实现
当系统软件调用schedule放弃cpu的时候会发生进程切换,如果某一cpu消耗性进程长时间不调用schedule,我们如何推进调度器的运行来保障系统性能呢?这就是本文要分析的cfs对linux周期性调度的支持。CFS调度器并不会显示地为进程分配对应的时间片,相应地CFS用周期性调度实现进程的及时切换:在SysTick的中断函数中通过一层层函数调用最终到scheduler_tick函数,周期性地检查当前进程是否耗尽了自己应该分得的一个调度周期里面对应的时间片,并以此为依据决策是否要设置抢占标志,同时设计r
2020-08-14 17:20:42
971
原创 CFS进程组的cpu带宽限制
前文我们分析了实时进程组的带宽限制,本文将顺着前文的思路继续分析cfs进程组的带宽限制,由此进一步体会linux进程调度设计的优雅细节。1. 数据结构描述1.1 struct task_group这是描述进程组的数据结构,我们现在只列出带宽限制的相关成员:(1)当前进程组在各CPU上的cfs调度实体描述,数组长度是CPU的颗数。(2)当前进程组在各CPU上用于组织自己内部的就绪cfs调度实体的红黑树,数组长度也是CPU颗数。(3)当前CPU的权重,用于调度实体之间按权重比例分配CPU时间。
2020-08-13 20:01:20
1360
原创 RT进程组的cpu带宽限制
1.背景由于实时任务的优先级高于普通任务,因而为了防止cpu消耗型的实时任务一直占用cpu引发其他任务"饥饿"的情况发生,内核采用了带宽限制手段来抑制实时任务的运行时间。系统中将各个任务按层级组织成一个个任务组,组内的所有任务视为一个整体挂在一个运行队列上,而带宽限制的单位也是针对一个组来进行的。在任务调度中带宽限制就是指一定周期内一个队列上任务可运行的最大时间,内核中使用xxx_bandwidth结构来限制任务的运行时间。针对实时任务这个结构就是:(1)实时任务CPU使用率的检测周期(2)Rt_
2020-08-10 14:45:11
1527
原创 Linux kernelspace同步控制方案
Linux内核编程中必须解决的一个问题是多进程对共享资源的并发访问引发的竞态。解决竞态问题的途径是保证对共享资源的互斥访问。Linux内核可采用的互斥途径有中断屏蔽、原子操作、自旋锁、互斥体、信号量等。1.自旋锁1.1普通自旋锁自旋锁一般这样被使用:spinlock_t lock;//定义一个自旋锁spin_lock_init(&lock);//初始化自旋锁spin_lock(...
2020-07-31 18:53:56
378
原创 linux等待队列使用案例
工作队列实现阻塞IOstruct test_dev{struct cdev cdev;unsigned int current_len;unsigned char mem[SIZE];struct mutex mutex;wait_queue_head_t r_wait;wait_queue_head_t w_wait;};工作队列实现线程的挂起...
2019-12-18 09:06:57
564
【移动操作系统】Android传感器子系统架构与实现:多层解耦设计下的物理传感数据高效采集与应用集成
2025-11-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅