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

c - 线程程序与 Goto

我有一个由多个线程组成的系统,比如说进程 A、B 和 C,这些进程完全用 SDL 编写,最终在编译后转换为 C 语言。

我也有一个具有相同进程的等效模拟环境,它只在一个线程上运行,但模拟这些进程中的每一个。基本上,进程 A、B 和 C 中的每一个都使用一组不同的选项重新编译,并且以某种方式一切都作为一个进程运行(典型的 IBM-SDL 模拟)。这在理论上代表了真实过程的轻量级系统,并且一切都作为一个过程运行。现在在这个模拟环境中,可以生成三个文件,让我们说:-Ac Bc 和 Cc 显然在这个模拟中,没有进程抢占的空间。如果消息 X 到达进程 A,A 将完全处理此信号,然后进入下一个状态转换,只有当下一个信号进入系统时,下一个进程才会运行。

我正在尝试在这个没有线程的模拟系统中实现抢占。事实证明,在模拟中,这些文件中的每一个都可以被编辑(通过一些脚本),并且我知道在一个接一个地执行一组特定信号的过程中可能的确切抢占点。

我的问题是:- 如果我插入条件 goto / break 语句(假设每个 Ac、Bc 和 Cc 中的每一行)并在代码执行期间从一个文件跳转到另一个文件,我是否实现了模拟线程环境?

或者我在这里错过了什么?

我知道这是一个非常广泛的问题,而且我的操作系统知识不是很好。另外,我知道这种情况可能有很多条件起作用。但是让我们假设我找到了解决这些问题的方法。我的问题归结为:-如果“智能” goto 可以等效地用作单线程环境中多线程的替代品?时间对我来说不是问题,因为我正在使用模拟时间。系统负载等,没关系。我正在考虑在每个文件 Ac、Bc 和 Cc 的每个步骤之后添加一个控制函数调用,并且在这个控制函数中我可以检查我是否要返回,或者跳转到其他地方并继续从另一个文件执行。在这种方法中我会面临什么样的实施困难?

0 投票
1 回答
398 浏览

ruby - 为什么 Rails 应用程序运行垃圾收集器?

我很确定,所有Rack应用程序服务器(我对UnicornPassenger有一些经验)在创建时为每个工作人员创建单个进程,并且它的状态是“冻结”的。

每当应用服务器收到要处理的请求时,它都会从主进程分叉,并且对分叉进程的所有进一步更改都与原始进程分开。它们受益于写时复制优化,并且可以安全地被处理请求“损坏”。对环境的所有更改仅影响将被抢占的单个进程。

如果我对 RoR 应用程序堆栈的看法是正确的,那么几乎不需要垃圾收集,除非服务单个请求会占用大量时间和内存(通常情况并非如此)。

另一方面,关于使用 NewRelic 完成的 GC 测量的问题及其答案让我得出结论,我一定是完全错误的。

有人可以澄清这个过程吗?

0 投票
1 回答
57 浏览

monitoring - 详细的多任务监控

我正在尝试组装一个计算机模型并在其上运行一些模拟(学校作业的一部分)。这是一个非常简单的模型 - 一个 CPU、一个磁盘和一个进程生成器,它生成轮流使用 CPU 和访问磁盘的用户进程(我决定省略各种系统进程,因为根据 Process Explorer 他们使用下一个没有 CPU 时间 - 我基于在 Windows 7 上运行的 Microsoft Process Explorer 工具)。这就是我停下来的地方。

我不知道如何获取有关各种进程读/写磁盘的频率、一次有多少数据以及它们使用 CPU 的时间的相关数据。假设我想获得一些关于 PC 上一些典型操作的统计数据——播放音乐/电影、浏览互联网、玩游戏、使用 Office、视频编辑等等……有没有办法收集这些数据?

我正在使用 RR 模拟抢占式多任务处理,时间量为 15 毫秒以切换进程​​,这就是它的外观:
-> 进程到达 CPU
-> 进程在 0-15 毫秒内完成工作,放弃 CPU 或被切断
现在,出现了两种选择:
a)进程只是在它再次获得 CPU 之前或在它获得一些用户输入之前(如果无事可做)就坐下来等待 b)从磁盘处理请求的数据,并且在所述数据之前不重新加入队列可用

