轉載:
http://blog.chinaunix.net/uid-26000137-id-3957724.html
CPU 基本知識
以下是 CPU 中比較容易混淆的概念:
socket
可以理解為主板上的一個插座, 用來連接物理 CPU 芯片到主板上, 簡單講, 有多少個 socket 就有多少個物理 CPU.
core
core 的概念涉及到 多核心技術 是將多個一樣的 CPU 放置於一個封裝內(或直接將兩個 CPU 做成一個芯片), 每個這樣的 CPU 叫做一個 core, 每個 core 是一個的獨立的 執行單元.
thread
thread 涉及到 超線程技術 , 簡單的講, 就是把兩個邏輯內核模擬成兩個物理芯片, 讓單個處理器都能使用線程級並行計算.
邏輯 CPU 數量
綜上, CPU 的數量不能簡單的通過物理 CPU 的數量(或者 socket 的數量) 來判斷, 如果用了多核技術, 則需要計算全部 core 的數量, 如果用了超線程, 則需要加上 所有 CPU 線程. 所以每一個 CPU(包括 core 或者 thread) 都叫一個邏輯 CPU.
Linux 下的 CPU 計算
在 Linux 下, kernel 拋出了一個統計了 CPU 一般信息的文件 /proc/cpuinfo, 通過這個文件, 可以知道本機的 CPU 信息, 包括廠商, CPU 型號, CPU 緩存, 核心, 超線程等等信息.
下面以一台 intel 酷睿雙核為例說明:
gentoo-company tmp # cat /proc/cpuinfo processor : 0 physical id : 0 siblings : 2 core id : 0 cpu cores : 2 processor : 1 physical id : 0 siblings : 2 core id : 1 cpu cores : 2 |
我省略的不必要的輸出, 對以上信息做一個解釋
- processor
- 這個表示邏輯 CPU 的 ID
- physical id
- 物理 CPU(socket) 的 ID, 具有相同 physical id 的邏輯 CPU 在同一個 CPU 封裝內.
- siblings
- 同一個 CPU 封裝(socket)里的邏輯 CPU 數量, 這個數字表示在該物理 CPU 里面有多少個邏輯 CPU
- core id
- 核心 ID, 具有相同 core id 的邏輯 CPU 在同一個 core 里, 即是使用 了超線程的邏輯 CPU
- cpu cores
- CPU 核心數, 在該物理 CPU 內封裝的 core 數目.
通過上面的說明, 該機器有一個物理 CPU(只有一個 physical id), 用了雙核技術(cpu cores 為2), 沒有使用超線程技術(沒有相同的 core id)
QEMU 的 CPU 配置
根據前面描述 CPU 的基本知識, 可以知道 CPU 有物理 CPU, 多核 CPU, 超線程 CPU 之分.
事實上, QEMU 支持所有這些配置, 下面一一舉例來說明如何模擬這些 CPU.
基本的 CPU 模擬
下面的指令模擬了一個具有 1 個物理 CPU, 兩個邏輯 CPU 的系統
在 guest 上看看 cpuinfo 的信息:
可以看到兩個邏輯 CPU 是雙核的, 沒有使用超線程技術.
指定核心數
模擬一個具有 1 個物理 CPU(雙核), 四個邏輯 CPU 的系統. 此時為了滿足雙核 四線程的概念, 得啟用超線程技術, 如下
指定 thread 數
模擬一個具有 2 個物理 CPU, 四個邏輯 CPU 的系統, 啟用超線程技術, 每個核心兩個 線程. 不難算出, 此時每個 CPU 都是單核的(4 = 2*2*1).
其它
事實上, QEMU 還有更強大的 CPU 的配置, 比如配置 CPU 指令級, 配置 NUMA, 等等, 這里不一一列舉.