OpenBSD 是否支持并行内核访问

问题描述

我试图弄清楚是否多个进程或线程可以执行并发系统调用,而其中一个不休眠。 也就是说:OpenBSD 是否使用类似 Big Kernel Lock 的东西。

人们期望并行内核访问是可能的。我试图查看系统调用接口(代码读取和内核调试),但没有发现任何让我觉得 BKL 的东西。 但是,当我查看 fork syscall implementation 时,在我看来,某些全局数据是在没有锁定的情况下访问的(例如 nprocesses)。我想知道,调度程序 (?) 是否以某种方式阻止了并行系统调用,或者我是否忽略了某些东西。

那么:OpenBSD 是否支持并行内核访问以及其他 BSD 怎么样?

解决方法

确实,OpenBSD 有一个相当古老的模型,它使用优先级,每个子系统都不同。见spl(9)

该机制最初允许一些抢占,但仅限于更高优先级的中断。当然,在现代实现中,优先级是由互斥锁实现的。

调度程序使用 splsched

因此,有几个锁,系统调用并行发生(跨不同的 CPU),但由于这些锁在某些点上进行序列化,具体取决于它们跨越的子系统边界。换句话说,永远不会有两个线程同时运行来自同一个子系统的代码;当然,如果锁被拆分或替换,这可能随时改变。

其他系统:

  • 这是从 NetBSD 继承而来的,因此大致相同。
  • FreeBSD 已过渡到更精细的方法,其中某些部分是无锁的,很像 Linux。
  • DragonflyBSD 通过提供用于同步的序列化令牌,以及对内存分配(用户空间和内核)等关键机制的固有无锁方法,对 FreeBSD 进行了改进。