当前位置: 首页 > news >正文

top -p pid为什么超过100%

CPU:Cores, and Hyper-Threading

超线程(Hyper-Threading )
超线程是Intel最早提出一项技术,最早出现在2002年的Pentium4上。单个采用超线程的CPU对于操作系统来说就像有两个逻辑CPU,为此P4处理器需要多加入一个Logical CPU Pointer(逻辑处理单元)。

虽然采用超线程技术能同时执行两个线程,但它并不像两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。

超线程技术物理机处理器设置了两个入口AS(Architecture State)接口,从而让系统等软件将其识别为两个逻辑处理器。这两个逻辑处理器像传统处理器一样都有独立的IA-32架构,他们分别可以进入暂停、中断状态,或直接执行程序,并且每一个逻辑处理器都有APIC(高级可编程中断控制器)。
比如支持超线程的Pentium4能同时两个线程,但不同传统的双处理器或双内核处理器,超线程的两个处理器并没有独立的执行单元、整数单元、寄存器甚至缓存等着资源。他执行过程中人需要共用执行单元、整数单元、寄存器、缓存和系统总线接口等资源。在执行多线程的时候两个逻辑处理器均是交替工作,如果 两个线程都需要用到某一个资源的时候,其中一个要让出资源,要待那些资源闲置时才能继续,所以,超线程技术所带来的提升远不能等同于两个相同时钟频率处理器带来的性能提升,可以说是INTEL线程技术仅是可以看做对 单个处理器运算资源的优化利用。

多核(multi-cores)

最开始CPU只有一个核(core),为了提高性能,引入了双核CPU,四核CPU等,双核CPU能同时执行两个线程。和超线程不同的是,双核CPU是实打实的有两个central processing units在一个CPU chip。

cpu_info
lscppu

上图显示主板上有2个槽(socket),这个插槽插着一个CPU,这个CPU有8个核(core),每个核都使用超线程技术,所以这台机器总共有32个逻辑核。

top的使用率

测试程序


```cpp
#include <pthread.h>const int num = 9;
pthread_t threads[9];void *func(void* arg) {while(1) {}return ((void *)0);
}int main(int argc, char* argv[]) {for (int i = 0; i < num; i++) {pthread_create(&threads[i], NULL, func, NULL);}for (int i = 0; i < num; i++) {pthread_join(threads[i], NULL);}return 0;
}

上述程序创建了9个线程,每一个线程都执行死循环

gcc top.c -std=c99 -lpthread

不限定运行核

运行程序,看下top的使用率
在这里插入图片描述
可以看到进程cpu使用率100%
在这里插入图片描述
进程中的每个线程使用率都是100%

限定运行核

怎么限定进程只在一个核上运行呢?可以使用numactl这个工具(或者taskset、cpuset)

numactl -C 22 top_test

在这里插入图片描述
可以看到限制了进程在一个核心上后,进程的使用率只能100%了
在这里插入图片描述
可以看到进程中每一个线程基本均摊了cpu的使用

top如何计算使用率的呢

  1. %CPU  --  CPU UsageThe task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.In a true SMP environment, if a process is multi-threaded and top is not operating in Threads mode, amounts greater than 100% may be reported.  You toggle Threads mode with the `H' interactive command.Also for multi-processor environments, if Irix mode is Off, top will operate in Solaris mode where a task's cpu usage will be divided by the total number of CPUs.  You toggle Irix/Solaris modes with the `I' interactive command.

总结来说某个进程的CPU使用率就是这个进程在一段时间内占用的CPU时间占总的CPU时间的百分比。

比如某个开启多线程的进程1s内占用了CPU0 0.8s, CPU1 1s, 那么它的占用率是180%。这样就不难理解上例中为什么进程CPU占用率为900%这个结果了。

具体计算方法(待补充)

http://www.lryc.cn/news/21532.html

相关文章:

  • #高光谱图像分类#:分类的方法有哪些?
  • 观察者模式
  • 前端组件库自定义主题切换探索-03-webpack-theme-color-replacer webpack 同时替换多个颜色改造
  • Redis高级-主从复制相关操作
  • SPI总线设备驱动模型
  • 开发同事辞职,接手到垃圾代码怎么办?
  • gRPC简介
  • 《MySQL系列-InnoDB引擎25》表-InnoDB逻辑存储结构
  • YOLOv8之C2f模块——与YOLOv5的C3模块对比
  • 动态规划实例——换零钱的方法数(C++详解版)
  • linux c
  • 第十三章 系统错误消息 - 一般系统错误消息 S - Z
  • 移动web基础
  • MyBatis和MyBatis_Plus有什么区别【面试常考题】
  • 华为OD机试用Python实现 -【统一限载货物数最小值】(2023-Q1 新题)
  • Vue入门小练习
  • Oracle-09-集合运算符篇
  • 获取浏览器(服务端)请求中特定的Cookie
  • c++11 标准模板(STL)(std::unordered_set)(九)
  • python实战应用讲解-【实战应用篇】文件操作(附python示例代码)
  • OpenCV-Python系列(二)—— 图像处理(灰度图、二值化、边缘检测、高斯模糊、轮廓检测)
  • ccc-台大林轩田机器学习基石-hw1
  • hadoop03-MapReduce【尚硅谷】
  • 测牛学堂:软件测试python学习之异常处理
  • 图神经网络--图神经网络
  • React useCallback如何使其性能最大化?
  • 长尾关键词使用方法,通过什么方式挖掘长尾关键词?
  • 【网络编程套接字(一)】
  • shell脚本入门
  • 【经典蓝牙】 蓝牙HFP层协议分析