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
上图显示主板上有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 Usage
The 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%这个结果了。