當(dāng)程序在運(yùn)轉(zhuǎn)過(guò)程中,會(huì)將運(yùn)算需要的數(shù)據(jù)從主存仿制一份到CPU高速緩存中,那么CPU進(jìn)行核算時(shí)就可以從它的高速緩存讀取數(shù)據(jù)和向其中寫入數(shù)據(jù),當(dāng)運(yùn)算結(jié)束后,再將高速緩存中的數(shù)據(jù)刷新到主存傍邊。舉個(gè)簡(jiǎn)略的比如,比方下面的這段代碼:
i=i+1;
當(dāng)線程履行這個(gè)句子時(shí),會(huì)先從主存傍邊讀取i的值,然后仿制一份到高速緩存傍邊,然后CPU履行指令對(duì)i指令進(jìn)行加1操作,然后將數(shù)據(jù)寫入高速緩存,終究將高速緩存中i最新的值刷新到主存傍邊。
這個(gè)代碼在單線程中運(yùn)轉(zhuǎn)時(shí)沒有任何問(wèn)題的,但是在多線程中運(yùn)轉(zhuǎn)就會(huì)有問(wèn)題了。在多核CPU中,每條線程或許運(yùn)轉(zhuǎn)于不同的CPU中,因而每個(gè)線程運(yùn)轉(zhuǎn)時(shí)有自己的高速緩存(對(duì)單核CPU來(lái)說(shuō),其實(shí)也會(huì)呈現(xiàn)這種問(wèn)題,只不過(guò)是以線程調(diào)度的方式來(lái)分別履行的)。咱們以多核CPU為例。
比方同時(shí)有兩個(gè)線程履行這段代碼,假設(shè)初始時(shí)i的值為0,那么咱們期望兩個(gè)線程履行完之后i的值變?yōu)?。但現(xiàn)實(shí)會(huì)是這樣嗎?
或許存在下面一種情況:初始時(shí),兩個(gè)線程分別讀取i的值存入各自地點(diǎn)的CPU的高速緩存傍邊,然后線程1進(jìn)行加1操作,然后把i的最新值1寫入到內(nèi)存。此刻線程2的高速緩存傍邊i的值仍是0,進(jìn)行加1操作后,i的值為1,然后線程2把i的值寫入內(nèi)存。
終究成果i的值是1,而不是2。這便是著名的緩存共同性問(wèn)題。一般稱這種被多個(gè)線程拜訪的變量為同享變量。
也便是說(shuō),假如一個(gè)變量在多個(gè)CPU中都存在緩存(一般在多線程編程時(shí)才會(huì)呈現(xiàn)),那么就或許存在緩存不共同的問(wèn)題。
為了處理緩存不共同問(wèn)題,一般來(lái)說(shuō)有以下2種處理方法:
1)經(jīng)過(guò)在總線加LOCK,鎖的方式;
2)經(jīng)過(guò)緩存共同性協(xié)議;
在早期的CPU中,是經(jīng)過(guò)在總線上加LOCK鎖的方式來(lái)處理緩存不共同的問(wèn)題。因?yàn)镃PU和其他部件進(jìn)行通信都是經(jīng)過(guò)總線來(lái)進(jìn)行的,假如對(duì)總線加LOCK鎖的話,也便是說(shuō)阻塞了其他CPU對(duì)其它部件拜訪(如內(nèi)存),從而使得只能有一個(gè)CPU能運(yùn)用這個(gè)變量的內(nèi)存。比方上面比如中,假如一個(gè)線程在履行i=i+1,假如在履行這段代碼的過(guò)程中,在總線上發(fā)出了LOCK鎖的信號(hào),那么只要等候這段代碼徹底履行結(jié)束之后,其他CPU才能從變量i地點(diǎn)的內(nèi)存讀取變量,然后進(jìn)行相應(yīng)的操作。這樣就處理了緩存不共同的問(wèn)題。
但是上面的方式會(huì)有一個(gè)問(wèn)題,由于在鎖住總線期間,其他CPU無(wú)法拜訪內(nèi)存,導(dǎo)致效率低下。
所以就呈現(xiàn)了緩存共同性協(xié)議。該協(xié)議保證了每個(gè)緩存中運(yùn)用的同享變量的副本是共同的。它的中心思想是:當(dāng)CPU向內(nèi)存寫入數(shù)據(jù)時(shí),假如發(fā)現(xiàn)操作的變量時(shí)同享變量,即在其他CPU中也存在該變量的副本,會(huì)發(fā)出信號(hào)通知其他CPU將該變量的緩存行置為無(wú)效狀況,因而當(dāng)其他CPU需要讀取這個(gè)變量時(shí),發(fā)現(xiàn)自己緩存中緩存該變量的緩存是無(wú)效的,那么它就會(huì)從內(nèi)存重新讀取。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)