A. linux 中多線程與超線程有什麼區別
超線抄程從硬體層面理解,即一襲個CPU的部件(可以理解為核)同時執行多條指令,表現就是同時執行多個線程。
多線程是軟體層面的概念,比如CPU只有一個核,通過線程調度可以在一個時間段內運行多個程序或任務,但實際任何時刻只執行一個線程。
B. 如何判斷linux下物理cpu數,核數以及是否支持超線程
# 總核數 = 物理CPU個數 X 每顆物理CPU的核數
# 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數
# 查看物理CPU個數
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看邏輯CPU的個數
cat /proc/cpuinfo| grep "processor"| wc -l
轉自http://www.cnblogs.com/emanlee/p/3587571.html
如果物理cpu數×每cpu核數=邏輯cpu數則代表不支持超線程,反之則支持。
C. linux怎麼查詢cpu核心數
1.查看邏輯CPU個數:
#cat /proc/cpuinfo |grep "processor"|sort -u|wc -l
24
2.由於有超線程技術有必要查看一下物理CPU個數:
#grep "physical id" /proc/cpuinfo|sort -u|wc -l
2
#grep "physical id" /proc/cpuinfo|sort -u
physical id : 0
physical id : 1
查看每個物理CPU內核個數:
#grep "cpu cores" /proc/cpuinfo|uniq
cpu cores : 6
每個物理CPU上邏輯CPU個數:
#grep "siblings" /proc/cpuinfo|uniq
siblings : 12
判斷是否開啟了抄超線程:
如果多個邏輯CPU的"physical id"和"core id"均相同,說明開啟了超線程
或者換句話說
邏輯CPU個數 > 物理CPU個數 * CPU內核數 開啟了超線程
邏輯CPU個數 = 物理CPU個數 * CPU內核數 沒有開啟超線程
相關知識延伸閱讀:
一次性查詢所有信息:
#!/bin/bash
physicalNumber=0
coreNumber=0
logicalNumber=0
HTNumber=0
logicalNumber=$(grep "processor" /proc/cpuinfo|sort -u|wc -l)
physicalNumber=$(grep "physical id" /proc/cpuinfo|sort -u|wc -l)
coreNumber=$(grep "cpu cores" /proc/cpuinfo|uniq|awk -F':' '{print $2}'|xargs)
HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))
echo "****** CPU Information ******"
echo "Logical CPU Number : ${logicalNumber}"
echo "Physical CPU Number : ${physicalNumber}"
echo "CPU Core Number : ${coreNumber}"
echo "HT Number : ${HTNumber}"
echo "*****************************"
執行結果:
#./cpuinfo
****** CPU Information ******
Logical CPU Number : 24
Physical CPU Number : 2
CPU Core Number : 6
HT Number : 2
D. Linux進程的調度
上回書說到 Linux進程的由來 和 Linux進程的創建 ,其實在同一時刻只能支持有限個進程或線程同時運行(這取決於CPU核數量,基本上一個進程對應一個CPU),在一個運行的操作系統上可能運行著很多進程,如果運行的進程占據CPU的時間很長,就有可能導致其他進程餓死。為了解決這種問題,操作系統引入了 進程調度器 來進行進程的切換,輪流讓各個進程使用CPU資源。
1)rq: 進程的運行隊列( runqueue), 每個CPU對應一個 ,包含自旋鎖(spinlock)、進程數量、用於公平調度的CFS信息結構、當前運行的進程描述符等。實際的進程隊列用紅黑樹來維護(通過CFS信息結構來訪問)。
2)cfs_rq: cfs調度的進程運行隊列信息 ,包含紅黑樹的根結點、正在運行的進程指針、用於負載均衡的葉子隊列等。
3)sched_entity: 把需要調度的東西抽象成調度實體 ,調度實體可以是進程、進程組、用戶等。這里包含負載權重值、對應紅黑樹結點、 虛擬運行時vruntime 等。
4)sched_class:把 調度策略(演算法)抽象成調度類 ,包含一組通用的調度操作介面。介面和實現是分離,可以根據調度介面去實現不同的調度演算法,使一個Linux調度程序可以有多個不同的調度策略。
1) 關閉內核搶占 ,初始化部分變數。獲取當前CPU的ID號,並賦值給局部變數CPU, 使rq指向CPU對應的運行隊列 。 標識當前CPU發生任務切換 ,通知RCU更新狀態,如果當前CPU處於rcu_read_lock狀態,當前進程將會放入rnp-> blkd_tasks阻塞隊列,並呈現在rnp-> gp_tasks鏈表中。 關閉本地中斷 ,獲取所要保護的運行隊列的自旋鎖, 為查找可運行進程做准備 。
2) 檢查prev的狀態,更新運行隊列 。如果不是可運行狀態,而且在內核態沒被搶占,應該從運行隊列中 刪除prev進程 。如果是非阻塞掛起信號,而且狀態為TASK_INTER-RUPTIBLE,就把該進程的狀態設置為TASK_RUNNING,並將它 插入到運行隊列 。
3)task_on_rq_queued(prev) 將pre進程插入到運行隊列的隊尾。
4)pick_next_task 選取將要執行的next進程。
5)context_switch(rq, prev, next)進行 進程上下文切換 。
1) 該進程分配的CPU時間片用完。
2) 該進程主動放棄CPU(例如IO操作)。
3) 某一進程搶佔CPU獲得執行機會。
Linux並沒有使用x86 CPU自帶的任務切換機制,需要通過手工的方式實現了切換。
進程創建後在內核的數據結構為task_struct , 該結構中有掩碼屬性cpus_allowed,4個核的CPU可以有4位掩碼,如果CPU開啟超線程,有一個8位掩碼,進程可以運行在掩碼位設置為1的CPU上。
Linux內核API提供了兩個系統調用 ,讓用戶可以修改和查看當前的掩碼:
1) sched_setaffinity():用來修改位掩碼。
2) sched_getaffinity():用來查看當前的位掩碼。
在下次task被喚醒時,select_task_rq_fair根據cpu_allowed里的掩碼來確定將其置於哪個CPU的運行隊列,一個進程在某一時刻只能存在於一個CPU的運行隊列里。
在Nginx中,使用了CPU親和度來完成某些場景的工作:
worker_processes 4;
worker_cpu_affinity 0001001001001000;
上面這個配置說明了4個工作進程中的每一個和一個CPU核掛鉤。如果這個內容寫入Nginx的配置文件中,然後Nginx啟動或者重新載入配置的時候,若worker_process是4,就會啟用4個worker,然後把worker_cpu_affinity後面的4個值當作4個cpu affinity mask,分別調用ngx_setaffinity,然後就把4個worker進程分別綁定到CPU0~3上。
worker_processes 2;
worker_cpu_affinity 01011010;
上面這個配置則說明了兩個工作進程中的每一個和2個核掛鉤。
E. 怎麼才能開啟超線程技術
超線程(Hyper-Threading,簡稱「HT」
超線程技術就是利用特殊的硬體指令,把兩個邏輯內核模擬成兩個物理晶元,讓單個處理器都能使用線程級並行計算,進而兼容多線程操作系統和軟體,減少了CPU的閑置時間,提高的CPU的運行效率。
超線程技術是在一顆CPU同時執行多個程序而共同分享一顆CPU內的資源,理論上要像兩顆CPU一樣在同一時間執行兩個線程,P4處理器需要多加入一個Logical CPU Pointer(邏輯處理單元)。因此新一代的P4 HT的die的面積比以往的P4增大了5%。而其餘部分如ALU(整數運算單元)、FPU(浮點運算單元)、L2 Cache(二級緩存)則保持不變,這些部分是被分享的。
雖然採用超線程技術能同時執行兩個線程,但它並不象兩個真正的CPU那樣,每各CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,並讓出資源,直到這些資源閑置後才能繼續。因此超線程的性能並不等於兩顆CPU的性能。
工作原理
在處理多個線程的過程中,多線程處理器內部的每個邏輯處理器均可以單獨對中斷做出響應,當第一個邏輯處理器跟蹤一個軟體線程時,第二個邏輯處理器也開始對另外一個軟體線程進行跟蹤和處理了。
另外,為了避免CPU處理資源沖突,負責處理第二個線程的那個邏輯處理器,其使用的是僅是運行第一個線程時被暫時閑置的處理單元。
例如:當一個邏輯處理器在執行浮點運算(使用處理器的浮點運算單元)時,另一個邏輯處理器可以執行加法運算(使用處理器的整數運算單元)。這樣做,無疑大大提高了處理器內部處理單元的利用率和相應的數據、指令處吞吐能力。對於Prescott處理器,發熱量大也主要是因為它。
實現超線程的前提條件
(1)需要CPU支持
目前正式支持超線程技術的CPU有Pentium4 3.06GHz 、2.40C、2.60C、2.80C 、3.0GHz、3.2GHz以及Prescott處理器,還有部分型號的Xeon。
(2)需要主板晶元組支持
正式支持超線程技術的主板晶元組的主要型號包括Intel的875P,E7205,850E,865PE/G/P,845PE/GE/GV,845G(B-stepping),845E。875P,E7205,865PE/G/P,845PE/GE/GV晶元組均可正常支持超線程技術的使用,而早前的845E以及850E晶元組只要升級BIOS就可以解決支持的問題;
SIS方面有SiS645DX(B版)、SiS648(B版)、SIS655、SIS658、SIS648FX;
威盛方面有P4X400A、P4X600、P4X800。
(3)需要主板BIOS支持
主板廠商必須在BIOS中支持超線程才行。
(4)需要操作系統支持
目前微軟的操作系統中只有Windows XP專業版及後續版本支持此功能,而在Windows 2000上實現對超線程支持的計劃已經取消了。
(5)需要應用軟體支持
一般來說,只要能夠支持多處理器的軟體均可支持超線程技術,但是實際上這樣的軟體並不多,而且偏向於圖形、視頻處理等專業軟體方面,游戲軟體極少有支持的。應用軟體有Office 2000、Office XP等。另外Linux kernel 2.4.x以後的版本也支持超線程技術。
CPU生產商為了提高CPU的性能,通常做法是提高CPU的時鍾頻率和增加緩存容量。不過目前CPU的頻率越來越快,如果再通過提升CPU頻率和增加緩存的方法來提高性能,往往會受到製造工藝上的限制以及成本過高的制約。
盡管提高CPU的時鍾頻率和增加緩存容量後的確可以改善性能,但這樣的CPU性能提高在技術上存在較大的難度。實際上在應用中基於很多原因,CPU的執行單元都沒有被充分使用。如果CPU不能正常讀取數據(匯流排/內存的瓶頸),其執行單元利用率會明顯下降。另外就是目前大多數執行線程缺乏ILP(Instruction-Level Parallelism,多種指令同時執行)支持。這些都造成了目前CPU的性能沒有得到全部的發揮。因此,Intel則採用另一個思路去提高CPU的性能,讓CPU可以同時執行多重線程,就能夠讓CPU發揮更大效率,即所謂「超線程(Hyper-Threading,簡稱「HT」)」技術。超線程技術就是利用特殊的硬體指令,把兩個邏輯內核模擬成兩個物理晶元,讓單個處理器都能使用線程級並行計算,進而兼容多線程操作系統和軟體,減少了CPU的閑置時間,提高的CPU的運行效率。
採用超線程及時可在同一時間里,應用程序可以使用晶元的不同部分。雖然單線程晶元每秒鍾能夠處理成千上萬條指令,但是在任一時刻只能夠對一條指令進行操作。而超線程技術可以使晶元同時進行多線程處理,使晶元性能得到提升。
超線程技術是在一顆CPU同時執行多個程序而共同分享一顆CPU內的資源,理論上要像兩顆CPU一樣在同一時間執行兩個線程,P4處理器需要多加入一個Logical CPU Pointer(邏輯處理單元)。因此新一代的P4 HT的die的面積比以往的P4增大了5%。而其餘部分如ALU(整數運算單元)、FPU(浮點運算單元)、L2 Cache(二級緩存)則保持不變,這些部分是被分享的。
雖然採用超線程技術能同時執行兩個線程,但它並不象兩個真正的CPU那樣,每各CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,並讓出資源,直到這些資源閑置後才能繼續。因此超線程的性能並不等於兩顆CPU的性能。
英特爾P4 超線程有兩個運行模式,Single Task Mode(單任務模式)及Multi Task Mode(多任務模式),當程序不支持Multi-Processing(多處理器作業)時,系統會停止其中一個邏輯CPU的運行,把資源集中於單個邏輯CPU中,讓單線程程序不會因其中一個邏輯CPU閑置而減低性能,但由於被停止運行的邏輯CPU還是會等待工作,佔用一定的資源,因此Hyper-Threading CPU運行Single Task Mode程序模式時,有可能達不到不帶超線程功能的CPU性能,但性能差距不會太大。也就是說,當運行單線程運用軟體時,超線程技術甚至會降低系統性能,尤其在多線程操作系統運行單線程軟體時容易出現此問題。
需要注意的是,含有超線程技術的CPU需要晶元組、軟體支持,才能比較理想的發揮該項技術的優勢。目前支持超線程技術的晶元組包括如:英特爾i845GE、PE及矽統iSR658 RDRAM、SiS645DX、SiS651可直接支持超線程;英特爾i845E、i850E通過升級BIOS後可支持;威盛P4X400、P4X400A可支持,但未獲得正式授權。操作系統如:Microsoft Windows XP、Microsoft Windows 2003,Linux kernel 2.4.x以後的版本也支持超線程技術。