问题标签 [preemption]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
43 浏览

c - 内核线程执行更多通信工作时出现不希望的延迟

我们开发了一个内核模块,其行为基本上类似于有线通信流量(eth,...) - WiFi 网桥。它定期将传入的有线数据转发到 WiFi,反之亦然。该系统由运行相同内核模块的两个设备组成。在某些情况下,我们会遇到不希望的延迟。

该模块启动一个内核线程,该线程基本上执行:

在正常操作期间,top命令显示:

当诊断被激活时,线程还会发送额外的诊断有线 eth 数据包。在这种模式下,从一侧到另一侧的设备 ping 从 5-6 毫秒到 45-900 毫秒。 top然后显示:

schedule()如果在 之前插入一个额外的usleep_range(),或者如果增加睡眠时间,它会大大减少延迟。我想我已经缩小范围得出结论,RX softirq 没有获得处理传入流量(NET_RX_SOFTIRQ)所需的调度时间。这是基于传输数据包的时间非常好这一事实。

我的问题是:

1:为什么ping时间会因为更多的工作而增加do_bridge_work()(更多的处理和额外的数据包传输)。是不是NET_RX_SOFTIRQ饿死了?

2:为什么schedule()插入additional时ping时间会减少,或者增加sleep时间?这是否意味着 200-500 us 不足以处理所有挂起的软中断工作,并且较低的软中断被饿死了?添加额外的效果是否与schedule()通过增加睡眠时间让其他人做更多的工作相同?

内核版本为 4.1.38,配置为 NO_HZ,PREEMPT = y。

0 投票
2 回答
180 浏览

linux-kernel - 当任务正在执行临界区但需要在禁用抢占的单处理器系统上调度时会发生什么?

这是一个场景。假设内核任务在禁用抢占的单处理器系统上运行。该任务获得自旋锁。现在它正在执行它的关键部分。这个时候,如果这个任务可用的时间片过期了,又要被调度出去怎么办?

  1. 是否spin_lock有防止这种情况发生的机制?
  2. 可以排期吗?如果是,那么临界区会发生什么?
  3. 它可以被 IRQ 中断吗?(假设禁用抢占)
  4. 这种情况可行吗?换句话说,这种情况会发生吗?

从内核代码中,我了解到 spin_lock 基本上是nop在禁用抢占的单处理器上。准确地说,它所做的只是barrier() 我理解它为什么是一个nop(因为它是一个单处理器,并且在那一刻没有其他任务可以处理数据)但我仍然不明白它是如何不间断的(由于 IRQ 或调度)。我在这里想念什么?指向表明这一点的 Linux 内核代码的指针可能真的很有帮助。

我的基本假设:

32 位 Linux 内核

0 投票
1 回答
261 浏览

java - 确保 CompletableFuture 回调中的代码在之后执行

说我有这个:

是否有任何保证 doSomethingB(); 总是在 doSomethingA(); 之前运行?有些东西通过线程抢占告诉我,虽然不太可能,但有可能 doSomethingA() 可以先运行?

0 投票
2 回答
497 浏览

apache-spark - 如何增加纱线上火花作业的容错性?作业因抢占过多而失败?

如何提高纱线的故障容限?在繁忙的集群中,我的工作由于失败太多而失败。大多数失败是由于Executor lost抢占式基地造成的。

0 投票
2 回答
213 浏览

anylogic - 版本 8 中是否可以使用 AnyLogic 结束任务抢占?

我在 AnyLogic 上运行一个仿真模型。我最近更新到版本 8 University 8.4.0。在我之前,我运行模拟没有问题。现在我在运行模拟一段时间后收到以下错误:

com.anylogic.libraries.processmodeling.ResourceUnitEndOfShiftTask cannot be cast to com.anylogic.libraries.processmodeling.ResourceUnitEntityServiceSubtask

我有意的建模选择是让员工在轮班结束时放弃他们正在做的事情。因此,对于模型中的三个资源池,我已将“班次结束”可能抢占字段设置为 True。但是,当我将这些更改为 false 时,模型运行时没有错误。有没有办法在 AnyLogic 版本 8 中完成任务抢占?

我试过谷歌搜索错误消息,但没有得到任何相关结果。我还尝试在 AnyLogic 文档中查找 ResourceUnitEndOfShiftTask 和 ResourceUnitEntityServiceSubtask,但找不到它们的任何条目。

