自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

就為了一個(gè)原子操作,其他CPU核心罷工了

運(yùn)維 系統(tǒng)運(yùn)維
我們兩個(gè)CPU車間各自負(fù)責(zé)的線程都在執(zhí)行一個(gè)i++的操作,我們都把i的值放到了自己的緩存中,完了之后都沒(méi)有通知對(duì)方,加了兩次但結(jié)果卻只有一次,出現(xiàn)了數(shù)據(jù)不一致問(wèn)題。

i++問(wèn)題

“阿Q趕快回去吧,隔壁二號(hào)車間的虎子說(shuō)我們改了他們的數(shù)據(jù),上門來(lái)鬧事了”

由于老K的突然出現(xiàn),我不得不提前結(jié)束與小黑的交流,趕回了CPU一號(hào)車間。

見到我回來(lái),虎子立刻朝我嚷嚷:“你們是怎么回事?才幾納秒的時(shí)間,就把數(shù)據(jù)給我改了,你說(shuō)這事怎么辦吧!”

我聽著迷迷糊糊的,連連說(shuō)到:“虎子你先別急,我剛回來(lái),到底出什么事兒了,先讓我了解清楚好不好?”

接下來(lái),老K把事情的經(jīng)過(guò)告訴了我。原來(lái),我們兩個(gè)CPU車間各自負(fù)責(zé)的線程都在執(zhí)行一個(gè)i++的操作,我們都把i的值放到了自己的緩存中,完了之后都沒(méi)有通知對(duì)方,加了兩次但結(jié)果卻只有一次,出現(xiàn)了數(shù)據(jù)不一致問(wèn)題。

原子操作

了解清楚事情的原委之后,我向虎子說(shuō)道:“大家都執(zhí)行一樣的代碼,這事兒也不能怪我們啊”

虎子一聽急了,“怎么不怪你們了,我們比你們先一步找內(nèi)存拿走了i,那你們得等我們加完之后再用啊,不信你可以打電話問(wèn)內(nèi)存那家伙,看看是不是我們二號(hào)車間先來(lái)的”

“好好好,你先冷靜一下,你看我們又不知道你們先去拿了,這不情有可原嗎,再說(shuō)現(xiàn)在事情已經(jīng)出了,我們應(yīng)該一起坐下來(lái)想個(gè)辦法避免以后再次出現(xiàn)這種問(wèn)題,你說(shuō)是不是?”

虎子嘆了口氣問(wèn)道:“那你說(shuō)說(shuō)你有什么辦法?”

[[327167]]

我繼續(xù)說(shuō)道:“你看啊,像咱們?cè)趫?zhí)行i++這種操作的時(shí)候就不應(yīng)該被干擾”

“不被干擾?”

“對(duì),比如虎子你們二號(hào)車間在訪問(wèn)i的時(shí)候,我們一號(hào)車間就不能訪問(wèn),需要等著,等你們?cè)L問(wèn)完成我們?cè)賮?lái),非常簡(jiǎn)單的辦法卻很有用”

虎子聽完一愣,“這不就是加鎖嗎?你是想怪程序員做i++前沒(méi)有加鎖?”

“的確是加鎖,不過(guò)這種簡(jiǎn)單操作還要程序員來(lái)加鎖那也太麻煩了,咱們CPU內(nèi)部處理好就行了”

“內(nèi)部處理,你打算怎么實(shí)現(xiàn)?”,虎子問(wèn)到。

“這,,讓我想想···”,虎子問(wèn)到了具體實(shí)現(xiàn),我倒還沒(méi)想到這一步。

這時(shí),一旁的老K站了出來(lái):“我倒是有個(gè)辦法,可以找總線主任啊,他是負(fù)責(zé)協(xié)調(diào)各個(gè)車間使用系統(tǒng)總線訪問(wèn)內(nèi)存的總指揮,讓他在中間協(xié)調(diào)一下應(yīng)該不難”

老K一語(yǔ)點(diǎn)醒夢(mèng)中人,接著我們就去找了總線主任,后來(lái)我們商量出了一套解決方案:我們定義了一個(gè)叫原子操作的東西,表示這是一個(gè)不可切分的動(dòng)作,誰(shuí)要執(zhí)行原子操作,總線主任就在系統(tǒng)總線上加上一個(gè)LOCK#信號(hào),其他車間的想去訪問(wèn)內(nèi)存就得等著,直到原子操作指令執(zhí)行完畢。

我們把這套方案上報(bào)了領(lǐng)導(dǎo),很快就批下來(lái)了,后面我們8個(gè)車間都按照這套方案來(lái)工作,以后程序員們把i++這樣的動(dòng)作換成原子操作后,問(wèn)題就能迎刃而解。

不過(guò)施行了一段時(shí)間之后,各個(gè)車間卻開始大倒苦水:就因?yàn)槟硞€(gè)車間要執(zhí)行一個(gè)原子操作,就讓總線主任把系統(tǒng)總線鎖住,其他車間的人都沒(méi)法訪問(wèn)內(nèi)存,都干不了活了,嚴(yán)重影響工作效率。

抱怨歸抱怨,在沒(méi)有更好的替代方案出現(xiàn)之前,日子還得過(guò)下去。

緩存引發(fā)的問(wèn)題

不過(guò),沒(méi)過(guò)多久,數(shù)據(jù)不一致問(wèn)題又一次出現(xiàn)了。

