问题标签 [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 回答
190 浏览

process - mount 和 loop0 长时间抢占用户进程

我在用户空间创建了一些进程,并尝试通过使用trace-cmd记录的跟踪来可视化它在kernelshark中的工作。但是像下面显示的进程正在抢占我的进程,实时优先级为 98,长达 4 秒。这类进程甚至没有实时优先级

我可以做些什么来运行我的进程不受这些内核进程的干扰?

0 投票
2 回答
2063 浏览

c# - C#、线程优先级和锁

在 C# 中,如果一个高优先级任务已准备好执行并且另一个(低优先级)线程已经在监视器中,那么低优先级任务是否会在以下两种情况下被抢占:

  1. 较高优先级的任务想要获得一个(或多个)由低优先级任务获得的锁。
  2. 高优先级任务不需要低优先级任务获取的任何锁。

编译器/操作系统是否在任务抢占方面做了任何聪明的事情,还是总是高优先级任务总是抢占低优先级任务?

0 投票
0 回答
394 浏览

linux-kernel - 计算Linux中正在运行的进程的抢占次数

有没有办法从用户空间计算特定 PID 的抢占?我有兴趣衡量一个进程被抢占了多少次。

0 投票
0 回答
498 浏览

multithreading - 如何使内核线程抢占?

我编写了一个 C 代码程序,它创建了许多执行相同操作的线程(pthreads)。这些线程中的每一个都尝试获取一个公共互斥体(这些线程之间共享一个二进制信号量)。当第一个线程设法获取互斥锁时,所有其他线程在执行 sem_wait(down)操作时会发现它不可用(计数器为 0)。现在,我想在内核级别做同样的事情,使用一个使用 Kthreads 的内核模块。我发现,Linux 内核线程不是抢占式的(我的内核上没有启用抢占式),因此,只要第一个 kthread 获取公共信号量,其他 kthread 就什么也不做,直到它完成。因此,在对其执行向下操作时,没有 kthread 会发现互斥锁不可用。对于我的练习,我需要时不时地让互斥锁不可用,当我进行向下操作时,就像使用 posix 线程(用户级别)的版本一样。我得到的一个建议是使用 schedule() 函数,该函数由 kthread 调用并导致 cpu 调度另一个 kthread 执行。但是,我不确定如何使用它。我不太了解我在互联网上找到的内容,因为我是内核编码的新手。有没有人有一个关于如何使用 schedule() 来抢占内核线程的例子?

0 投票
1 回答
1749 浏览

task - RTOS:禁用任务抢占

我有一个与 RTOS 相关的查询。我们正在使用 Nucleus RTOS。但我的查询是通用的。假设如果一个任务正在执行并且如果它的抢占被禁用,那么这个任务本质上是不是原子的?我在这里要问的是,一旦禁用了任务的抢占,ISR 例程中断可以中断任务吗?禁用任务的抢占意味着,所有其他任务都不能中断正在执行的特定任务。那么,这种情况下的ISR会不会造成中断呢?并且通过禁用抢占,是否也意味着禁用ISR?

0 投票
1 回答
244 浏览

linux - 为什么在 linux 内核中 radix_tree_preload 返回并禁用抢占

我正在浏览一篇关于linux内核基数树实现的文章,文章链接如下:

http://lwn.net/Articles/175432/

在这篇文章中提到 radix_tree_preload 分配了足够的内存,以便后续插入树不会失败。尽管它基于每个 CPU 分配结构,因此该函数在禁用抢占的情况下返回。调用 radix_tree_preload_end 以启用抢占是调用者的责任。

我的问题是:

1) 为什么 radix_tree_preload 在每个 CPU 基础上分配结构?

2) 用户应该何时调用 radix_tree_preload_end?是在 radix_tree_insert 之后吗?

3)它不会影响性能,因为基数树用于页面缓存操作,因此任何插入都会导致抢占被禁用?如果我的理解有误,请纠正我。

0 投票
4 回答
15573 浏览

linux - 为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占

最近在看Linux Kernel Development,有几个关于禁用抢占的问题。

  1. 在第 7 章的“中断控制”部分,它说:

    此外,禁用中断也会禁用内核抢占。

    我还从书中读到内核抢占可能发生在以下情况:

    当中断处理程序退出时,在返回内核空间之前。
    当内核代码再次变得可抢占时。
    如果内核中的任务显式调用 schedule()
    如果内核中的任务阻塞(这导致调用 schedule())

    但我无法将禁用中断与这些情况联系起来。

  2. 据我所知,自旋锁会使用preempt_disable()函数禁用抢占。

    帖子究竟什么是“自旋锁”? 说:

    在单核机器上,自旋锁只是“禁用中断”或“提高 IRQL”,它完全阻止线程调度。

    preempt_disable()是否通过禁用中断来禁用抢占?

0 投票
1 回答
1397 浏览

linux - Linux内核线程的调度或抢占如何工作?

据我所知,与用户空间线程/进程相比,linux内核线程没有自己的地址空间。内核线程不会上下文切换到用户空间,但内核线程是可调度和可抢占的。所以我的问题是,如果内核线程没有地址空间,那么内核线程的切换/抢占如何工作?

0 投票
1 回答
440 浏览

multithreading - 测量任务在 linux 中 2 点之间花费的时间(任务分析)

我很快就会开始用头撞墙:

这真的很简单,我想测量一个任务在 2 个点之间花费的时间(在 Linux - 1 个核心 - 1 个 CPU 中)。在此期间,任务必须完全控制 CPU,并且不会被任何其他任务或硬件中断中断。

为了实现这一点,我创建了一个内核模块来确保满足上述标准。在这个内核模块中,我尝试:

首先,禁用 IRQ:

  • 我使用了 spin_lock_irqsave()/spin_lock_irqrestore() - 我认为这是确保所有本地中断都被禁用并且我的任务在关键区域期间拥有自己的 cpu 的正确方法。

然后,

  • 使用了 preempt_disable() -> 由于 current = my task,那么逻辑上内核应该继续运行我的任务,直到我重新启用抢占 -> 不起作用(my_task->nvcsw 和 my_task->nivcsw 显示发生了 csw ->我的任务被抢占了)

我试图通过将 my_task->prio 和 my_task->static_prio 更改为 1 -> 最高实时优先级(my_task->policy = SCHED_FIFO)来增加我的任务的优先级...

也没有工作(my_task->nvcsw 和 my_task->nivcsw 表明发生了 csw -> my-task 被抢占)并且 my_task->prio 得到了我认为的调度程序的新 prio (120)....

有什么方法可以确定地保证任务在 Linux 中不会被中断/抢占?有没有办法强制调度程序运行任务(短时间 50-500us)直到它完成?

这是我启用/禁用操作系统部分的代码(有问题的任务使用 procfs 在关键区域之前和之后发送启用/禁用命令并由此开关处理):

0 投票
1 回答
449 浏览

gpu - Kaveri 是符合 HSA 标准的处理器吗?

我查看了很多HSA 介绍,发现符合 HSA 的 GPU 应该是可抢占的并支持上下文切换。

但是维基百科的文章“ AMD Accelerated Processing Unit ”说 GPU 计算上下文切换,GPU 图形抢占将在 Carizzo APU (2015) 中得到支持。

所以我想知道 Kaveri 是否是符合 HSA 的处理器?

谢谢!