进程调度API之yield

本文解析了sched_yield函数的作用及其实现原理,该函数用于使当前进程放弃CPU资源,以便其他进程有机会运行。文中通过具体示例代码展示了如何使用该函数,并详细分析了其背后的调度机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值