c# - 保证CPU响应?

标签 c# java c++ c assembly

注意:我更喜欢 C++(下面的代码是 C++),但如果有人设法用任何通用语言执行以下操作,我没问题。

思路是这样的:

a) 计时器开始。
b) 函数执行总是不到 0.1 秒。
c) 程序 hibernate 直到与开始的时间差正好 0.1 秒。
d) 永远重复。

如果 sleep 时间略高于 0.1 秒,比如 0.105 秒,我每秒损失 0.005 秒。这种不准确性会影响我的应用程序,因为我会在一天内丢失:0.005*3600*24 = 432 秒。

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


执行:

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

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

d) 只是循环


总结:

a) 我明白,无论如何,我每秒至少会损失 1 纳秒。
b) 阅读这些文章后:first , second我意识到,有可能让我的应用程序每秒损失 30 微秒 = 0.00003 秒。这意味着,在一天中:每天 0.00003*3600*24 = 2.592 秒。
c) 目前使用上面描述的功能我管理的最好的是每天损失 7 分钟。


我真正想做的是:

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

问:如何在CentOS preferred 或任何其他操作系统上实现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 毫秒的抖动,但这将在下一次或之后的迭代中消失。

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

我怀疑您实际上是在尝试解决您尚未在此处真正解释的不同问题。

How to implement CPU shielding on CentOS preferable, or any other OS?

我为Java所做的是

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

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

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

关于c# - 保证CPU响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20776835/

相关文章:

c# - 如何使用 Xamarin 在 Android 中同步获取 GPS 位置更新?

c# - WPF MVVM 应用程序中的启动画面

c# - LINQ to SQL context.GetChanges

java - Java中是否有 `boolean Object.isNull(Object object)`或类似的静态实用方法?

c++ - 简单的 C++ 写入文件在 Mac OS X 应用程序中不起作用 - 为什么? (为什么是我?)

c# - 从 WCF 服务返回实体时从实体中剥离字段

java - Java 分割包含换行符的字符串

java - 吃 bean 人阵列 - 平滑运动

c++ - 库定义位于何处?

c++ - 测试 C/C++ 源代码