*更新:我联系了 AnyLogic 支持(感谢 Felipe 的回答),是的,这是一个已知错误;将服务更改为不抢占其他任务暂时解决了该错误,但如果我希望任务能够抢占,这将是一个问题。

0 投票
0 回答
20 浏览

amazon-web-services - AWS 是先发制人的(用于 HTTP 结果回调)吗?

我对 AWS 的了解为零,我想找一个朋友,他是一名新手 Node.Js 编码器,并且有点超出他的深度。

他发送一个 HTTP 请求,然后调用一个需要一些时间来执行的函数。

如果 HTTP 响应在 long 函数仍在执行时到达:

  • 函数是否被中断并调用了 HTTP 回调?
  • 函数在回调执行之前完成吗?
  • 是否有多线程以便它们并行运行?

合作、抢先或多线程?它是哪一个?

0 投票
1 回答
814 浏览

slurm - SLURM QOS 抢占

我试图在我的 SLURM 19.05 集群中设置抢占,但我无法弄清楚如何让抢占按我的计划工作。

基本上,我有两个 QOS。

这些是我的抢占配置中的相关设置:

我的计划是让premium作业抢占normal作业,暂停normal作业,直到premium作业在集群中完成运行。

但是,我观察到的抢占似乎每 30 秒按顺序划分并暂停两个作业。我在配置文件中是否遗漏了什么,或者 SLURM 无法提供我计划的抢占,而我不希望对资源有任何时间片?

0 投票
1 回答
248 浏览

google-cloud-platform - 哪个 Google Compute Engine 服务器最不可能抢占我的虚拟机?

我正在运行一个需要数百个虚拟机的大型集群进程,但我的进程是容错的,因此我可以使用抢占式虚拟机。但是,在被抢占后重新启动进程需要花费几分钟的时间,所以我想选择最不忙/最不可能抢占我的虚拟机的谷歌服务器和区域。

有没有办法告诉哪个服务器最不忙或谷歌的哪些服务器使用最少?

参考:

我读了整本书,但没有帮助。我不太关心延迟,而是我的进程重新启动,它会浪费时间重新启动:https ://cloud.google.com/solutions/best-practices-compute-engine-region-selection

抢占式虚拟机谷歌文档:https ://cloud.google.com/compute/docs/instances/preemptible

谷歌区域: https ://cloud.google.com/compute/docs/regions-zones/

0 投票
1 回答
246 浏览

c - 为什么 spin_unlock_bh 函数在不调用调度程序的情况下启用抢占

我正在研究内核代码(版本 3.10.1)的自旋锁代码,但没有理解一件事。

当通过该函数获取自旋锁时spin_lock_bh(),它会继续调用preempt_disable(). 这与用于获取的其他自旋锁函数相同,例如spin_lock()spin_lock_irq()

但是当通过 释放锁时spin_unlock_bh(),它会调用preempt_enable_no_resched(),它会跳过调用调度程序来抢占。对于其他相应的释放函数(如spin_unlock()spin_unlock_irq()),情况并非如此。他们调用调用的常规preempt_enable()函数__schedule()​​。

0 投票
2 回答
3948 浏览

freertos - FreeRTOS:为什么要在 isrHandler 中调用 taskYIELD_FROM_ISR() 方法

我试图理解为什么用户必须调用该taskYIELD_FROM_ISR()方法以及为什么该方法中的 RTOS 不自动调用它xStreamBufferSendFromISR

我的问题是指FreeRTOS_Manual p。369.

我对场景的理解

前提条件

  • 有两个任务
    • Task1(高优先级)和 Task2(低优先级)
  • Task1 处于阻塞状态,等待 streamBuffer 输入
  • Task2 处于运行状态并从vAnInterruptServiceRoutine

在 ISR 内

  • ISR 方法调用xStreamBufferSendFromISR()
  • 这个调用意味着,Task1 的 Blocked-State 变为 Ready-State

案例 A 如果 ISR 方法现在正在返回,则不会调用调度程序,并且 Task2 会一直运行,直到时间片周期结束,然后调度程序会切换到高优先级 Task1。

案例 B 如果 ISR 方法taskYIELD_FROM_ISR(xHigherPriorityTaskWoken);最后调用,调度程序将被调用,返回 ISR 后,Task1 将运行而不是 Task2。

问题

  1. 是不是,Task2 将一直执行到一个时间片周期结束,或者任务切换是否还有另一个触发器?
  2. 为什么taskYIELD_FROM_ISR()调用时 RTOS 不自动调用该方法xStreamBufferSendFromISR()