如何在FreeBSD中停止所有内核并在所有内核上运行我的代码(在内核空间中)?

时间:2015-01-16 15:38:05

标签: operating-system kernel scheduler freebsd multicore

在FreeBSD内核中,如何首先停止所有内核,然后在所有内核上运行我的代码(可以是内核模块)?此外,完成后,我可以让他们恢复上下文并继续执行。

Linux有这样的API,我相信FreeBSD也有一套API可以做到这一点。


编辑:

我很可能没有说明我想做什么。首先,该机器是x86_64 SMP。 我在时间结束时设置了一个计时器;停止所有核心上的所有线程(包括内核线程);保存上下文;在一个核心上运行我的代码来做一些内核工作;完成后,恢复上下文并让它们继续运行;定期。其他内核线程和进程不受影响(不改变其相对优先级)。

1 个答案:

答案 0 :(得分:1)

我认为你的代码" (内核模块)实际上已经在本质上利用了SMP。

因此,您可以采取的一种方法是:

  • 将所有进程/线程的亲缘关系设置为所需的cpus(sched_setaffinity
  • 设置每个线程以使用实时(RT)调度。

如果是内核模块,您可以在模块中手动执行此操作(我相信),在将每个进程固定到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}}

效果将是:您的代码将在系统中的任何其他非必要进程之前运行,直到您的代码完成。