gpt4 book ai didi

c - 根据优先级强制 Win32 线程调度到定义的顺序

转载 作者:太空狗 更新时间:2023-10-29 17:21:48 27 4
gpt4 key购买 nike

我是一名嵌入式程序员,尝试使用 Visual Studio 2010 和 MingW(作为两个独立的构建环境)在 Win32 环境中模拟实时抢占式调度程序。我对 Win32 调度环境非常熟悉,并且在我尝试做的事情上遇到了麻烦。我并不是要实现实时行为——只是为了让模拟任务以与在真实目标硬件上相同的顺序和顺序运行。

被模拟的实时调度程序有一个简单的目标 - 始终执行能够运行的最高优先级任务(线程)。一旦任务变得能够运行 - 如果它的优先级高于当前正在运行的任务,它必须抢占当前正在运行的任务。由于正在等待的外部事件或超时/阻塞时间/ sleep 时间到期,任务可以运行 - 带有生成时基的滴答中断。

除了这种抢占行为之外,任务可以让出或自愿放弃其时间片,因为它正在执行 sleep 或等待类型的功能。

我通过为正在模拟的实时调度程序创建的每个任务创建一个低优先级 Win32 线程来模拟这一点(该线程有效地执行调度程序将在真实嵌入式目标上执行的上下文切换),一个中等优先级的 Win32 线程作为伪中断处理程序(处理模拟的滴答中断并产生使用 Win32 事件对象向其发出信号的请求),以及一个更高优先级的 Win32 线程来模拟生成滴答中断的外设。

当伪中断处理程序确定应该发生任务切换时,它使用 SuspendThread() 挂起当前正在执行的线程,并使用 ResumeThread() 恢复执行新选择任务的线程。在可能创建的许多任务及其相关联的 Win32 线程中,只有一个管理该任务的线程在任何时候都将脱离挂起状态。

重要的是挂起的线程在调用 SuspendThread() 时立即挂起,并且伪中断处理线程在通知它中断挂起的事件发出信号时立即执行 - 但这不是我看到的行为。

作为我已经解决的一个示例问题:当任务/线程产生时,yield 事件被锁定在一个变量中,并且中断处理线程被发出信号,因为存在需要处理的伪中断(yield)。现在在我习惯于编程的实时系统中,我希望中断处理线程在收到信号后立即执行,因为它比发出信号的线程具有更高的优先级。我在 Win32 环境中看到的是,发出信号的线程在被挂起之前会持续一段时间 - 要么是因为在发出信号的更高优先级线程开始执行之前需要一些时间,要么是因为挂起需要一些时间实际停止运行的任务 - 我不确定是哪个。在任何情况下,通过在向 Win32 中断处理线程发出信号后在信号量上阻塞信号量,并让中断处理 Win32 线程在完成其功能(握手)后解除对线程的阻塞,这可以很容易地纠正。有效地使用线程同步来强制调度模式满足我的需要。为此,我正在使用 SignalObjectAndWait()。

使用这种技术,当被模拟的实时调度程序在合作模式下运行时,模拟工作完美 - 但不是(根据需要)在抢占模式下。

抢占式任务切换的问题我猜是一样的,任务在被告知挂起之后会继续执行一段时间,然后才真正停止运行,所以当运行的线程时,系统不能保证保持一致状态任务暂停。但是在抢占式情况下,因为任务不知道它何时会发生,所以不能使用使用信号量来防止 Win32 thead 继续直到下一次恢复的相同技术。

有没有人把这篇文章写到这么远——抱歉它的长度!

我的问题是:

  • 我如何强制 Win32 (XP) 调度立即启动和停止调用挂起和恢复线程函数的任务 - 或者 - 我如何强制更高优先级的 Win32 线程立即开始执行它能够这样做(对象它被阻止了,并发出信号)。有效地强制 Win32 重新安排其正在运行的进程。
  • 当任务不在任务/线程顺序执行路径中时,是否有某种方法可以异步停止任务以等待事件。
  • 该模拟器在 Linux 环境中运行良好,在该环境中使用 POSIX 信号有效地中断线程 - 在 Win32 中是否有等价物?

  • 感谢任何花时间阅读这篇长文章的人,尤其是提前感谢任何可以牵着我的“实时工程师”手穿越这个 Win32 迷宫的人。

    最佳答案

    如果您需要自己进行调度,那么您可以考虑使用 fibers而不是线程。纤程就像线程,因为它们是单独的可执行代码块,但是纤程可以在用户代码中调度,而线程仅由操作系统调度。单个线程可以托管和管理多个纤程的调度,纤程甚至可以相互调度。

    关于c - 根据优先级强制 Win32 线程调度到定义的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218437/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com