当前位置: 首页 > 面试题库 >

可以在Linux上实现正确的故障安全过程共享屏障吗?

卫甫
2023-03-14
问题内容

在过去的问题中,我询问了如何在不破坏种族的情况下实现pthread屏障:

从迈克尔·伯尔(Michael
Burr)那里获得了针对过程本地障碍的完美解决方案,但是对于过程共享的障碍却没有。我们后来研究了一些想法,但从未得出令人满意的结论,甚至没有开始涉及资源故障案例。

在Linux上能否制造出满足以下条件的障碍:

  • 进程共享的(可以在任何共享内存中创建)。
  • 在屏障等待函数返回后,可以安全地从任何线程取消映射或破坏屏障。
  • 由于资源分配失败而无法失败。

Michael尝试解决共享过程的案例(请参阅链接的问题),不幸的是,必须在等待时分配某种系统资源,这意味着等待会失败。尚不清楚在屏障等待失败时调用方可以采取何种合理措施,因为屏障的全部意义在于,在其余N-1线程到达该线程之前,继续进行操作是不安全的…

内核空间解决方案可能是唯一的方法,但即使这样也很困难,因为信​​号可能会中断等待,而没有可靠的方法来恢复等待。


问题答案:

与bdonlan在SO聊天上进行了长时间的讨论之后,我想我有一个解决方案。基本上,我们将问题分为两个自同步释放问题:销毁操作和取消映射。

处理破坏很容易:只需使pthread_barrier_destroy函数等待所有服务员停止检查障碍即可。这可以通过在屏障中使用计数,在进入/退出等待函数时原子递增/递减以及使destroy函数旋转以使计数达到零来完成。(如果您在使用计数的高位或类似位置贴上一个服务员标志,则也可以在此处使用futex,而不仅仅是旋转)。

处理取消映射也很容易,但也可以是非本地的:通过在syscall包装器中添加锁定,确保在屏障侍者退出过程中不会出现munmapmmap带有MAP_FIXED标志。这需要一种特殊的读写器锁。最后一个到达障碍的服务员应抓住munmaprw锁上的读锁,当最后一个服务员退出时(当减少用户计数时,计数为0时),该锁将被释放。munmap并且mmap可以通过使Writer锁递归来使其成为可重入的(如某些程序可能期望的那样,即使POSIX不需要它)。实际上,一种读写器是完全对称的,并且每种类型的锁都排除相反类型的锁,但不是同一类型的锁应该是最好的。



 类似资料:
  • YAML模式被定义为一组标签的组合,并包括用于解析非特定标签的机制。 YAML中的故障安全模式以这样的方式创建,即它可以与任何YAML文档一起使用。 它也被视为通用YAML文档的推荐架构。 类型 故障安全模式有两种类型:通用映射和通用序列。 通用映射 它代表一个关联容器。 这里,每个键在关联中是唯一的,并且映射到恰好一个值。 YAML对键定义没有任何限制。 下面给出了表示通用映射的示例 - JSO

  • 本文向大家介绍Java中故障快速和故障安全之间的区别,包括了Java中故障快速和故障安全之间的区别的使用技巧和注意事项,需要的朋友参考一下 序号 键 不及格 故障安全 1 例外 集合中的任何更改(例如在线程期间添加,删除和更新集合)都是迭代集合,然后使快速抛出并发修改异常失败。  故障安全集合不会引发异常。  2。 集合类型 ArrayList和hashmap集合是快速失败迭代器的示例  Copy

  • 我在Pycharm上创建了一个项目,将selenium to文件夹添加到我的新项目“selenium”中,并将chromedriver添加到该文件夹中。 我能做什么?

  • 5.3.1. 软盘的可靠性 对于第一次安装 Debian 的人来说,他们遇到的最大的问题很可能是软盘的可靠性。 问题出现最严重的是糟糕的引导软盘,因为他们由硬件直接读出,然后才进入 Linux 引导。很多情况 下,硬件驱动的读取并不能像 Linux 软盘驱动读取那样可靠,并且对于读到错误的数据,它们只是停 止运行并且打印一条错误的消息。驱动软盘的错误只是打印出很多有关的 I/O 错误。 如果你已经

  • 对于第一次安装 Debian 的人来说,他们遇到的最大的问题很可能是软盘的可靠性。 问题出现最严重的是糟糕的引导软盘,因为他们由硬件直接读出,然后才进入 Linux 引导。很多情况 下,硬件驱动的读取并不能像 Linux 软盘驱动读取那样可靠,并且对于读到错误的数据,它们只是停 止运行并且打印一条错误的消息。驱动软盘的错误只是打印出很多有关的 I/O 错误。 如果你已经在特定的软盘上陷入麻烦之中,

  • 5.3.1. 软盘的可靠性 对于第一次安装 Debian 的人来说,他们遇到的最大的问题很可能是软盘的可靠性。 问题出现最严重的是糟糕的引导软盘,因为他们由硬件直接读出,然后才进入 Linux 引导。很多情况 下,硬件驱动的读取并不能像 Linux 软盘驱动读取那样可靠,并且对于读到错误的数据,它们只是停 止运行并且打印一条错误的消息。驱动软盘的错误只是打印出很多有关的 I/O 错误。 如果你已经