我們先來回顧一下之前的內(nèi)容。CPU其實(shí)就是執(zhí)行指令的器件,指令從哪讀取要看PC寄存器,取得的指令需要翻譯成電路的控制信號,最后輸出一條指令的結(jié)果,這個(gè)結(jié)果可能會對下一條指令產(chǎn)生影響,也可能會對內(nèi)存或地址空間中的某個(gè)值產(chǎn)生影響。
今天我們來講講線程、進(jìn)程和CPU中的超線程。
我們通過不計(jì)其數(shù)的指令的組合,可以形成一個(gè)完整的線程。線程之間通過少量的必要的溝通組合形成一個(gè)進(jìn)程,也就是我們通常意義上的應(yīng)用程序。比如說音樂播放器中,音樂的播放是一個(gè)線程,用戶的操作界面是另外一個(gè)線程,兩個(gè)線程合起來構(gòu)成了音樂播放器。當(dāng)然,一個(gè)應(yīng)用程序(進(jìn)程)也可以只有一個(gè)線程。
早期的計(jì)算機(jī)不像現(xiàn)在如此發(fā)達(dá),一般一臺計(jì)算機(jī)一段時(shí)間內(nèi)只運(yùn)行一個(gè)線程,比如說計(jì)算導(dǎo)彈軌跡什么的,在計(jì)算完成后輸出結(jié)果,線程結(jié)束。然而時(shí)代在改變,在寫這段文字的時(shí)候,我的平板一邊打開著wps,一邊播放著音樂。這兩個(gè)進(jìn)程的運(yùn)行是連續(xù)的、同時(shí)的。
為什么會連續(xù)、同時(shí)呢?
首先,當(dāng)今的CPU的核心數(shù)早已不是單核心,一個(gè)非超線程(一會會講)的核心可以運(yùn)行一個(gè)線程,現(xiàn)在的八核CPU就可以同時(shí)運(yùn)行八個(gè)線程。但是這樣夠嗎?我們現(xiàn)在的電腦同一時(shí)刻需要運(yùn)行的線程可遠(yuǎn)不止八個(gè)。那看來光有核心數(shù)還不夠,我們還需要別的辦法。
第二個(gè)辦法便是分時(shí)間片。CPU運(yùn)算速度極快,我們能不能讓CPU在這一些線程上反復(fù)橫跳,快速切換并輪流執(zhí)行這些個(gè)線程,營造出一種這些線程是同時(shí)進(jìn)行的錯(cuò)覺。具體怎么操作呢?可以設(shè)置一個(gè)“鬧鐘”,當(dāng)?shù)褂?jì)時(shí)結(jié)束的時(shí)候強(qiáng)行停止CPU當(dāng)前的線程(中斷),PC寄存器跳轉(zhuǎn)到相應(yīng)的地址,將當(dāng)前未處理完的線程的PC值、寄存器組數(shù)據(jù)等信息用一種數(shù)據(jù)類型保存到內(nèi)存中,CPU將根據(jù)操作系統(tǒng)給出的決定切換到接下來要運(yùn)行的下一個(gè)線程。CPU此時(shí)要將接下來要運(yùn)行的線程從內(nèi)存中讀取,恢復(fù)該線程到CPU內(nèi)核心中,就像它之前被切換出去時(shí)的樣子,然后開始執(zhí)行這個(gè)線程。(暫不細(xì)講)
第三個(gè)方法則是今天的主角--超線程技術(shù)。這個(gè)技術(shù)我沒記錯(cuò)的話是Intel率先提出來的,他們聲稱增加5%的晶體管數(shù)量可以提升20%的性能。
具體怎么操作呢?首先我們先要考慮一下為什么一個(gè)核心只能同時(shí)運(yùn)行一個(gè)線程。
1.只有一個(gè)PC寄存器,只能指示一個(gè)線程目前運(yùn)行到哪了。
2.無法區(qū)分對寄存器組的操作。比如線程A要把第一個(gè)寄存器的值寫成0,B要讀出第一個(gè)寄存器的值,現(xiàn)在也就是0。但這個(gè)0是B想要的嗎?肯定不是。
3.還有一些涉及到線程的棧指針和頁表基地址的寄存器,也只能支撐一個(gè)線程的運(yùn)行。
因此,超線程簡單來講就是把這些不能公用的資源加倍。而那些流水線上的操作邏輯電路、ALU單元等則可以不用復(fù)制。以此實(shí)現(xiàn)多個(gè)線程同時(shí)在一個(gè)CPU的核心中進(jìn)行處理。注意,不一定一個(gè)核心只能虛擬出兩個(gè)線程,IBM的某款CPU甚至一個(gè)核心虛擬出了八個(gè)線程。
那為什么性能會提升呢?共用了這么多資源,性能應(yīng)該會有所下降才對。是的,有些時(shí)候性能確實(shí)會下滑,尤其是某個(gè)線程需要很大計(jì)算量的時(shí)候,因?yàn)楣灿茫赡軙?dǎo)致該線程運(yùn)行速度減慢。那Intel是瞎吹他們的超線程技術(shù)嗎?并不是,往往CPU限制運(yùn)行速度的不是計(jì)算而是讀寫。讀寫要做的就是等待數(shù)據(jù)的傳輸,這個(gè)過程CPU沒事可做,只能空等。但有了超線程就不一樣了,CPU可以在本該空等的地方擇機(jī)執(zhí)行另外一個(gè)線程的指令,實(shí)現(xiàn)了時(shí)間管理,縮短了兩個(gè)程序執(zhí)行的總體時(shí)間。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5425瀏覽量
123558 -
cpu
+關(guān)注
關(guān)注
68文章
11049瀏覽量
216159 -
ALU
+關(guān)注
關(guān)注
0文章
34瀏覽量
13284
發(fā)布評論請先 登錄
鴻蒙5開發(fā)寶藏案例分享---跨線程性能優(yōu)化指南
進(jìn)程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!
請問如何在Python中實(shí)現(xiàn)多線程與多進(jìn)程的協(xié)作?
請問rt-thread studio如何進(jìn)行多線程編譯?
華為云 X 實(shí)例 CPU 性能測試詳解與優(yōu)化策略

國產(chǎn)GPU獨(dú)角獸摩爾線程啟動上市輔導(dǎo)
socket 多線程編程實(shí)現(xiàn)方法
摩爾線程完成股改,籌備上市
一文搞懂Linux進(jìn)程的睡眠和喚醒
Python中多線程和多進(jìn)程的區(qū)別

CPU線程和程序線程的區(qū)別
從多線程設(shè)計(jì)模式到對 CompletableFuture 的應(yīng)用

探索虛擬線程:原理與實(shí)現(xiàn)

評論