在FreeBSD内核中,如何首先停止所有内核,然后在所有内核上运行我的代码(可以是内核模块)?此外,完成后,我可以让他们恢复上下文并继续执行。
Linux有这样的API,我相信FreeBSD也有一套API可以做到这一点。
我很可能没有说明我想做什么。首先,该机器是x86_64 SMP。 我在时间结束时设置了一个计时器;停止所有核心上的所有线程(包括内核线程);保存上下文;在一个核心上运行我的代码来做一些内核工作;完成后,恢复上下文并让它们继续运行;定期。其他内核线程和进程不受影响(不改变其相对优先级)。
答案 0 :(得分:1)
我认为你的代码" (内核模块)实际上已经在本质上利用了SMP。
因此,您可以采取的一种方法是:
sched_setaffinity
)如果是内核模块,您可以在模块中手动执行此操作(我相信),在将每个进程固定到SCHED_RR
(或SCHED_FIFO
)之后,将task_struct的调度策略更改为rtprio
核心。
在用户空间中,您可以使用FreeBSD rtprio, idprio -- execute, examine or modify a utility's or process's
realtime or idletime scheduling priority
命令(http://www.freebsd.org/cgi/man.cgi?query=rtprio&sektion=1):
{{1}}
效果将是:您的代码将在系统中的任何其他非必要进程之前运行,直到您的代码完成。