multithreading - OpenBSD 是否支持并行内核访问
问题描述
我试图弄清楚多个进程或线程是否可以执行并发系统调用,而其中一个不休眠。也就是说:OpenBSD 是否使用了Big Kernel Lock之类的东西。
可以预期,并行内核访问是可能的。我试图查看系统调用接口(代码阅读和内核调试),但没有发现任何让我印象深刻的东西BKL。但是,当我查看fork 系统调用实现时,在我看来,一些全局数据是在没有锁定的情况下访问的(例如 nprocesses)。我想知道,调度程序(?)是否以某种方式阻止了并行系统调用,或者我是否忽略了某些东西。
那么:OpenBSD 是否支持并行内核访问以及其他 BSD 呢?
解决方案
实际上,OpenBSD 有一个相当古老的模型,它使用优先级,每个子系统都不同。见spl(9)
。
该机制最初允许一些抢占,但仅限于更高优先级的中断。当然,在现代实现中,优先级是由互斥锁实现的。
调度程序使用splsched
.
因此,有几个锁,系统调用并行发生(跨不同的 CPU),但由于这些锁在某些点上进行序列化,具体取决于它们跨越的子系统边界。换句话说,永远不会有两个线程同时运行来自同一个子系统的代码。当然,如果锁被拆分或更换,这可能会随时改变。
其他系统:
- 这是从NetBSD继承的,所以大致相同。
- FreeBSD已经过渡到更细粒度的方法,其中一些部分是无锁的,就像 Linux 一样。
- DragonflyBSD通过提供用于同步的序列化令牌以及对关键机制(如内存分配(用户空间和内核))的固有无锁方法来改进 FreeBSD。
推荐阅读
- json - 输入是一个列表,输出是列表中嵌套字典的形式
- r - 如何获得两个向量之间匹配的元素比例?
- google-sheets - 在谷歌表格中,有没有办法在跨越多年的月度数据表中输出每年列出的最后一个月的值?
- google-chrome - ERR_TIMED_OUT 仅适用于 Chrome 和 Mozilla 上的 HTTPS 请求
- html - 如何围绕这个形状制作这个css-border?
- c# - UserPrincipal.GetGroups() 方法在更改 DomainController 后抛出异常
- swift - 覆盖符合 associatedtype 的基类的类型
- python - 使用 Microsoft Translate API 将文本从一种语言转换为另一种语言的 Python 代码
- javascript - 异步/等待过程的可变结果:我们总是等待它吗?
- php - 从 python 文件调用 PHP 脚本会产生错误 /bin/sh: path: Permission denied