问题标签 [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 投票
2 回答
188 浏览

linux-kernel - 当包含无限循环的函数在工作队列中排队时,linux如何处理?

我尝试在网上搜索但找不到完美的答案?为避免其他工作函数将永远等待这个无限循环结束的情况而遵循的过程的名称是什么

0 投票
0 回答
26 浏览

worker - linux如何检测占用CPU的进程应该被删除而不是抢占?

在工作队列中,如果一个函数正在占用系统(例如,运行一个无限循环),内核如何知道它正在占用系统并且它必须抢占或取消工作?

0 投票
1 回答
1823 浏览

algorithm - 创建基于优先级的循环算法

在这个问题中,我想开发一个基于优先级的循环算法来安排一些任务。

所需的输出是

有没有合适的算法来安排这个?它能够使用队列等数据结构。

我尝试使用 2PriorityQueues并且无法成功这是在 JAVA 中完成的,但它以大多数无所事事而告终。

这是我实现的接口

0 投票
0 回答
299 浏览

java - Java 中代码片段的 getCurrentThreadCpuTime 差异和 System.nanoTime() 差异的巨大差异

JVM 启动时启用了详细的 GC 日志开关,并且在运行上述代码时没有 GC 日志。那么我们是否可以得出结论,如果实际延迟和经过的 CPU 时间之间存在巨大差异,那么线程被操作系统抢占了?

我观察到巨大的差异:延迟超过 1 秒和 timeElpasedCPU 几毫秒。

0 投票
2 回答
773 浏览

multithreading - 为什么内核抢占只有在 preempt_count == 0 时才是安全的?

Linux 内核 2.6 引入了一个新的 per-thread 字段——preempt_count——每当获取/释放锁时,该字段就会递增/递减。该字段用于允许内核抢占:“如果设置了need_resched 并且preempt_count 为零,则更重要的任务是可运行的,并且抢占是安全的。”

根据 Robert Love 的《Linux 内核开发》一书:“那么什么时候重新调度是安全的?只要内核不持有锁,内核就能够抢占内核中运行的任务。”

我的问题是:为什么在该任务持有锁时抢占内核中运行的任务不安全?

如果另一个任务被调度并试图获取锁,它将阻塞(或旋转直到它的时间片结束),所以我们不会同时让两个线程进入同一个临界区。如果我们确实抢占了在内核模式下持有锁的任务,任何人都可以概述一个有问题的场景吗?

谢谢!

0 投票
1 回答
113 浏览

kubernetes - Kubenetes pod 抢占可以在多个调度程序之间发生吗?

文档中我知道 Pod 必须由一个调度程序调度。比如 scheduler Aschedule poda和 scheduler Bschedule pod b

问题是:如果已经在运行,可以a抢占吗?哪个调度器会做这个操作?bb

0 投票
1 回答
92 浏览

linux - 旧版 Linux 内核无法抢占的原因是什么?

为什么第一批 Linux 开发人员选择实现非抢占式内核?是为了保存同步吗?

据我所知,Linux 是在 90 年代初开发的,当时 PC 有一个处理器。在这样的 PC 中,非抢占式内核有什么优势?但是,为什么多核处理器会降低优势呢?

0 投票
1 回答
412 浏览

linux - linux 2.6调度和抢占——preempt_count的使用

问题前稍微讨论一下。Linux 2.4 内核是非抢占式的,所以如果我们在内核模式下进行系统调用时需要进行上下文切换,我们只需执行 set_need_resched 来引发一个标志,然后当我们返回用户模式时,我们检查标记并进行上下文切换。

让我们将其与具有抢占式内核的 linux 2.6 进行比较。我们不能只取 2.4 的内核并将 set_need_resched(提升标志)更改为 schedule()(重新调度的指令执行),因此在 linux 内核 2.6 中有一个计数器 preempt_count,它每次在 spin_lock() 上增加并在自旋解锁()。

实际上,这个字段“preempt_count”决定了内核是否可以被抢占。例如,在从时钟中断返回时,如果条件:

为真,则内核执行上下文切换。

问题是为什么 linux 2.6 的内核在持有自旋锁类型的锁时会阻止抢占。

如果内核不阻止抢占,可能会发生什么情况?你能给我一个尽可能详细的具体例子吗?

谢谢你。

0 投票
1 回答
693 浏览

c - 本机代码的抢占式多任务处理能否在 Linux 的用户空间中实现?

我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢先式多任务处理。(也就是说,在外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,然后恢复执行,所有这些都由用户空间编排,但使用可能进入内核的调用。)我认为这可以使用信号来完成SIGALRM和家庭的处理程序,*context()但事实证明整个*context()家庭都是异步信号不安全的,因此不能保证这种方法有效。我确实找到了一个实现这个想法的要点,所以显然它确实可以在 Linux 上工作,至少有时,即使 POSIX 不需要它工作。要点将此作为信号处理程序安装在 上SIGALRM,这使得几个*context()调用:

Linux 是否提供任何保证使这种方法正确?有没有办法让这个正确?有完全不同的方法可以正确地做到这一点吗?

(通过“在用户空间实现”我并不是说我们永远不会进入内核。我的意思是与内核实现的抢占式多任务对比。)

0 投票
1 回答
510 浏览

go - 如何强制中断在预定滴答内花费太长时间的函数执行

f我已经编写了这个调度程序,但是当f花费的时间超过输入recurring时间间隔时,我无法让它“杀死”该输入函数。

如果那f是一个进程而不是线程,那么我正在寻找的这个东西可能是某种定义的硬抢占。

这个f定义是我无法控制的。它表示一个 ETL 作业,涉及在批处理执行期间处理来自多个数据库的数据。它f已被写入go并且工作正常,但我需要以某种方式对其进行某种控制,执行时间过长。

我知道f是原子的,所以它要么在执行结束时更改数据库,要么不更改。所以在时间过长的情况下,可以认为“杀死”它是安全的。

为了看看发生了什么,我编写了这个测试: