保证CPU响应



注意:我更喜欢C++(下面的代码是C++),但如果有人能用任何通用语言完成以下操作,我就可以了。

想法如下:

a) 计时器启动
b)函数执行时,总是小于0.1秒
c)程序睡眠,直到与启动的时间差正好0.1秒
d)永远重复

如果睡眠时间稍高于0.1秒,比如0.105秒,我每秒会损失0.005秒。由于我在一天内损失了0.005*3600*24=432秒,因此这种不准确会在我的申请中造成损失。

我的应用程序是实时的;我失去的时间并不重要。


执行:

a) a步骤很简单,只需设置一个变量x = std::chrono::high_resolution_clock::now();b) 运行函数
c)

while((std::chrono::high_resolution_clock::now()-x).count() < 1000000)
std::this_thread::sleep_for(std::chrono::nanoseconds(1));

d) 仅循环


摘要:

a) 我知道,不管怎样,我每秒至少会损失1纳秒
b)在阅读了这些文章之后:首先,第二,我意识到,有可能使我的应用程序每秒损失30微秒=0.00003秒。这意味着,在一天内:0.00003*3600*24=2.592秒/天
c)目前,使用上面描述的功能,我能做到的最好的是每天损失7分钟。


我真正想做的事情:

我可以访问有一个限制的服务器:每0.1秒只允许一个请求。如果需要更少的时间,他们会禁止我。如果我的请求需要更长的时间,我下载的数据就会更少。我的应用程序每0.1秒下载一个文件。如果由于延迟,我每天损失432秒,这意味着我本可以多下载4320个文件。

Q:如何在CentOS或任何其他操作系统上实现CPU屏蔽?

如果你不想在一天中浪费时间,你就不会这样实现你的代码。你会做一些类似的事情

for(long next = System.currentTimeMillis() + 100;; start += 100) {
// do something
while(true){
long delay = next - System.currentTimeMillis();
if (delay <= 0)
break;
Thread.sleep(delay);
}
}

通过这种方式,您可以在裸机上获得高达5毫秒的抖动,在系统管理程序上获得50毫秒的抖动。但这将在下一次迭代或之后的迭代中消失。

即在该代码中不存在累积漂移。(注意:高分辨率计时器会漂移,但这取决于您的硬件)

我怀疑你实际上是在试图解决另一个你在这里没有真正解释过的问题。

如何在CentOS或任何其他操作系统上实现CPU屏蔽?

我为Java做的是

  • 使用isocpus=5,6,11,12,或者为每个要隔离的核心使用每个CPU。我建议隔离整个核心。这允许您选择性地使用超线程
  • 配置IRQ平衡以避免这些CPU,除非您打算在该CPU上的线程中使用它们
  • 使用sched_setaffinity将选定的线程绑定到各个CPU。要分配整个核心,请使核心中的一个CPU空闲

BTW我建议忙于等待,而不是使用睡眠或任何在操作系统中阻塞的东西,因为这会干扰CPU缓存。也就是说,你的代码在唤醒后运行速度会明显变慢(2-5倍),因为唤醒时间并不是你唯一需要担心的事情。

BTW2除了设置尽可能高的优先级外,我还没有找到在Windows上屏蔽CPU的可靠方法,注意:除非你是以管理员身份运行,否则你不能提高优先级。在Linux上,提高优先级不如将CPU从正常调度中删除那么有效。

Java内置了实现这一点的功能,ScheduledExecutorService的选项之一是以固定的速率或固定的延迟进行调度。

如果你使用固定速率选项,那么它将为你提供你想要的行为,在它再次运行之前,它将从延迟中减去这次运行所花费的时间。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

但是请注意,windows是一个非实时操作系统,运行时具有先发制人的多任务。该服务会尝试在下次时间到来后尽快给你回电话,但绝对不可能保证这样做。避免这种情况的唯一方法是切换到实时操作系统,但这真的太过分了。

你不需要控制CPU的使用,用户自己可以控制。通过在Windows中使用任务管理器。我相信你将不得不在你的程序代码中扰乱任务管理器。

最新更新