首页 > 解决方案 > OpenBSD 是否支持并行内核访问

问题描述

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

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

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

标签: multithreadingkernelsystem-callsbsdopenbsd

解决方案


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

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

调度程序使用splsched.

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

其他系统:

  • 这是从NetBSD继承的,所以大致相同。
  • FreeBSD已经过渡到更细粒度的方法,其中一些部分是无锁的,就像 Linux 一样。
  • DragonflyBSD通过提供用于同步的序列化令牌以及对关键机制(如内存分配(用户空间和内核))的固有无锁方法来改进 FreeBSD。

推荐阅读