這一次,倒不是加法的問(wèn)題,我們兩車間還是因?yàn)楦髯跃彺娴脑颍群笮薷牧俗兞康闹?,?duì)方?jīng)]有即時(shí)知道,誤用了錯(cuò)誤的值,以致釀成大錯(cuò)。

“阿Q,上次那辦法好是好,可解決不了這一次的問(wèn)題啊”,虎子再次找上門來(lái)。

“你來(lái)的正好,我正想去找你說(shuō)這事呢”

“哦,是嗎,難不成你想到破解之道了?”

“只是一些初步的想法,問(wèn)題的核心在于現(xiàn)在咱們各個(gè)車間各自為政,都有自己的私有緩存,各自修改數(shù)據(jù)后向內(nèi)存更新時(shí)也不互相打招呼,缺少一個(gè)聯(lián)絡(luò)機(jī)制”

虎子點(diǎn)了點(diǎn)頭,“確實(shí),所以咱們需要建立一個(gè)聯(lián)絡(luò)機(jī)制,來(lái)對(duì)各個(gè)車間的緩存內(nèi)容進(jìn)行統(tǒng)一管理是嗎?”

“對(duì)!這事兒咱倆說(shuō)了可不算,我建議召集8個(gè)核心車間的代表,統(tǒng)一開一個(gè)會(huì)議,詳細(xì)討論下這個(gè)問(wèn)題。哦,對(duì)了,把總線主任也叫上,他經(jīng)驗(yàn)豐富說(shuō)不定能提供一些思路”

緩存一致性協(xié)議MESI

很快,咱們CPU的8個(gè)核心車間就為此問(wèn)題召開了會(huì)議,并且取得了非常重要的成果。

我們牽了一條新的專線,把8個(gè)核心車間連接起來(lái),用于各個(gè)車間之間進(jìn)行信息溝通,不同于CPU外部的總線系統(tǒng),大家把這個(gè)叫片內(nèi)總線。

新的線路鋪設(shè)好了,以后大家就可以通過(guò)這條線路即時(shí)溝通,為了解決之前出現(xiàn)的問(wèn)題,大家還制定了一套規(guī)則,叫做緩存一致性協(xié)議。

規(guī)則里面規(guī)定了所有車間的緩存單元——緩存行有四種狀態(tài):

  • 已修改Modified (M):緩存行已經(jīng)被修改了,與內(nèi)存的值不一樣。如果別的CPU內(nèi)核要讀內(nèi)存這塊數(shù)據(jù),要趕在這之前把該緩存行回寫到主存,把狀態(tài)變?yōu)楣蚕?S).
  • 獨(dú)占Exclusive (E):緩存行只在當(dāng)前CPU核心緩存中,而且和內(nèi)存中數(shù)據(jù)一樣。當(dāng)別的CPU核心讀取它時(shí),狀態(tài)變?yōu)楣蚕?如果當(dāng)前CPU核心修改了它,就要變?yōu)橐研薷臓顟B(tài)。
  • 共享Shared (S):緩存行存在于多個(gè)CPU核心的緩存中,而且和內(nèi)存中的內(nèi)容一致。
  • 無(wú)效Invalid (I):緩存行是無(wú)效的

四種狀態(tài)之間的轉(zhuǎn)換是這樣的:

按照這套規(guī)則,大家不能再像以前那樣隨意了,各車間對(duì)自家緩存進(jìn)行讀寫時(shí),都要相互通一下氣,避免使用過(guò)時(shí)的數(shù)據(jù)。

除此之外,還規(guī)定如果一塊內(nèi)存區(qū)域被多個(gè)車間都緩存,就不再允許多個(gè)車間同時(shí)去修改緩存了。

會(huì)議還有另外一個(gè)收獲,以前被各車間詬病的每次原子操作都要鎖定總線,導(dǎo)致大家需要訪問(wèn)內(nèi)存的都只能干等著的問(wèn)題也得到了解決。以后總線主任不再需要鎖定總線了,通過(guò)這次的緩存一致性協(xié)議就可以辦到。

自此以后,數(shù)據(jù)不一致的問(wèn)題總算是根治了,咱們8個(gè)車間又可以愉快的工作了。

 

責(zé)任編輯:趙寧寧 來(lái)源: 編程技術(shù)宇宙
相關(guān)推薦

2021-02-03 07:56:08

版本游戲邏輯

2024-12-09 08:25:47

Springsave方法

2021-07-29 09:29:12

AI游戲DeepMind

2014-01-09 09:45:41

原子飛原子

2021-02-22 11:13:17

VS Code代碼編程

2022-07-29 07:04:03

Docker鏡像容器

2023-12-31 16:35:31

Pytorch函數(shù)深度學(xué)習(xí)

2021-08-21 15:40:24

CPU計(jì)算機(jī)電子領(lǐng)域

2015-07-17 09:59:18

2015-11-16 10:15:58

2023-05-11 08:08:18

MySQL主從復(fù)制

2023-01-26 11:43:03

線程池CPUJava

2021-08-06 16:52:10

瀏覽器HTTPS通信

2024-09-14 14:14:26

Dubbo框架微服務(wù)

2022-03-23 18:00:34

循環(huán)CPU線程

2019-08-09 10:45:09

操作系統(tǒng)WindowsLinux

2020-11-27 06:44:22

原子加鎖x86

2015-11-04 14:45:59

MAC快捷鍵Linux

2021-01-14 10:37:50

云計(jì)算大數(shù)據(jù)人工智能

2023-07-24 08:11:14

Ultrai5-14500核心
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)