iT邦幫忙

0

go中關於sync.map的一點疑惑

  • 分享至 

  • xImage

sync.map的套件包中對於Map裡的dirty map 有以下的解釋

//dirty contains the portion of the map's contents that require mu to be
//held. To ensure that the dirty map can be promoted to the read map quickly,
//it also includes all of the non-expunged entries in the read map.
//
//Expunged entries are not stored in the dirty map. An expunged entry in the
//clean map must be unexpunged and added to the dirty map before a new value
//can be stored to it.
//
//If the dirty map is nil, the next write to the map will initialize it by
//making a shallow copy of the clean map, omitting stale entries.
    
dirty map[any]*entry

目前我有兩個疑惑
1.他這邊所謂的clean map指的是sync.map中的readOnly的map結構嗎?因為他文件內就只有這邊提到clean map這個字
2.對於第二段的解釋,我自己查了一下,目前我的想法是,當我們從 clean map 中刪除一個鍵值對時,這個 entry 會被標記為 “被刪除” 的狀態,而且在 clean map 中仍然存在(即便是標記為刪除的狀態)。
在同步過程中,當需要將 dirty map 的修改應用到 clean map 時,被標記為 “被刪除” 的 entry 需要被 “取消標記”,並且從 clean map 中移除。
然後,這個被取消標記的 entry 會被加入到 dirty map 中,這樣才能確保同步過程對於刪除操作的一致性處理。
而因為dirty map不會儲存無效或被刪除的條目,而是儲存需要被同步到read map的有效修改,所以Expunged entries不會直接儲存到dirty map

我想請問,對於這解釋我有甚麼理解錯的地方嗎,抑或者有更簡短的解釋方式,我頭腦對這個有點亂XD

froce iT邦大師 1 級 ‧ 2023-08-30 10:38:41 檢舉
我還沒去追源碼,最近的工作沒去碰這塊,但昨天google了一下,認識可能不是很正確。
1. 應該是
2. 看下面海綿寶寶提供的知乎的(七),你缺了一個中間態nil,刪除時如果在dirty map就直接刪除就好,反正miss的次數大於等於dirty的鍵數就會直接把dirty直接覆蓋read,然後dirty清空。在read map裡的就會把entry的指針先指向nil,鍵保留,等到需要觸發read轉換到dirty的時候,把entry指向nil的改成指向expunged(這時候entry只剩下兩種可能,expunged或是正常值),然後把所有非expunged的entry淺拷貝到dirty。等到下次dirty轉換到read的時候,就整個覆蓋。

類似資料庫有時刪除會標示為待刪除,等到排程到了就真的刪掉的意思。

真要理解的話看源碼和知乎那篇一起看會比較好懂一點。
https://cs.opensource.google/go/go/+/refs/tags/go1.21.0:src/sync/map.go;l=35
brown125 iT邦新手 5 級 ‧ 2023-08-30 12:05:22 檢舉
感謝,因為這一小段很多解析都不太特別講,要連接到後面對應的函式很麻煩
froce iT邦大師 1 級 ‧ 2023-08-30 14:31:17 檢舉
其實用的時候大概知道怎麼用,還有這只有加速讀取,寫入會變慢,應該就夠了。
很多細節的操作都在sync.Map裡包掉了,除非你要自己優化,要接觸到內部的細節的機會應該不多。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2023-08-30 07:13:59

Google 兩篇供參考
概念
細節

另外
如果這題解決了的話
記得選個最有幫助解答以結案

我要發表回答

立即登入回答