壓榨CPU性能帶來(lái)的問(wèn)題
由于CPU速度非常快,且價(jià)格非常昂貴,我們必須得 充分壓榨CPU ,得像生產(chǎn)隊(duì)的驢一樣,讓它不停地工作!
為了合理利用 CPU 的高性能,同時(shí)盡可能地節(jié)約成本,現(xiàn)代計(jì)算機(jī)將這些儲(chǔ)存器充分的結(jié)合起來(lái),由于這些硬件的數(shù)據(jù)存取速度差異導(dǎo)致了計(jì)算機(jī)系統(tǒng)編程中的各種問(wèn)題:
有序性問(wèn)題
為了充分壓榨CPU的性能, CPU 會(huì)對(duì)指令亂序執(zhí)行或者語(yǔ)言的編譯器會(huì)指令重排 ,讓CPU一直工作不停歇,但同時(shí)會(huì)導(dǎo)致有序性
問(wèn)題。
在CPU中為了能夠讓指令的執(zhí)行盡可能地同時(shí)運(yùn)行起來(lái),采用了 指令流水線(xiàn) 。一個(gè) CPU 指令的執(zhí)行過(guò)程可以分成 4 個(gè)階段:取指、譯碼、執(zhí)行、寫(xiě)回
。這 4 個(gè)階段分別由 4 個(gè)獨(dú)立物理執(zhí)行單元來(lái)完成。
理想的情況是:指令之間無(wú)依賴(lài),可以使流水線(xiàn)的并行度最大化。但是如果兩條指令的前后存在依賴(lài)關(guān)系,比如數(shù)據(jù)依賴(lài),控制依賴(lài)等,此時(shí)后一條語(yǔ)句就必需等到前一條指令完成后,才能開(kāi)始。所以CPU為了提高流水線(xiàn)的運(yùn)行效率,對(duì)無(wú)依賴(lài)的前后指令做 適當(dāng)?shù)膩y序和調(diào)度 。
還有一種情況 編譯器會(huì)指令重排 ,比如java語(yǔ)言,JVM 的編譯器會(huì)對(duì)其指令進(jìn)行重排序的優(yōu)化( 指令重排 )。
所謂指令重排是指在不改變?cè)Z(yǔ)義的情況下,通過(guò)調(diào)整指令的執(zhí)行順序讓程序運(yùn)行的更快。JVM中并沒(méi)有規(guī)定編譯器優(yōu)化相關(guān)的內(nèi)容,也就是說(shuō)JVM可以自由的進(jìn)行指令重排序的優(yōu)化。
無(wú)論是編譯期的指令重排還是 CPU 的亂序執(zhí)行 ,主要都是為了讓 CPU 內(nèi)部的指令流水線(xiàn)可以“填滿(mǎn)”,提高指令執(zhí)行的并行度,充分利用CPU的高性能。
可見(jiàn)性問(wèn)題
為了平衡CPU的寄存器和內(nèi)存的速度差異,計(jì)算機(jī)的CPU 增加了高速緩存,但同時(shí)導(dǎo)致了 可見(jiàn)性
問(wèn)題。我們知道當(dāng)程序執(zhí)行時(shí),一般CPU會(huì)去從內(nèi)存中讀取數(shù)據(jù),來(lái)進(jìn)行計(jì)算。CPU計(jì)算完之后,需要把數(shù)據(jù)重新放回到內(nèi)存中。
當(dāng)CPU的多個(gè)核心參與一個(gè)程序的運(yùn)行,從內(nèi)存中讀取一個(gè)共享變量的數(shù)據(jù),當(dāng)不同核心間進(jìn)行了各自的計(jì)算,把計(jì)算后的值放入自己的緩存中而不選擇立即寫(xiě)入內(nèi)存中(CPU寫(xiě)入內(nèi)存的時(shí)機(jī)是不確定的)。那么在CPU的緩存中,這個(gè)共享變量有可能存放著不同的數(shù)據(jù),這就導(dǎo)致了緩存的可見(jiàn)性問(wèn)題。即一個(gè)線(xiàn)程對(duì)數(shù)據(jù)的修改無(wú)法對(duì)其他線(xiàn)程可見(jiàn)。
原子性問(wèn)題
為了平衡CPU 與 I/O 設(shè)備
的速度差異,操作系統(tǒng)增加了進(jìn)程、線(xiàn)程
概念,以分時(shí)復(fù)用 CPU,但同時(shí)導(dǎo)致了原子性
問(wèn)題。
原子操作就是不可分割的操作,在計(jì)算機(jī)中,就是指不會(huì)因?yàn)榫€(xiàn)程調(diào)度被打斷的操作。
當(dāng)一個(gè)程序去I/O 設(shè)備讀取數(shù)據(jù), 由于I/O 設(shè)備數(shù)據(jù)存入讀取速度,相比于CPU的執(zhí)行速度來(lái)說(shuō)度日如年,CPU這么牛逼這么昂貴的寶貝,怎么能讓它歇著,得讓它一直干活,去切換執(zhí)行其他程序。也就是將CPU的時(shí)間進(jìn)行分片,讓各個(gè)程序在CPU上輪轉(zhuǎn)執(zhí)行。但被剝奪執(zhí)行權(quán)的程序,等它從IO讀取完數(shù)據(jù)后,還是得讓CPU繼續(xù)執(zhí)行的,這時(shí)需要一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)保存,以便之后恢復(fù)繼續(xù)執(zhí)行,這個(gè)就是進(jìn)程。
一開(kāi)始進(jìn)程中 只有一個(gè)"執(zhí)行流",干活的人就一個(gè)。隨著任務(wù)越來(lái)越多,發(fā)現(xiàn)進(jìn)程不夠用了,經(jīng)常導(dǎo)致整個(gè)程序被阻塞,這時(shí)計(jì)算機(jī)讓進(jìn)程有多個(gè)執(zhí)行流,干活的人變多了,那程序就不會(huì)再被阻塞了,"執(zhí)行流" 就是線(xiàn)程。
如何解決這3個(gè)問(wèn)題,就是并發(fā)、多線(xiàn)程需要處理的事,當(dāng)然這是后話(huà)。
參考資料:
《深入理解計(jì)算機(jī)系統(tǒng)》
《計(jì)算機(jī)組成原理》
《計(jì)算機(jī)組成原理》--唐朔飛
https://zhuanlan.zhihu.com/p/379947484
-
cpu
+關(guān)注
關(guān)注
68文章
11033瀏覽量
215963 -
計(jì)算機(jī)系統(tǒng)
+關(guān)注
關(guān)注
0文章
290瀏覽量
24518 -
運(yùn)算器
+關(guān)注
關(guān)注
1文章
164瀏覽量
16742
發(fā)布評(píng)論請(qǐng)先 登錄
咦!?怎么沒(méi)有專(zhuān)門(mén)的計(jì)算機(jī)硬件設(shè)計(jì)的板塊和cpu設(shè)計(jì)的板塊?
什么是計(jì)算機(jī)系統(tǒng)、計(jì)算機(jī)硬件和計(jì)算機(jī)軟件?
計(jì)算機(jī)硬件各種故障及診斷方法
關(guān)于計(jì)算機(jī)的硬件維護(hù)的淺析
計(jì)算機(jī)硬件,第2篇 計(jì)算機(jī)硬件系統(tǒng).pdf 精選資料分享
計(jì)算機(jī)硬件系統(tǒng)的組成及其性能維護(hù)分析
計(jì)算機(jī)硬件維護(hù)的方法
了解計(jì)算機(jī)硬件體系結(jié)構(gòu)
計(jì)算機(jī)硬件的基本組成
計(jì)算機(jī)硬件知識(shí)試題
計(jì)算機(jī)硬件的重要部件
淺析計(jì)算機(jī)硬件的讀寫(xiě)速度差異(上)

評(píng)論