Lock Free結構的一些開發注意事項

來源:互聯網
上載者:User
昨天打算重寫記憶體 Clerk,以前系統上用的記憶體 Clerk很不方便,為了加入引用計數功能而犧牲了簡單性,而且為了安全執行緒用了一些鎖。這次做到了所有記憶體配置和釋放都是Lock Free的。因為記憶體塊之間是單鏈表,所以實現Lock Free比較簡單。難的地方是管理空閑資源是用的一個數組,這時要使用DCAS及類似的方法(k word compare and k-th swap)。我的電腦不支援CAS操作,所以無法判斷。在遠程伺服器上,100個線程同時分配1000~100000不等個4位元組大小的記憶體,記憶體池從40位元組起增長,無鎖結構用時15秒左右,有鎖結構用時9秒左右。用10個線程同時分配900000~1000000不等個4位元組大小的記憶體,記憶體池從40位元組起增長,無鎖結構用時14秒左右,有鎖結構用時14秒左右。用5個線程同時分配1800000~2000000不等個4位元組大小的記憶體,記憶體池從40位元組起增長,無鎖結構用時8秒左右,有鎖結構用時13秒左右。

上面的測試顯示,無鎖結構線上程數接近核心實際數量的時候表現才優於有鎖結構。而在大量線程工作時候效果不佳。因為記憶體配置使用的是數組結構而不是單鏈表結構,理論上,每次操作都和整個數組相關,因此會造成數個線程的原子操作都在等待一個數組的完成,產生大量垃圾代碼,影響了執行效率。而線上程數量較少的情況下,鎖的開銷會比垃圾代碼執行的開銷大。

下面是DCAS利用CAS進行類比的一個方法:

  1. bool cas(volatile void** x, void* new_x, void* old_x);
  2. bool dcas(volatile void** x, void* new_x, void* old_x, volatile void** y, void* new_y, void* old_y)
  3. {
  4.     if (old_x == DCAS_BUSY_VAL)
  5.         return false;
  6.     if (!cas(x, DCAS_BUSY_VAL, old_x))
  7.         return false;
  8.     if (!cas(y, new_y, old_y))
  9.     {
  10.         x = old_x;
  11.         return false;
  12.     }
  13.     x = new_x;
  14.     return true;
  15. }

基本類比思路是在對y變數進行更新之前,用一個DCAS_BUSY_VAL的變數將x變數鎖定,然後就可以安全更新y變數,再安全更新x變數。其他的k-compare-and-k-swap都可以用這個思路實現。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.