成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

運維 系統運維
我們兩個CPU車間各自負責的線程都在執行一個i++的操作,我們都把i的值放到了自己的緩存中,完了之后都沒有通知對方,加了兩次但結果卻只有一次,出現了數據不一致問題。

i++問題

“阿Q趕快回去吧,隔壁二號車間的虎子說我們改了他們的數據,上門來鬧事了”

由于老K的突然出現,我不得不提前結束與小黑的交流,趕回了CPU一號車間。

見到我回來,虎子立刻朝我嚷嚷:“你們是怎么回事?才幾納秒的時間,就把數據給我改了,你說這事怎么辦吧!”

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

接下來,老K把事情的經過告訴了我。原來,我們兩個CPU車間各自負責的線程都在執行一個i++的操作,我們都把i的值放到了自己的緩存中,完了之后都沒有通知對方,加了兩次但結果卻只有一次,出現了數據不一致問題。

原子操作

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

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

“好好好,你先冷靜一下,你看我們又不知道你們先去拿了,這不情有可原嗎,再說現在事情已經出了,我們應該一起坐下來想個辦法避免以后再次出現這種問題,你說是不是?”

虎子嘆了口氣問道:“那你說說你有什么辦法?”

[[327167]]

我繼續說道:“你看啊,像咱們在執行i++這種操作的時候就不應該被干擾”

“不被干擾?”

“對,比如虎子你們二號車間在訪問i的時候,我們一號車間就不能訪問,需要等著,等你們訪問完成我們再來,非常簡單的辦法卻很有用”

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

“的確是加鎖,不過這種簡單操作還要程序員來加鎖那也太麻煩了,咱們CPU內部處理好就行了”

“內部處理,你打算怎么實現?”,虎子問到。

“這,,讓我想想···”,虎子問到了具體實現,我倒還沒想到這一步。

這時,一旁的老K站了出來:“我倒是有個辦法,可以找總線主任啊,他是負責協調各個車間使用系統總線訪問內存的總指揮,讓他在中間協調一下應該不難”

老K一語點醒夢中人,接著我們就去找了總線主任,后來我們商量出了一套解決方案:我們定義了一個叫原子操作的東西,表示這是一個不可切分的動作,誰要執行原子操作,總線主任就在系統總線上加上一個LOCK#信號,其他車間的想去訪問內存就得等著,直到原子操作指令執行完畢。

我們把這套方案上報了領導,很快就批下來了,后面我們8個車間都按照這套方案來工作,以后程序員們把i++這樣的動作換成原子操作后,問題就能迎刃而解。

不過施行了一段時間之后,各個車間卻開始大倒苦水:就因為某個車間要執行一個原子操作,就讓總線主任把系統總線鎖住,其他車間的人都沒法訪問內存,都干不了活了,嚴重影響工作效率。

抱怨歸抱怨,在沒有更好的替代方案出現之前,日子還得過下去。

緩存引發的問題

不過,沒過多久,數據不一致問題又一次出現了。

這一次,倒不是加法的問題,我們兩車間還是因為各自緩存的原因,先后修改了變量的值,對方沒有即時知道,誤用了錯誤的值,以致釀成大錯。

“阿Q,上次那辦法好是好,可解決不了這一次的問題啊”,虎子再次找上門來。

“你來的正好,我正想去找你說這事呢”

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

“只是一些初步的想法,問題的核心在于現在咱們各個車間各自為政,都有自己的私有緩存,各自修改數據后向內存更新時也不互相打招呼,缺少一個聯絡機制”

虎子點了點頭,“確實,所以咱們需要建立一個聯絡機制,來對各個車間的緩存內容進行統一管理是嗎?”

“對!這事兒咱倆說了可不算,我建議召集8個核心車間的代表,統一開一個會議,詳細討論下這個問題。哦,對了,把總線主任也叫上,他經驗豐富說不定能提供一些思路”

緩存一致性協議MESI

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

我們牽了一條新的專線,把8個核心車間連接起來,用于各個車間之間進行信息溝通,不同于CPU外部的總線系統,大家把這個叫片內總線。

新的線路鋪設好了,以后大家就可以通過這條線路即時溝通,為了解決之前出現的問題,大家還制定了一套規則,叫做緩存一致性協議。

規則里面規定了所有車間的緩存單元——緩存行有四種狀態:

  • 已修改Modified (M):緩存行已經被修改了,與內存的值不一樣。如果別的CPU內核要讀內存這塊數據,要趕在這之前把該緩存行回寫到主存,把狀態變為共享(S).
  • 獨占Exclusive (E):緩存行只在當前CPU核心緩存中,而且和內存中數據一樣。當別的CPU核心讀取它時,狀態變為共享;如果當前CPU核心修改了它,就要變為已修改狀態。
  • 共享Shared (S):緩存行存在于多個CPU核心的緩存中,而且和內存中的內容一致。
  • 無效Invalid (I):緩存行是無效的

四種狀態之間的轉換是這樣的:

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

除此之外,還規定如果一塊內存區域被多個車間都緩存,就不再允許多個車間同時去修改緩存了。

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

自此以后,數據不一致的問題總算是根治了,咱們8個車間又可以愉快的工作了。

 

責任編輯:趙寧寧 來源: 編程技術宇宙
相關推薦

2024-12-09 08:25:47

Springsave方法

2021-02-03 07:56:08

版本游戲邏輯

2021-07-29 09:29:12

AI游戲DeepMind

2014-01-09 09:45:41

原子飛原子

2021-02-22 11:13:17

VS Code代碼編程

2015-11-16 10:15:58

2022-07-29 07:04:03

Docker鏡像容器

2023-12-31 16:35:31

Pytorch函數深度學習

2015-07-17 09:59:18

2021-08-21 15:40:24

CPU計算機電子領域

2023-01-26 11:43:03

線程池CPUJava

2023-05-11 08:08:18

MySQL主從復制

2021-08-06 16:52:10

瀏覽器HTTPS通信

2024-09-14 14:14:26

Dubbo框架微服務

2022-03-23 18:00:34

循環CPU線程

2019-08-09 10:45:09

操作系統WindowsLinux

2021-01-14 10:37:50

云計算大數據人工智能

2015-11-04 14:45:59

MAC快捷鍵Linux

2020-11-27 06:44:22

原子加鎖x86

2023-07-24 08:11:14

Ultrai5-14500核心
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: xxx国产精品视频 | 91久久久久 | 日本成人福利视频 | 亚洲一区二区三区免费在线 | 国产在线a | 国产999精品久久久 日本视频一区二区三区 | www.日本国产 | 中文字幕在线观看一区二区 | 久久精品小视频 | 操网站 | 99在线免费视频 | 男插女下体视频 | 欧美电影大全 | 成人亚洲精品久久久久软件 | 国产色婷婷 | 天天操伊人 | 久久久久久久一区二区 | 亚洲一区二区三区免费观看 | 国产在线观看一区二区 | 手机av在线| 美人の美乳で授乳プレイ | 久久国产日本 | 精品免费国产一区二区三区四区介绍 | 成人动慢 | 欧美一区二区三区在线观看 | 精品国产一区二区三区av片 | jvid精品资源在线观看 | 免费骚视频| 久久av一区二区三区 | 香蕉91| 欧日韩在线 | 一区二区国产精品 | 最新一级毛片 | 国产成人高清 | 日日夜精品视频 | 亚洲一区二区三区在线观看免费 | 一级看片免费视频 | 二区三区视频 | 午夜日韩 | 在线观看黄视频 | 日韩无 |