C Linux实时编程
我刚刚构建并设置了一个香草Linux内核,并应用了RT补丁。一切都很顺利,我现在可以正确地引导到新内核中 让我疑惑的是:我有一个用C语言编写的模拟器程序,我希望它能在硬实时模式下执行,这是新内核应该允许的。也许整个模拟器不需要以实时优先级运行,但是其中的一些任务可以C Linux实时编程,c,linux,kernel,real-time,hard-real-time,C,Linux,Kernel,Real Time,Hard Real Time,我刚刚构建并设置了一个香草Linux内核,并应用了RT补丁。一切都很顺利,我现在可以正确地引导到新内核中 让我疑惑的是:我有一个用C语言编写的模拟器程序,我希望它能在硬实时模式下执行,这是新内核应该允许的。也许整个模拟器不需要以实时优先级运行,但是其中的一些任务可以 我怎样才能做到这一点?我认为简单地运行程序是不行的。如果您询问如何在实时上下文中运行一些线程,以及如何将其他线程作为传统的分时线程运行,那么您所需要的就是设置它们的线程 分时线程希望成为SCHED_OTHER;实时模拟器线程希望是S
我怎样才能做到这一点?我认为简单地运行程序是不行的。如果您询问如何在实时上下文中运行一些线程,以及如何将其他线程作为传统的分时线程运行,那么您所需要的就是设置它们的线程 分时线程希望成为
SCHED_OTHER
;实时模拟器线程希望是SCHED_FIFO
或SCHED_RR
在Linux上,为了以实时优先级运行,您的用户必须具有允许此操作的资源限制()。特别是,必须将rtprio
rlimit设置为所需的最高优先级。或者,您可以以root用户身份运行应用程序。在使用PAM的linux系统中,这通常是通过在/etc/security/limits.conf
@realtime - rtprio 99
@实时-rtprio 99
这将向实时组授予实时优先级高达99的rtprio限制。然后将实时组添加到/etc/groups
,并确保您的用户在该组中
(由于这似乎是您第一次这样做,您可能还需要一个“死人开关”高优先级实时线程,以确保模拟器不会失控并导致系统无法使用……如果模拟高CPU负载,可能会导致实际高CPU负载,并且在不重新启动的情况下无法停止。)是否应该Alt+SysRq+N将所有实时进程重置为正常模式?@Victor:我以前没有使用过该功能,也不知道该如何依赖它。看起来它用于重新冻结所有内容并删除所有rt优先级,但不知道这样做后如何恢复到正常优先级状态。假设我在一个新的分叉进程中调用了此命令:sched_setscheduler(getpid(),sched_FIFO,&sp);为什么这不能正确地被排除?sched_setscheduler返回1而不是0,我很确定sp配置正确(sp.sched_优先级设置为98)。您可能没有调用set_scheduler的权限。你是以root用户身份运行吗?如果这可以解决问题,那么正确的做法是建立一个允许执行实时操作的组,并将其放入limits.conf文件中。这里有一个简单的例子:Ubuntu 16.04上
limits.conf
的路径是/etc/security/limits.conf
(注意添加的security
目录)