gpt4 book ai didi

linux - 不同过程之间的产量

转载 作者:IT王子 更新时间:2023-10-29 01:23:23 29 4
gpt4 key购买 nike

我有两个 C++ 代码,一个叫做 a,一个叫做 b。我在 64 位 Linux 中运行,使用 Boost 线程库。

a 代码创建了 5 个线程,它们保持在一个无休止的循环中执行某些操作。b 代码创建了 5 个线程,这些线程处于调用 yield() 的非结束循环中。

我在一台四核机器上...当单独调用 a 代码时,它几乎占用了 400% 的 CPU 使用率。当 a 单独调用 b 代码时,它几乎占用了 400% 的 CPU 使用率。我已经预料到了。

但是当两者一起运行时,我预计 b 代码几乎不使用 CPU 而 a 使用 400%。但实际上两者都使用了相等的 CPU 片,几乎是 200%。

我的问题是,yield() 不能在不同的进程之间工作吗?有没有办法让它按我预期的方式工作?

最佳答案

所以你有 4 个内核运行 4 个属于 A 的线程。队列中有 6 个线程 - 1 个 A 和 5 个 B。其中一个运行 A 的线程用完了它的时间片并返回到队列。调度程序从队列中选择下一个可运行的线程。这个胎面属于 B 的概率是多少? 5/6。好的,这个线程启动了,它调用 sched_yield() 并返回到队列中。下一个线程又是 B 线程的概率是多少?又是 5/6!

进程 B 一次又一次地获得 CPU 时间,并且还强制内核进行昂贵的上下文切换。

sched_yield 适用于一种特殊情况 - 当一个线程使另一个线程可运行时(例如,解锁互斥锁)。如果你想让 B 在 A 处理一些重要的事情时等待 - 使用一些同步机制可以让 B 进入休眠状态,直到 A 将其唤醒

关于linux - 不同过程之间的产量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522365/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com