Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 阻止计划任务_Linux Kernel_Scheduling - Fatal编程技术网

Linux kernel 阻止计划任务

Linux kernel 阻止计划任务,linux-kernel,scheduling,Linux Kernel,Scheduling,我有一个sysfs接口,当写入该接口时,在满足某些条件之前,应防止执行写入任务 解除阻止的条件如下所示: if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) { // Unblock task and let it run again } 由于条件的性质,我不认为计划超时是正确的使用机制;或者至少,我还没有弄清楚如何使用它,然后取消等待时间/适当地向流程发送信号 我还尝试在sysfswrite上手动执行

我有一个
sysfs
接口,当写入该接口时,在满足某些条件之前,应防止执行写入任务

解除阻止的条件如下所示:

if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
    // Unblock task and let it run again
}
由于条件的性质,我不认为
计划超时
是正确的使用机制;或者至少,我还没有弄清楚如何使用它,然后取消等待时间/适当地向流程发送信号

我还尝试在
sysfs
write上手动执行以下操作:

...
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
...
然后当条件满足时:

if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
    set_task_state(tsk, TASK_RUNNING);
}
这导致:
BUG:scheduling while-atomic:dummyThread/2622/0x00000002

鉴于,
schedule\u timeout
的逻辑几乎完全相同,我怀疑它也会导致相同的
BUG:scheduling while atomic:…
错误

我还尝试了
deactivate_task
activate_task
方法,但它们会在调度器的
pick_next_task
链中导致内核死机。如果需要,我将重新实现它并发布堆栈跟踪

在满足某些条件之前,阻止任务运行的正确方法是什么?

schedule\u timeout()
是用于定时等待的良好底层函数


但是
set\u task\u state()
对于唤醒来说是一个糟糕的选择:这个函数主要用于当前线程。相反,使用
wake\u-up\u-process
wake\u-up\u-state

可能是一个愚蠢的问题,但据我所知,您试图写入的用户空间进程在允许之前应该无法再次写入。如果是这样,为什么不阻止写入方法中的I/O?通过这种方式,您可以阻止写入程序,直到您的条件得到满足,可能是数据可用或其他任何情况。在知道I/O操作(写操作)已经被允许阻塞的情况下手动更改任务状态似乎有点奇怪,除非指定了O_NONBLOCK?那么一个简单的信号灯就行了?我同意。这应该是直截了当的。然而,获取信号量最终会导致调用
schedule()
,在我的例子中,这将导致
错误:调度而原子:…
。这很有效!事实证明,我从
fs/proc/base.c
中的另一个函数借用的锅炉板代码让我调用
schedule\u timeout
get\u proc\u task()和
task\u lock()的逻辑。一旦我把我的代码移到了这个范围之外,事情就顺利进行了,而不会引起
BUG:scheduling while atomic:…