【问题标题】:Does OpenBSD support parallel Kernel accessOpenBSD 是否支持并行内核访问
【发布时间】:2021-07-14 12:33:06
【问题描述】:
我试图弄清楚多个进程或线程是否可以执行并发系统调用,而其中一个不休眠。
也就是说:OpenBSD 是否使用类似Big Kernel Lock 的东西。
可以预期,并行内核访问是可能的。我试图查看系统调用接口(代码阅读和内核调试),但没有发现任何让我印象深刻的BKL。
但是,当我查看fork syscall implementation 时,在我看来,某些全局数据是在没有锁定的情况下访问的(例如 nprocesses)。我想知道,调度程序(?)是否以某种方式阻止了并行系统调用,或者我是否忽略了某些东西。
那么:OpenBSD 是否支持并行内核访问?其他 BSD 呢?
【问题讨论】:
标签:
multithreading
kernel
system-calls
bsd
openbsd
【解决方案1】:
确实,OpenBSD 有一个相当古老的模型,它使用优先级,每个子系统都不同。见spl(9)。
该机制最初允许一些抢占,但仅限于更高优先级的中断。当然,在现代实现中,优先级是由互斥锁实现的。
调度器使用splsched。
因此,有几个锁,系统调用是并行发生的(跨不同的 CPU),但由于这些锁在某些点上会序列化,具体取决于它们跨越的子系统边界。换句话说,永远不会有两个线程同时运行来自同一个子系统的代码。当然,如果锁被拆分或更换,这可能会随时改变。
其他系统:
- 这是继承自 NetBSD,所以大致相同。
-
FreeBSD 已过渡到更精细的方法,其中一些部分是无锁的,就像 Linux。
-
DragonflyBSD 通过提供用于同步的序列化令牌以及对关键机制(如内存分配(用户空间和内核))的固有无锁方法,对 FreeBSD 进行了改进。