Linux kernel kthreads、workqueues、tasklet:用于调度上下文开关上的工作

Linux kernel kthreads、workqueues、tasklet:用于调度上下文开关上的工作,linux-kernel,kernel,scheduler,context-switch,Linux Kernel,Kernel,Scheduler,Context Switch,我有一项工作需要从context\u开关(原子上下文)和scheduler\u勾选(也是原子上下文)进行调度。此工作函数需要对调用进程“task\u struct进行操作,以确定此进程的最佳频率,并将其存储在进程“task\u struct中,以便在下次调度时,内核可以设置计算出的频率 现在,改变频率被认为是一种可能导致睡眠的操作。这意味着我不能直接从context\u开关调用我的work函数,而是必须设置一个workqueue或tasklet 考虑到我希望如何更改上下文切换的频率,以及我必须如

我有一项工作需要从
context\u开关
(原子上下文)和
scheduler\u勾选
(也是原子上下文)进行调度。此工作函数需要对调用进程“
task\u struct
进行操作,以确定此进程的最佳频率,并将其存储在进程“
task\u struct
中,以便在下次调度时,内核可以设置计算出的频率

现在,改变频率被认为是一种可能导致睡眠的操作。这意味着我不能直接从
context\u开关
调用我的work函数,而是必须设置一个workqueue或tasklet

考虑到我希望如何更改上下文切换的频率,以及我必须如何创建一个流程来为自己进行切换,以及这将如何涉及上下文切换本身,我不确定如何继续

详细说明:
假设有2个进程当前正在使用PIDs 1000、2000运行。 我用“->”表示上下文切换,用500表示工作队列/tasklet进程

我们很可能会以这样的方式结束:
1000->2000->500(为PID 2000设置)->1000->500(为PID 2000设置 PID 1000)->2000->500(设置为PID 2000)

换句话说,当上下文从1000切换到2000时,
context\u switch
将我的工作函数安排为新流程(2000)计算和/或更改频率。这可能涉及到对我的进程的上下文切换(500)。一旦这个过程完成,我们可能会切换回1000,这将涉及重新安排我的过程(500)等等。这个例子的要点是,在某些情况下,我们可能会在没有实际工作的情况下切换很多次

我相信我可以用来解决这个问题的一个难题是,如果我的进程在引导后有一个固定的PID。然后,我可以更新
context\u开关
代码,说:

if(next->pid != my_worker_pid)
    schedule_work(next);
请注意,以上只是伪代码,因为我不知道应该使用哪个接口

在内核中设置应该在上下文开关上进行的工作的正确方法是什么