问题标签 [sched-deadline]
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.
c - pthread_create 在设置主线程时返回 EAGAIN sched_deadline 调度策略
我想让一个进程在新的 Linux SCHED_DEADLINE调度策略下调度。同时,这个进程还要创建一些工作线程来做一些其他的工作。但是,当我在成功调用sched_setattr(即设置进程调度策略)后调用pthread_create时,我得到了一个EAGAIN。我知道在实时进程中创建线程可能有点奇怪。可能会出现“新线程的调度策略是什么”等问题。
尽管如此,有没有办法在 SCHED_DEADLINE 进程中创建一个新线程?
以及如何定义新线程的调度策略?
重现我的问题的代码可以在
c - Linux内核中rt.c/deadline.c中的空函数
我正在研究 Linux 内核中的实时调度算法,我看到有很多函数调用,其中实际上没有定义任何内容:
(在内核 3.15 上)例如:
它们还在检查 SMP 的 ifdef 中重新定义。我只是想确定一下,这些功能是否特定于 SMP?或者是否有任何理由拥有这些空功能。
c - 未找到 DEADLINE 调度策略
我想在 C 中实现 DEADLINE 调度策略。我知道该功能已经实现,Linux 3.14.10
并且我使用的是 Ubuntu 14.04 Linux #### 3.17.0-031700-lowlatency #201410060605 SMP PREEMPT
,它应该是最新的。我用 Eclipse 开发程序(以 sudo 启动)。
我已经定义_GNU_SOURCE
并包含sched.h
了,但我仍然无法使用关键字SCHED_DEADLINE
来定义struct sched_attr
或使用类似sched_getattr
.
这些关键字和函数都没有在我的/usr/include/
文件夹中定义,但我设法在/usr/src/linux-headers-3.17.0-031700/include/
. 我试图将此文件夹包含在我的项目的构建选项中,但它似乎会产生链接错误。
我真的不习惯 C 开发(我最初是一名 JS 开发人员),所以如果有人能解释我做错了什么以及如何解决这个问题,那就太好了。
的内容/usr/include/linux/sched.h
编辑
我想要的文件位于/usr/src/linux-headers-3.17.0-031700/include/
文件夹中。无论如何,我尝试使用几种方法将文件夹添加到我的项目中。首先使用-I
gcc 的标志,然后使用C_INCLUDE_PATH
环境变量。
在这两种方式中,gcc 都在默认位置优先搜索并找到了错误的<sched.h>
文件。我尝试使用-nostdinc
选项来抑制默认位置,但这更糟糕......我得到了很多错误。
c - 检测截止时间线程抢占
我正在使用SCHED_DEADLINE
调度策略实现一个线程,这是我的高优先级线程,另一个使用SCHED_FIFO
策略是我的低优先级线程。例如,我将我的截止日期线程定义如下:
在正常行为中,我的高优先级线程的处理时间不应超过 0.5 毫秒,而这段时间它应该有时间完成其任务。
如果任务持续时间超过 0.5 毫秒,操作系统调度程序将抢占我的高优先级线程,为我的低优先级线程腾出时间。这是我之前测试过的行为。
我的问题是:如何警告我的高优先级线程已被系统抢占?
linux - 如何在 linux 中使用宏 SCHED_DEADLINE?
我们知道 linux 中有几种调度策略,如SCHED_FIFO
、SCHED_RR
、等,其中一种可以使用系统调用SCHED_OTHER
来更改实时进程的调度程序。sched_setscheduler
但是我无法将程序的调度程序更改为Earliest-deadline-first
使用SCHED_DEADLINE
宏?任何人都可以提出一种方法来实现这一目标吗?
c - 针对比 libc 构建的更新的 linux 头文件构建
我想使用自 Linux 3.14 以来SCHED_DEADLINE
可用的新调度策略编写程序。
我从一个尝试使用该sched_setattr
功能的简单程序开始。
但是,在编译时出现以下错误:
我的系统运行的是 Ubuntu 16.10 Yakkety,内核为 4.8.0-59-generic。包含的sched.h
文件位于包中/usr/include/sched.h
并由包提供libc6-dev
。此头文件不包含sched_setattr
我尝试使用的功能和朋友。
然而,我安装的内核(和内核头文件)带有一个sched.h
包含我需要的定义的头文件。它位于/usr/src/linux-headers-4.8.0-58/include/linux/sched.h
, 在我的系统上。
所以我天真地认为让我们只针对较新的 linux 头文件而不是 libc6-dev 提供的头文件进行构建。我的程序只能在这个或更新的内核上运行,但这很好。
我将第一行修改为:#include <linux/sched.h>
并执行:
现在我得到一页又一页的错误和警告。这似乎不是要走的路。
针对比 libc 提供的更新的 Linux 头文件构建用户空间程序的正确方法是什么?
随后我如何构建上面的程序?
linux - 在 SCHED_DEADLINE 调度程序下 sched_yield() 保证在下一个周期开始时唤醒?
第 4.4 点下的州文件SCHED_DEADLINE
:
sched_yield() 的这种行为允许任务在下一个周期开始时准确地唤醒。
这是否意味着sched_yield()
在SCHED_DEADLINE
线程中使用可以保证线程将在下一个周期开始时准确地唤醒?即使SCHED_DEADLINE
存在其他线程?
linux-kernel - 使用 cpuset,在所有进程上使用截止日期调度程序是否与使用正常的完全公平调度程序有效相同?
据我了解,在现代 Linux 上,期限调度程序是使用恒定带宽服务器 (CBS) 和最早期限优先 (EDF) 实现的。假设我使用 cpuset 为 12 个 CPU 中的 6 个分配了 X 个进程。假设 6 个 CPU 上没有运行其他重要进程。在这种情况下,我觉得在所有 X 进程(具有默认预算和周期)上使用 SCHED_DEADLINE 与仅使用正常的完全公平调度程序没有区别,因为两者都会导致所有 X 进程运行相同的 CPU 时间。我的理解正确吗?
c - Ubuntu 16.04 是否正式支持 SCHED_DEADLINE?
目前我正在运行 Ubuntu 16.04,Linux 内核版本为 4.16。我编写了一个虚拟程序,将其调度程序更改为 SCHED_DEADLINE。但是当我尝试编译它时,它找不到 SCHED_DEADLINE 所需的结构和宏的定义。大部分代码片段取自此处(第 24 页)。下面是测试程序:
这是编译的输出:
我的 gcc 版本:
但是,官方网站上发布的示例代码对我有用,但是示例代码手动定义了程序中所有需要的宏和系统调用。我的目标是在不添加那些定义的情况下编译应用程序,这些定义应该已经包含在最新的内核版本中。我看到很多地方都说 SCHED_DEADLINE 在 Linux 3.14.10 之后正式支持,升级内核会自动解决这个问题。
我尝试过的事情:
- 重新编译 4.16 内核。以前我以为我需要在配置文件中打开一个开关,但我找不到它。
- 调查
/usr/include/linux/sched.h
。很明显,宏是在这个头文件中定义的,但不知何故我的编译器找不到它。
我还查看了社区中的其他帖子,但所有这些问题都是针对较旧的 linux(3.14.10 之前)。
debian - 什么优先于 SCHED_DEADLINE?
在尝试调度高速线程时,我注意到有时有很长一段时间(多个毫秒)没有调度线程。我想知道在我正在使用的配置中可以对调度程序执行此操作。
- 带有 RT (i686) 的最新 Debian 伸展(稳定)
- 双核英特尔 (2237MHz)
- PS2 键盘和鼠标
- CPU 1 保留(通过 grub)
- 用于将我的测试过程放在核心 1 上的任务集
- SMI 禁用、速度步禁用等(典型的 RT BIOS 设置)
- USB 端口未禁用但未插入任何内容
- IRQ 平衡禁用
我确认 CPU1 上只有 worker、timer 等。其他一切都在 CPU0 上。
我的线程是 SCHED_DEADLINE(唯一一个这样安排的线程),周期为 300us。我使用 schedules_yield() 在预订完成之前很久就释放线程(只是一个测试循环),所以我确定它没有过度运行。
我得到的是一个近乎完美的 3333Hz 输出(通过 o-scope),它时不时地被阻塞,每次超过 15 毫秒。我已经查看了中断(除了计时器,在那个 CPU 上没有递增),我已经禁用了 NMI 中断等等,但没有找到干扰进程是什么。我不相信我完全理解什么可以优先考虑并导致调度程序跳过周期所以我希望有人可能有一个想法?
我认为这可能是磁盘 IO,但这似乎与差距不符(有时确实如此......)。VGA/控制台的使用似乎使情况变得更糟,但即使不使用,差距仍然存在。
是的,在你问之前......这只是一个实验,看看这是否可以可靠地完成。我的实际代码在 QNX 上运行,它在同一硬件上以这种速度稳定运行。我正在试验是否可以使用 PREEMPT_RT 将其移植到 Debian。
谢谢!