本文共 938 字,大约阅读时间需要 3 分钟。
void __sched yield(void) 用于让当前进程释放其占用的cpu资源,以便让其他进程有机会执行.但是kernel 并不推荐直接调用这个函数其使用的例子如下:static u16 hfa384x_allocate_fid(struct net_device *dev, int len){ u16 fid; unsigned long delay; delay = jiffies + HFA384X_ALLOC_COMPL_TIMEOUT; while (!(HFA384X_INW(HFA384X_EVSTAT_OFF) & HFA384X_EV_ALLOC) && time_before(jiffies, delay)) yield();}其源码分析如下:可见这个函数主要做了两件事情void __sched yield(void){#虽然让出cpu了,但是当前task的状态还是设置为TASK_RUNNING set_current_state(TASK_RUNNING);#调用系统调用来让出cpu,其实在这个系统调用中是直接调用schedule 函数 sys_sched_yield();}SYSCALL_DEFINE0(sched_yield){ struct rq_flags rf; struct rq *rq; local_irq_disable(); rq = this_rq(); rq_lock(rq, &rf); schedstat_inc(rq->yld_count); current->sched_class->yield_task(rq); /* * Since we are going to call schedule() anyway, there's * no need to preempt or enable interrupts: */ preempt_disable(); rq_unlock(rq, &rf); sched_preempt_enable_no_resched();#这个系统调用的核心就是调用schedule来让出cpu schedule(); return 0;}
转载地址:http://hejmi.baihongyu.com/