我希望模型中a)和b)之间的决定基于概率来完成,例如a)为90%,b)为10%。但我不知道如何让这些百分比对于某种类型的流程至少有点现实。此外,一个进程通常可以同时访问多少数据?

有任何可用的提示、资源、实用程序吗?

0 投票
3 回答
3549 浏览

c - 使用 set_current_state 在内核中休眠

我一直在阅读http://www.linuxjournal.com/article/8144并考虑以下情况:

现在,如果在我们将进程设置为睡眠的第 4254 行之前调用了 kthread_stop,并且在该行之后我们实际上被抢占/调度并且进程也真的被发送到睡眠状态,会发生什么?

在这种情况下,唤醒呼叫是在更改状态之前收到的(因此它不会影响我们),并且操作系统的正常运行会在我们实际检查任何内容之前让我们进入睡眠状态。

我想我错过了一些东西,可能是以下两个选项之一:(1)状态的实际变化只发生在我们调用 schedule() 时,或者(2)我们没有办法被安排出来(要么在 set_current_state 调用之后和 schedule() 调用之前,通过抢占、中断等。

感谢您的帮助!

0 投票
1 回答
4819 浏览

c - 了解最新(3.0.0 及以上)Linux 内核中 CONFIG_SMP、自旋锁和 CONFIG_PREEMPT 之间的联系

为了给您完整的上下文,我的讨论从观察开始,即我在基于 ARM cortex A8 的 SoC 上运行 SMP linux (3.0.1-rt11),这是一个单处理器。我很想知道禁用 SMP 支持是否会带来任何性能优势。如果是的话,它将对我的驱动程序和中断处理程序产生什么影响。

我做了一些阅读并遇到了两个相关的主题:自旋锁和内核抢占。我做了更多的谷歌搜索和阅读,但这一次我得到的只是一些陈旧和矛盾的答案。所以我想让我试试stackoverflow。

我的疑问/问题的起源是 Linux 设备驱动程序第 3 版第 5 章中的这一段:

自旋锁就其本质而言,旨在用于多处理器系统,尽管就并发性而言,运行抢占式内核的单处理器工作站的行为类似于 SMP 。如果一个非抢占式单处理器系统曾经在锁上自旋,它将永远自旋;没有其他线程能够获得 CPU 来释放锁。出于这个原因,没有启用抢占的单处理器系统上的自旋锁操作被优化为什么都不做,除了那些改变 IRQ 屏蔽状态的操作。由于抢占,即使您从未期望您的代码在 SMP 系统上运行,您仍然需要实现适当的锁定。

我的疑问/问题是:

a) 默认情况下,Linux 内核在内核空间中是抢占式的吗?如果是,这种抢占是否仅限于进程或中断处理程序也可以被抢占?

b) Linux 内核(在 ARM 上)是否支持嵌套中断?如果是,每个中断处理程序(上半部分)是否有自己的堆栈或共享相同的 4k/8k 内核模式堆栈?

c) 如果我禁用 SMP ( CONFIG_SMP) 和抢占 ( CONFIG_PREEMPT),我的驱动程序和中断处理程序中的自旋锁是否有意义?

d) 内核如何处理在执行上半部分时引发的中断,即它们将被禁用或屏蔽?

经过一番谷歌搜索后,我发现了这个:

对于没有 CONFIG_SMP 和没有 CONFIG_PREEMPT 编译的内核,自旋锁根本不存在。这是一个出色的设计决策:当没有其他人可以同时运行时,没有理由拥有锁。

如果内核在没有 CONFIG_SMP 的情况下编译,但设置了 CONFIG_PREEMPT,则自旋锁只是禁用抢占,这足以防止任何竞争。在大多数情况下,我们可以将抢占视为等同于 SMP,而不必单独担心。

但是源代码上没有内核版本或日期。谁能确认它是否仍然适用于最新的 Linux 内核?

0 投票
1 回答
2634 浏览

algorithm - 非抢占式最早截止时间优先调度

我正在开发任务调度程序,我想使用 EDF 调度。我需要安排的任务集仅包含截止日期等于其周期的任务,并且必须定期安排这些任务。我遇到的问题是任务一旦开始执行就不能被中断。

我知道只有当任务在单个处理器上被抢先调度时,EDF 才是最佳调度算法,所以我想知道是否可能对任务施加任何测试或约束,以验证我的任务集是否可以使用非抢占式 EDF。

任何帮助是极大的赞赏。谢谢

0 投票
2 回答
123 浏览

windows - 以编程方式确定抢占前剩余的时间

我正在尝试实现一些自定义的无锁结构。它的操作类似于堆栈,因此它有一个take()和一个free()方法,并对指针和底层数组进行操作。通常它使用乐观并发。free()将虚拟值写入指针+1 使指针递增并将实际值写入新地址。take()以自旋/睡眠方式读取指针处的值,直到它不读取虚拟值,然后递减指针。在这两种操作中,对指针的更改都是通过比较和交换完成的,如果失败,整个操作会重新开始。虚拟值的目的是确保一致性,因为写操作可以在指针递增后被抢占。

这种情况让我想知道是否有可能通过确定在线程被调度程序抢占另一个线程之前还剩多少时间来防止在那个关键位置抢占。我不担心硬件中断。我试图从我的阅读功能中消除可能的睡眠,以便我可以依靠纯粹的旋转。

这是可能吗?还有其他方法可以处理这种情况吗?

编辑:澄清这可能有什么帮助,如果关键操作被中断,它实际上就像取出一个独占锁一样,所有其他线程必须先休眠才能继续操作

编辑:我并不打算像这样解决它,我只是想看看它是否可能。该操作在该位置被中断很长时间的可能性极小,如果确实发生,如果所有其他操作都需要休眠以完成它,那将是可以的。

有些人认为这是过早的优化,但这只是我的宠物项目。不管怎样——这并不排除研究和科学试图改进技术。尽管计算机科学已经相当成熟,而且我们今天使用的每一项新技术都只是对 40 年前已知技术的实现,但我们不应该停止创造性地解决即使是最小的问题,比如尝试制作一套合理的操作原子,没有太多的性能影响。

0 投票
2 回答
348 浏览

operating-system - 调度程序如何在需要时重新获得控制权?

我正在阅读有关调度的内容,但我无法弄清楚调度程序在调用用户空间中的代码后如何重新获得控制权。

例如,调度程序将控制权传递给用户空间中的某个应用程序,该应用程序执行一些无限循环,并且在单核芯片上不会发生其他硬件中断。所有文档都谈到调度程序重新获得控制权并抢先中断用户进程,但如果控制权从未传递回操作系统,这将如何工作?

问题:调度程序是否在 CPU 中注册了某个时钟以在 X 毫秒后再次获得控制权?还是有什么其他技巧?如果不是,调用什么C 函数来注册定期(或一次?)控制权重新获得?

0 投票
4 回答
8410 浏览

kernel - 为什么linux在内核代码持有自旋锁后禁用内核抢占?

我是 Linux 新手,正在阅读 Rubini & Corbet 的 Linux 设备驱动程序书。我对与以下内容相关的一项声明感到困惑spinlocks;这本书说

如果一个非抢占式单处理器系统曾经在锁上自旋,它将永远自旋;没有其他线程能够获得 CPU 来释放锁。出于这个原因,没有启用抢占的单处理器系统上的自旋锁操作被优化为什么都不做,除了那些改变 IRQ 屏蔽状态的操作。

书中进一步指出

内核抢占情况由自旋锁代码本身处理。每当内核代码持有自旋锁时,相关处理器上的抢占都将被禁用。甚至单处理器系统也必须以这种方式禁用抢占以避免竞争条件。

问题:在单处理器系统上,如果内核抢占在内核代码(代表用户进程执行)持有自旋锁时被禁用,那么另一个进程如何有机会运行并因此尝试获取自旋锁?当内核代码持有自旋锁时,为什么 Linux 内核会禁用内核抢占?

0 投票
2 回答
597 浏览

windows - Windows 上的强制抢占(发生与否)

对不起,我的英语很弱,抢占我的意思是强制上下文(进程)切换应用于我的进程。

我的问题是:

如果我编写和运行我自己的程序游戏,它会在 20 毫秒的周期内工作,然后是 5 毫秒的睡眠,然后 Windows 泵(查看消息/调度消息)一次又一次地循环 - 它是否曾经在 Windows 中被强制抢占或者不,这种抢占不会发生?

我想如果我不自愿通过睡眠或窥视/调度更长时间将控制权交还给系统,就会发生这种抢占。在这里,它会发生还是不会发生?