【发布时间】:2011-12-03 10:52:20
【问题描述】:
我想知道是否有办法阻止内核空间中的用户空间任务?内核中是否已经为此提供了一个功能?我试过看,但到目前为止没有发现任何明显的东西。
【问题讨论】:
-
在这里屏蔽是什么意思?
-
停止执行以便稍后恢复。
标签: linux-kernel scheduling kernel
我想知道是否有办法阻止内核空间中的用户空间任务?内核中是否已经为此提供了一个功能?我试过看,但到目前为止没有发现任何明显的东西。
【问题讨论】:
标签: linux-kernel scheduling kernel
在 UP 中,这很简单:将任务状态设置为 TASK_INTERRUPTIBLE 并调用 schedule()。您可以稍后通过将其状态设置为 TASK_RUNNING 来“恢复”它。
在 SMP 中,您必须确保任务没有在另一个 CPU 上运行。
【讨论】:
看这个:
http://lxr.linux.no/linux+v3.0.4/include/linux/sched.h#L242
250/*
251 * This serializes "schedule()" and also protects
252 * the run-queue from deletions/modifications (but
253 * _adding_ to the beginning of the run-queue has
254 * a separate lock).
255 */
256extern rwlock_t tasklist_lock;
257extern spinlock_t mmlist_lock;
258
所以我们知道这个锁是用于同步访问以更新调度结构。改变任务运行状态,找个例子:
http://lxr.linux.no/linux+v3.0.4/kernel/signal.c#L1812
1769 read_lock(&tasklist_lock);
1809 __set_current_state(TASK_RUNNING);
1810 if (clear_code)
1811 current->exit_code = 0;
1812 read_unlock(&tasklist_lock
你只需要锁定/解锁tasklist_lock,并设置状态。
【讨论】: