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