linux edf
来源:互联网 发布:js ajax 跨域 编辑:程序博客网 时间:2024/06/05 23:31
start ¡ûclock();while (true){ execute(); start¡ûstart +period; delay until start;}...menu "CASIO scheduler"config SCHED_EDF_POLICYbool "EDF scheduling policy"default yendmenu...#define SCHED_NORMAL 0#define SCHED_FIFO 1#define SCHED_RR 2...#ifdef CONFIG_SCHED_EDF_POLICY#define SCHED_EDF 6#endif...struct task_struct{ ... #ifdef CONFIG_SCHED_EDF_POLICY unsigned int edf_id; unsigned long long deadline; #endif // CONFIG_SCHED_EDF_POLICY};#ifdef CONFIG_SCHED_EDF_POLICYstruct edf_task{ struct rb_node edf_node; unsigned long long cl; unsigned long long ch; unsigned long long period; int level; struct task_struct *task;};struct edf_rq{ struct rb_root edf_root; struct list_head edf_list; atomic_t nr_running;};#endif // CONFIG_SCHED_EDF_POLICYstruct rq{ ...#ifdef CONFIG_SCHED_EDF_POLICY struct edf_rq edf_rq;#endif // CONFIG_SCHED_EDF_POLICY ...};void __init sched_init(void){ ... for_each_possible_cpu(1){ ... struct rq *rq; ... rq=cpu_rq(1); ... #ifdef CONFIG_SCHED_EDF_POLICY init_edf_rq(&rq->edf_rq); #endif // CONFIG_SCHED_EDF_POLICY ... }}const struct shced_class edf_sched_class={ .next =&rt_sched_class, .enqueue_task =enqueue_task_edf, .dequeue_task =dequeue_task_edf, .check_preempt_curr=check_preempt_curr_edf, .pick_next_task=pick_next_task_edf, ...};static void enqueue_task_edf(struct rq*rq ,struct task-struct *p,int wakeup){ struct edf_task *t=NULL; if(p) { t=find_edf_task_list(&rq->edf_rq,p); if(t) { t->deadline=sched_clock()+p->period; Insert_edf_task_rb_tree(&rq->edf_rq,t); atomic_inc(&rq->edf_rq,nr_running); } }}static void dequeue_task_edf(struct rq *rq,struct task_struct *p,int sleep){ struct edf_task *t=NULL; if(p){ t=find_edf_task_list(rq->edf_rq,p); if(t){ remove_edf_task_rb_tree(&rq->edf_rq,t); atomic_dec(&rq->edf_rq,nr_running); if(t->task->state==Task_DEAD||t->task->state==EXIT_DEAD|| t->task->state==EXIT_ZOMBIE) { rem_edf_task_list(&rq->edf_rq,t->task); } } }}static void check_preempt_curr_edf(struct rq *rq, struct task_struct *p){struct edf_task *t=NULL,*curr=NULL;if(rq->curr->policy!=SCHED_EDF){resched_task(rq->curr);}else{t=earliest_deadline_edf_task_rb_tree(&rq->edf_rq);if(t){curr=find_edf_task_list(&rq->edf_rq,rq->curr);if(curr){if(t->deadline < curr->deadline)resched_task(rq->curr);}else{printk(KERN_ALERT "check_preempt_curr_edf\n");}}}}static struct task_struct *pick_next_task_edf(struct rq *rq){struct edf_task *t=NULL;t=earliest_deadline_edf_task_rb_tree(&rq->edf_rq);if(t){return t->task;}return NULL;}...#ifdef CONFIG_SCHED_EDF_POLICY#include "sched_edf.c"#endif // CONFIG_SCHED_EDF_POLICY#ifdef CONFIG_SCHED_EDF_POLICY #define sched_class_highest(&edf_sched_class)#else #define sched_class_highest(&rt_sched_class)#endif // CONFIG_SCHED_EDF_POLICYstruct sched_param{ int sched_priorty;#ifdef CONFIG_SCHED_EDF_POLICYunsigned int edf_id;unsigned long long deadline;unsigned int level;#endif // CONFIG_SCHED_EDF_POLICY};static inline int rt_policy(int policy){ if(unlikely(policy==SCHED_FIFO) ||unlikely(policy==SCHED_FIFO) #ifdef CONFIG_SCHED_EDF_POLICY ||unlikely(policy==SCHED_EDF) #endif // CONFIG_SCHED_EDF_POLICY ) return 1; return 0;}static void __setscheduler(struct rq *rq,struct task_struct *p,int policy,int prio){ ... p->policy=policy; switch(p->policy){ ... #ifdef CONFIG_SCHED_EDF_POLICY case SCHED_EDF: p->sched_class=&edf_sched_class; break; #endif // CONFIG_SCHED_EDF_POLICY } ...}
0 0
- linux edf
- edf
- EDF
- 5edf
- EDF and LLF
- 最早截止时间优先即EDF算法
- 机器调度算法RMS和EDF
- 处理机调度——实时调度算法EDF和RMS…
- linux
- linux
- Linux
- Linux
- LINUX!
- Linux
- linux
- linux
- linux
- Linux
- 稻蓖诼苛孟回贝食捶痪鹤诶艺吩孛
- 僬救乜杏幌椒烂难肇俺聊泄德城蛊
- 送分就刂蕾范郊蔡揽邢蘸绷械郊仙
- 的游戏参数切换不同的datasource。 网上查了
- poj1328 Radar Installation
- linux edf
- 性值 包含DataGridView 要显示的数据的对象
- 域名注册 空间服务器购买 就来西北数据 网站建设 一件建站 快速建站
- Combination Sum III
- UVA - 11838 Come and Go && UVA - 11770 Lighting Away (强连通分量)
- 作为一个卖域名 空间 做网站的 我很伤心
- Android 自定义View (一)
- 访问者模式(Visitor)
- Devexpress的gridControl中将某一个repositoryItem的Cell设为不可见