- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是一名嵌入式程序员,尝试使用 Visual Studio 2010 和 MingW(作为两个独立的构建环境)在 Win32 环境中模拟实时抢占式调度程序。我对 Win32 调度环境非常熟悉,并且在我尝试做的事情上遇到了麻烦。我并不是要实现实时行为——只是为了让模拟任务以与在真实目标硬件上相同的顺序和顺序运行。
被模拟的实时调度程序有一个简单的目标 - 始终执行能够运行的最高优先级任务(线程)。一旦任务变得能够运行 - 如果它的优先级高于当前正在运行的任务,它必须抢占当前正在运行的任务。由于正在等待的外部事件或超时/阻塞时间/ sleep 时间到期,任务可以运行 - 带有生成时基的滴答中断。
除了这种抢占行为之外,任务可以让出或自愿放弃其时间片,因为它正在执行 sleep 或等待类型的功能。
我通过为正在模拟的实时调度程序创建的每个任务创建一个低优先级 Win32 线程来模拟这一点(该线程有效地执行调度程序将在真实嵌入式目标上执行的上下文切换),一个中等优先级的 Win32 线程作为伪中断处理程序(处理模拟的滴答中断并产生使用 Win32 事件对象向其发出信号的请求),以及一个更高优先级的 Win32 线程来模拟生成滴答中断的外设。
当伪中断处理程序确定应该发生任务切换时,它使用 SuspendThread() 挂起当前正在执行的线程,并使用 ResumeThread() 恢复执行新选择任务的线程。在可能创建的许多任务及其相关联的 Win32 线程中,只有一个管理该任务的线程在任何时候都将脱离挂起状态。
重要的是挂起的线程在调用 SuspendThread() 时立即挂起,并且伪中断处理线程在通知它中断挂起的事件发出信号时立即执行 - 但这不是我看到的行为。
作为我已经解决的一个示例问题:当任务/线程产生时,yield 事件被锁定在一个变量中,并且中断处理线程被发出信号,因为存在需要处理的伪中断(yield)。现在在我习惯于编程的实时系统中,我希望中断处理线程在收到信号后立即执行,因为它比发出信号的线程具有更高的优先级。我在 Win32 环境中看到的是,发出信号的线程在被挂起之前会持续一段时间 - 要么是因为在发出信号的更高优先级线程开始执行之前需要一些时间,要么是因为挂起需要一些时间实际停止运行的任务 - 我不确定是哪个。在任何情况下,通过在向 Win32 中断处理线程发出信号后在信号量上阻塞信号量,并让中断处理 Win32 线程在完成其功能(握手)后解除对线程的阻塞,这可以很容易地纠正。有效地使用线程同步来强制调度模式满足我的需要。为此,我正在使用 SignalObjectAndWait()。
使用这种技术,当被模拟的实时调度程序在合作模式下运行时,模拟工作完美 - 但不是(根据需要)在抢占模式下。
抢占式任务切换的问题我猜是一样的,任务在被告知挂起之后会继续执行一段时间,然后才真正停止运行,所以当运行的线程时,系统不能保证保持一致状态任务暂停。但是在抢占式情况下,因为任务不知道它何时会发生,所以不能使用使用信号量来防止 Win32 thead 继续直到下一次恢复的相同技术。
有没有人把这篇文章写到这么远——抱歉它的长度!
我的问题是:
最佳答案
如果您需要自己进行调度,那么您可以考虑使用 fibers而不是线程。纤程就像线程,因为它们是单独的可执行代码块,但是纤程可以在用户代码中调度,而线程仅由操作系统调度。单个线程可以托管和管理多个纤程的调度,纤程甚至可以相互调度。
关于c - 根据优先级强制 Win32 线程调度到定义的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218437/
我有一个带有一些功能的perl对象。每个功能从主程序中调用一次。我想并行运行某些功能以节省时间。由于某些功能取决于先前功能的结果,因此我无法将它们全部一起运行。 我想到了这样的事情: 对于每个函数,保
首先,我的代码在这里: import schedule # see https://github.com/dbader/schedule import crawler def job(): p
从 11 月 1 日开始,我必须使用quartz调度程序每4个月安排一次任务。我使用 cronExpression 来实现同样的目的。但 cronExpression 每年都会重置。所以我的任务将在
我有以下代码块,它调用两个请求,但略有延迟。 final ActorRef actor1 = getContext().actorOf( ActorClass.prop
考虑到 Linux 的情况,我们为每个用户堆栈都有一个内核堆栈,据我所知,每当发生上下文切换时,我们都会切换到当前进程的内核模式。 这里我们保存当前进程的当前状态,寄存器,程序数据等,然后调度器(不确
我有将东西移植到 OpenBSD 的奇怪爱好。我知道它有 pthreads 问题,但在 2013 年 5 月发布版本之前我不会升级。我使用的是 5.0,我对 pthreads 还很陌生。我已经学习了
给定一组任务: T1(20,100) T2(30,250) T3(100,400) (execution time, deadline=peroid) 现在我想将截止日期限制为 Di = f * Pi
使用 Django 开发一个小型日程安排 Web 应用程序,在该应用程序中,人们被分配特定的时间与他们的上级会面。员工存储为模型,与表示时间范围和他们有空的星期几的模型具有 OneToMany 关系。
我想了解贪婪算法调度问题的工作原理。 所以我一直在阅读和谷歌搜索一段时间,因为我无法理解贪心算法调度问题。 我们有 n 个作业要安排在单个资源上。作业 (i) 有一个请求的开始时间 s(i) 和结束时
这是流行的 El Goog 问题的变体。 考虑以下调度问题:有 n 个作业,i = 1..n。有 1 台 super 计算机和无限的 PC。每个作业都需要先经过 super 计算机的预处理,然后再在P
假设我有一个需要运行多次的蜘蛛 class My_spider(Scrapy.spider): #spider def 我想做这样的事 while True: runner = Cra
我已将 podAntiAffinity 添加到我的 DeploymentConfig 模板中。 但是,pod 被安排在我预计会被规则排除的节点上。 我如何查看 kubernetes 调度程序的日志以了
我已经使用 React - Redux - Typescript 堆栈有一段时间了,到目前为止我很喜欢它。但是,由于我对 Redux 很陌生,所以我一直在想这个特定的话题。 调度 Redux 操作(和
我想按照预定的计划(例如,周一至周五,美国东部时间晚上 9 点至 5 点)运行单个 Azure 实例以减少账单,并且想知道最好的方法是什么。 问题的两个部分: 能否使用服务管理 API [1] 按预定
假设最小模块安装(为了简单起见),Drupal 的 index.php 中两个顶级功能的核心“职责”是什么? ? drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); me
我正在尝试使用 Racket(以前称为 PLT Scheme)连接 URL 调度。我查看了教程和服务器文档。我不知道如何将请求路由到相同的 servlet。 具体例子: #lang 方案 (需要网络服
我想在 Airflow (v1.9.0) 上运行计划。 我的DAG需要在每个月底运行,但我不知道如何编写设置。 my_dag = DAG(dag_id=DAG_ID, cat
我正在尝试在“httpTrigger”类型函数的 function.json 中设置计划字段,但计时器功能似乎未运行。我的目标是拥有一个甚至可以在需要时进行调度和手动启动的功能,而不必仅为了调度而添加
我正在尝试制定每周、每月的 Airflow 计划,但不起作用。有人可以报告可能发生的情况吗?如果我每周、每月进行安排,它就会保持静止,就好像它被关闭一样。没有错误信息,只是不执行。我发送了一个代码示例
我希望每两周自动更新一次我的表格。我希望我的函数能够被 firebase 调用。 这可能吗? 我正在使用 Angular 2 Typescript 和 Firebase。 最佳答案 仅通过fireba
我是一名优秀的程序员,十分优秀!