保证CPU响应?

 mobiledu2502898013 发布于 2023-02-08 10:39

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

这是一个想法:

a)计时器启动.
b)功能执行并且总是小于0.1秒.
c)程序休眠直到与开始的时间差恰好为0.1秒.
d)永远重复.

如果睡眠时间略高于0.1秒,比如0.105秒,我每秒失去0.005秒.这个不准确的成本在我的申请中,因为我在一天中失去了:0.005*3600*24 = 432秒.

我的申请是实时申请; 我失去的时间并不重要.


执行:

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个文件.

问:如何在CentOS上实施CPU屏蔽,或其他任何操作系统?

1 个回答
  • 如果你不想浪费一天的时间,你就不会像这样实现你的代码.你会做的事情

    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 ms的抖动,在虚拟机管理程序上获得50 ms的抖动,但这将在下一次迭代或之后的迭代中消失.

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

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

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

    我为Java做的是

    对每个要隔离的核心使用isocpus = 5,6,11,12或每个CPU.我建议隔离整个核心.这允许您有选择地使用超线程.

    配置IRQ平衡以避免这些CPU,除非您打算在此CPU的线程中使用它们.

    使用sched_setaffinity将选定的线程绑定到各个CPU.要分配整个核心,请将核心的一个CPU保持空闲状态.

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

    BTW2我没有在Windows上找到一种可靠的CPU屏蔽方式,除了设置尽可能高的优先级,注意:除非你以管理员身份运行,否则不能提高优先级.在Linux上,提高优先级并不像从正常调度中移除CPU那样有效.

    2023-02-08 10:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有