2

我希望进入操作系统内核开发,并认为我的贡献是扩展SANOS操作系统以支持多核机器。我一直在阅读有关操作系统的书籍 (Tannenbaum) 以及研究 BSD 和 Linux 如何应对这一挑战,但仍然停留在几个概念上。

  1. SANOS 在多个 CPU 上运行时是否需要更复杂的调度算法,或者当前使用的算法是否可以正常工作?

  2. 我知道线程与启动它们的内核具有亲和力是一个好主意,但是这是通过调度还是通过更改线程创建方式的实现来处理的?

  3. 需要考虑什么才能使 SANOS 可以在具有数百个内核的机器上运行?据我所知,BSD 和 Linux 最多只能支持十几个内核。

4

1 回答 1

4

你的阅读材料很好。所以那里没有问题。还可以看看斯坦福大学关于操作系统设计的 CS 可下载讲座。

  1. 调度算法可能需要更复杂。这取决于运行的应用程序的类型以及它们的贪婪程度。他们是屈服还是被迫屈服。那种事。这更多的是您的流程想要或期望什么的问题。RTOS 将具有比桌面更复杂的调度。
  2. 线程应该与一个核心具有亲和性,因为一个进程中的 2 个线程可以并行执行……但不能在同一个核心上同时实时执行。将它们放在不同的内核上可以让它们真正并行运行。缓存也可以针对核心亲和力进行优化。这实际上是您的线程实现和调度程序的混合。sched 可能希望确保线程在内核上同时启动,而不是临时启动以减少线程在彼此和事物上等待的时间量。如果你的线程库是用户空间的,它可能会分配核心,或者让调度程序根据容量或最近的死亡情况来决定。
  3. 可扩展性通常是内核限制(可以是任意的)。在 Linux 中,如果我记得,限制是由于在调度程序中保存 CPU 信息结构的数组的静态大小。因此它们是固定大小的。这可以通过重新编译内核来改变。大多数优秀的调度算法将支持非常大量的内核。随着您的核心或处理器数量越来越多,您需要注意不要过多地分割进程执行。如果一个程序有 2 个线程,请尝试将它们安排在接近时间的位置,因为它们之间可能存在因果关系(通过共享数据)。

您还需要决定如何实现线程,以及如何在内核中表示进程(无论是重的还是轻量的)。线程内核是否管理?用户空间管理?这些东西都会对调度器的设计产生影响。看看 POSIX 线程是如何在各种操作系统中实现的。你要考虑的东西太多了:)

简而言之,对于逻辑存在或应该存在的位置,并没有真正的直接答案。这完全取决于设计、应用程序期望、时间限制(在程序上)等等。

希望这会有所帮助,但是我不是这里的专家。

于 2009-05-19T11:06:33.850 回答