- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
背景:
在我用 C++ 编写的应用程序中,我创建了 3 个线程:
std::queue
1。前两个线程占用 60-80% 的 CPU 使用率,每个线程平均占用 35%。
问题:
我不明白为什么有些线程占用高 CPU 使用率。
我分析如下:如果是操作系统做出像 context-switch 这样的决定, interrupt , 和 scheduling至于应该让哪个线程访问系统资源,例如 CPU 时间,那么为什么进程中的 一些 线程碰巧比其他线程使用更多的 CPU?看起来一些线程强行从操作系统中获取CPU在 Guzzle ,或者操作系统对某些线程有一个真正的软肋,所以它从一开始就偏向于它们,给他们所有的资源。为什么不能不偏不倚,一视同仁?
我知道这很幼稚。但是如果我沿着这条思路思考,我会更加困惑:操作系统根据线程要完成的工作量授予对 CPU 的访问权限,但是操作系统如何计算或预测工作量 在完全执行之前?
我想知道 CPU 使用率高的原因是什么?我们如何识别它们?是否可以仅通过查看代码来识别它们?工具是什么?
我正在使用 Visual Studio 2010。
1.我对 std::queue
也有疑问。我知道标准容器不是线程安全的。但是,如果正好有一个线程将项目排入队列,那么如果只有一个线程将项目从其中排入队列是否安全?我想它就像一个管道,一方面你插入数据,另一方面你删除数据,那么如果它同时完成为什么会不安全呢?但这不是本主题的真正问题,但是,您可以在答案中添加注释来解决这个问题。
更新:
在我意识到我的消费者线程正在使用我已用 Sleep 修复的忙自旋之后3 秒。此修复是临时的,很快我将使用 Event反而。但即使是 Sleep ,CPU 使用率已下降到 30-40%,偶尔会上升到 50%,从可用性的角度来看,这似乎并不理想,因为系统不会响应用户使用的其他应用程序目前正在合作。
还有什么方法可以改善 CPU 使用率高的问题吗?如前所述,生产者线程(现在使用大部分 CPU 周期)读取文件,解析其中的数据包(某种格式),并从中生成模式。如果我使用 sleep ,那么 CPU 使用率会降低,但这是个好主意吗?常见的解决方法有哪些?
最佳答案
就我个人而言,如果我的线程有工作要做,而且我的机器上有空闲的内核,因为操作系统没有给它们高 CPU 使用率,我会非常恼火。所以我真的不认为这里有任何问题[编辑:原来你的繁忙循环是一个问题,但原则上高 CPU 使用率没有什么问题]。
操作系统/调度程序几乎无法预测线程将执行的工作量。线程(过度简化)处于以下三种状态之一:
调度程序将选择尽可能多的东西来运行它的核心(或超线程,等等),并运行每一个,直到它阻塞或直到称为“时间片”的任意时间段到期。如果可以的话,它会安排其他的事情。
因此,如果一个线程将大部分时间用于计算而不是阻塞,并且如果有一个内核空闲,那么它将占用大量 CPU 时间。
如何调度程序根据优先级等因素选择要运行的内容有很多细节。但基本思想是,一个有很多事情要做的线程不需要被预测为计算量大,只要有事情需要调度,它总是可用的,因此往往会被调度。
对于您的示例循环,您的代码实际上并没有做任何事情,因此在判断 5-7% 的 CPU 是否有意义之前,您需要检查它是如何优化的。理想情况下,在两核机器上,处理繁重的线程应该占用 50% 的 CPU。在 4 核机器上,25%。因此,除非您至少有 16 个内核,否则您的结果乍一看是异常的(如果您有 16 个内核,那么一个线程占用 35% 将更加异常!)。在标准桌面操作系统中,大多数内核大部分时间都处于空闲状态,因此实际程序在运行时占用的 CPU 比例越高越好。
在我的机器上,当我运行主要用于解析文本的代码时,我经常会占用一个内核的 CPU 使用率。
if exactly one thread enqueue items to queue, then is it safe if exactly one thread deque items from it?
不,这对于带有标准容器的 std::queue
是不安全的。 std::queue
是序列容器(vector
、deque
或 list
)顶部的薄包装器,它不会增加任何线程安全性。添加项目的线程和删除项目的线程共同修改一些数据,例如底层容器的 size
字段。您需要一些同步,或者依赖于对公共(public)数据的原子访问的安全无锁队列结构。 std::queue
两者都没有。
关于c++ - CPU使用率高的常见原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275262/
我对cassandra并使用1.2.10非常陌生。我有一个时间戳数据类型的主键列。现在,我正在尝试检索日期范围的数据。由于我们知道不能在cassandra中使用,因此我使用的是大于()来获取日期范围。
我正在尝试进行有条件的转场。但我得到: Terminating app due to uncaught exception 'NSInvalidArgumentException', reas
我有一个游戏项目,在调试和发布模式下在设备上运行得非常好。我有两个版本。旧版本和新版本具有更多(后来我添加了)功能,并且两者的 bundle ID、版本相同。当我构建旧版本时,之前没有安装“myGam
这个问题已经有答案了: 奥 git _a (2 个回答) 已关闭 5 年前。 我正在获取 ClassCastException 。这两个类来自不同的 jar,但是JettyContinuationPr
以下代码行抛出异常: HttpResponse response = client.execute(request); // actual HTTP request 我能够捕获它并打印: Log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
public class TwoThreads { private static Object resource = new Object(); private static void
当我输入 6 (int) 作为值时,运行此命令会出现段错误 (gcc filename.c -lm)。请帮助我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经陷入段错误。 谢谢! #incl
所以,过去一周半我一直在研究这个 .OBJ/.MTL 网格解析器。在这段时间里,我一直在追踪/修复很多错误、清理代码、记录代码等等。 问题是,每修复一个错误,仍然会出现这个问题,而且一张图片胜过一千个
我正在运行一个代码,它基本上围绕 3 个维度旋转一个大数据数组(5000 万行)。但是,我遇到了一个奇怪的问题,我已将其缩小到如何评估旋转矩阵。基本上,对于除绕 x 轴以外的任何旋转,python 代
就在你说这是重复之前,我已经看到了其他问题,但我仍然想发布这个。 所以我正在阅读 Thinking in Java -Bruce Eckel 这篇文章是关于小写命名约定的: In Java 1.0 a
我想在我的应用程序中使用 REST API。它为我从这个应用程序发出的所有请求抛出 SocketTimeoutException。 Logcat 输出:(您也可以在此处看到带有漂亮格式的输出:http
我知道 raise ... from None 并已阅读 How can I more easily suppress previous exceptions when I raise my own
在未能找到各种Unix工具(例如xargs和whatnot)的最新独立二进制文件(this version很好,但需要外部DLL)后,我承担了自己进行编译的挑战。 ...这是痛苦的。 最终,尽管如此,
我有一个用PHP编写的流套接字服务器。 为了查看一次可以处理多少个连接,我用C语言编写了一个模拟器来创建1000个不同的客户端以连接到服务器。 stream_socket_accept几次返回fals
我的Android Studio昨天运行良好,但是今天当我启动Android Studio并想在移动设备上运行应用程序时,发生了以下错误, 我在互联网和stackoverflow上进行了搜索,但没有解
默认情况下,grails似乎为Java域对象的toString()返回:。那当然不是我想要的,所以我尝试@Override toString()返回我想要的。当我尝试grails generate-a
尝试通过LDAP通过LDAP对用户进行身份验证时,出现以下错误。 Reason: Cannot pass null or empty values to constructor. 谁能告诉我做错了什么
我正在尝试使用应用程序附带的 Houdini Python 模块,该模块是 Houdini 安装文件夹的一部分,位于标准 Python 路径之外。按照安装说明操作后,运行 Houdini Termin
简单地说,我正在为基本数据库编写单链表的原始实现。当用户请求打印索引下列出的元素高于数据库中当前记录数量时,我不断出现段错误,但仅当差值为 1 时。对于更高的数字,它只会触发我在那里编写的错误系统。
我是一名优秀的程序员,十分优秀!