【问题标题】:Writing atomic function编写原子函数
【发布时间】:2011-03-15 19:21:42
【问题描述】:

我想用C语言实现一个原子函数,这样在执行函数时进程或线程不会被抢占。

【问题讨论】:

  • 这是 Linux内核还是在用户空间?
  • 用户空间有可能吗?如果没有,那么如何在内核空间中完成。
  • 一般来说,这在抢占式多任务操作系统中是不可能的。可能会有一些奇怪的钩子让你这样做,但更重要的是要解决这个问题:你为什么要首先尝试这样做?
  • 我很好奇,那么信号量锁定和释放是如何工作的呢?
  • @Yogesh:主要使用利用特定硬件支持的内联汇编语言。不是通过使整个函数原子化。你心里有什么目标吗?如果是这样,请告诉我们更多信息。

标签: c linux compiler-construction operating-system linux-kernel


【解决方案1】:

你混淆了两件事:

  • “原子”表示操作似乎尚未运行或已完全完成。
  • “抢占”(松散地)意味着其他线程可以在您的内核上运行而无需您让步。

即使在非抢占式操作系统(例如经典 Mac OS)上,也不能保证事情是原子的:

  • 中断可能随时发生(除非您也禁用中断)。
  • 即使您禁用中断,其他内核上的代码也会运行。

了解为什么您认为需要原子操作也很有帮助。保护共享数据结构的最简单方法是使用锁。如果您在内核中,请阅读 Rusty Russell 的 Unreliable Guide to Locking(可能有点过时)。如果您在用户空间,只需使用 pthread 互斥锁。

【讨论】:

    【解决方案2】:

    如果你在内核中并且你真的需要禁用抢占(可能不是一个好主意,我希望你知道你在做什么)你可以使用preempt_disable()和@987654323 @(详见文档/preempt-locking.txt)。

    如果您在内核之外,您的选择将非常有限。大多数多进程或多线程应用程序所做的是创建互斥体,它们在访问共享资源时用于自我限制。 (想想典型的读写锁。)但这对于系统上的所有其他进程来说绝不是原子的。对于遵循相同协议的其他进程而言,它只是原子性的。

    (鉴于如今即使是超便宜的笔记本电脑也同时运行多个 CPU 内核,您在关键部分运行时阻止其他进程运行的目标注定会失败。)

    可以授予您的应用程序实时调度优先级,但这需要非常仔细编程,作为较低优先级的程序(例如 X 或 ssh 或 bash 或..) 除非让出处理器或执行阻塞 IO,否则不会运行。详情请见sched_setscheduler(2)

    【讨论】:

    • 信号量锁定和释放操作是如何工作的?
    • @Yogesh,如果你想知道如何使用 pthread 信号量,你应该从 pthread_mutex_init(3)pthread_mutex_lock(3)pthread_mutex_unlock(3) 的手册页开始。也许pthread_cond_signal(3) 如果您想使用条件变量而不是裸互斥体,这可能会更好地匹配您的问题域。如果你想自己学习如何实现这些原语,我建议阅读 Curt Schimmel 的 Unix Systems for Modern Architectures: Symmetric Multiprocessing and Caching for Kernel Programmers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多