亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12345下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 25466 | 回復(fù): 40
打印 上一主題 下一主題

[學(xué)習(xí)] Linux系統(tǒng)編程之----如何開(kāi)發(fā)無(wú)鎖數(shù)據(jù)結(jié)構(gòu)(獲獎(jiǎng)名單已公布-2013-7-12) [復(fù)制鏈接]

論壇徽章:
49
15-16賽季CBA聯(lián)賽之福建
日期:2016-06-22 16:22:002015年亞洲杯之中國(guó)
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36雙魚(yú)座
日期:2015-01-02 22:04:33午馬
日期:2014-11-25 09:58:35辰龍
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龍
日期:2014-08-21 10:47:58
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-06-21 09:21 |只看該作者 |倒序?yàn)g覽
獲獎(jiǎng)名單已公布,詳情請(qǐng)看:http://72891.cn/thread-4090480-1-1.html

如何開(kāi)發(fā)一個(gè)無(wú)鎖數(shù)據(jù)結(jié)構(gòu),例如無(wú)鎖隊(duì)列,無(wú)鎖緩存。

涉及到并行/并發(fā)計(jì)算時(shí),通常都會(huì)想到加鎖,加鎖可以保護(hù)共享的數(shù)據(jù),不過(guò)也會(huì)存在一些問(wèn)題。
1. 由于臨界區(qū)無(wú)法并發(fā)運(yùn)行,進(jìn)入臨界區(qū)就需要等待,加鎖使得效率的降低。多核CPU也不能發(fā)揮全部馬力
2. 在復(fù)雜的情況下,很容易造成死鎖,并發(fā)進(jìn)程、線程之間無(wú)止境的互相等待。
3. 在中斷/信號(hào)處理函數(shù)中不能加鎖,給并發(fā)處理帶來(lái)困難。
總之,在基于鎖的多線程/多進(jìn)程編程,你需要保證對(duì)競(jìng)爭(zhēng)條件很敏感的共享數(shù)據(jù)上的任何操作,都通過(guò)加鎖或解鎖一個(gè)獨(dú)占(mutex)來(lái)實(shí)現(xiàn)原子操作。

那么,在實(shí)際應(yīng)用中,有沒(méi)有優(yōu)雅的無(wú)鎖的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)呢,請(qǐng)大家各抒己見(jiàn)。

活動(dòng)時(shí)間:2013年6月21日-7月10日

邀請(qǐng)嘉賓:
crazyhadoop,ChinaUnix論壇Linux環(huán)境編程版版主

本期獎(jiǎng)品:
最佳經(jīng)驗(yàn)分享獎(jiǎng)5名,獎(jiǎng)勵(lì)《Linux高性能服務(wù)器編程》圖書(shū)一本;
所有參與討論的會(huì)員,即可獲得社區(qū)積分20分

圖書(shū)簡(jiǎn)介:

作者: 游雙   
出版社:機(jī)械工業(yè)出版社
ISBN:9787111425199
上架時(shí)間:2013-5-30
出版日期:2013 年6月
開(kāi)本:16開(kāi)
頁(yè)碼:345
版次:1-1

樣章閱讀:

http://wenku.it168.com/d_001050115.shtml

論壇徽章:
4
酉雞
日期:2014-03-21 23:19:50獅子座
日期:2014-08-01 22:11:40酉雞
日期:2015-01-10 21:31:442015年辭舊歲徽章
日期:2015-03-03 16:54:15
21 [報(bào)告]
發(fā)表于 2013-06-23 13:18 |只看該作者

最近在看這塊,說(shuō)說(shuō)我的理解,請(qǐng)大家指點(diǎn)。。。

1.先說(shuō)說(shuō)幾個(gè)概念
鎖只是同步方法的一種,同步分阻塞同步和非阻塞同步。
lockfree就可以保證非阻塞同步,同時(shí)也盡量保證了waitfree,但依然做不到完全的waitfree。

2.既然討論無(wú)鎖,就得說(shuō)說(shuō)有鎖會(huì)導(dǎo)致的問(wèn)題
a)死鎖
多個(gè)鎖不按順序的話
b)優(yōu)先級(jí)反轉(zhuǎn)
可能高優(yōu)先級(jí)的等待低優(yōu)先級(jí)的
c)影響實(shí)時(shí)性
等鎖時(shí)間不定
d)信號(hào)安全
信號(hào)處理中不能用鎖
e)崩潰處理
崩潰時(shí)可能占著鎖
f)搶占的影響
被搶占時(shí)可能還占著鎖
g)影響整體性能
切換進(jìn)程影響性能

最后,鎖的實(shí)現(xiàn)是跟硬件相關(guān)的,自然影響移植性。

3.無(wú)鎖首先得根據(jù)業(yè)務(wù)邏輯,這個(gè)是首要的。
脫離業(yè)務(wù)去有鎖或無(wú)鎖是沒(méi)有意義的。
根據(jù)業(yè)務(wù)流程去簡(jiǎn)化,一般可以將鎖的存在壓縮到最小。另外鎖只是同步機(jī)制的一種,應(yīng)該還有其它選擇。

4.如果已經(jīng)將有鎖的存在壓縮到最小的數(shù)據(jù)結(jié)構(gòu)了,就可以考慮無(wú)鎖算法了。
通用的lock free算法都是針對(duì)基本的數(shù)據(jù)結(jié)構(gòu)的:buffer,list,queue,map
基本原理就是CAS機(jī)制了,F(xiàn)在幾乎所有的CPU指令都支持CAS的原子操作,X86下對(duì)應(yīng)的是CMPXCHG匯編指令。(可見(jiàn),lockfree是依賴(lài)于機(jī)器體系結(jié)構(gòu)的,而且lockfree其實(shí)還是有鎖的,只是CAS給壓縮含義了)

一般CAS會(huì)封裝成下面的形式:(以32bit機(jī)為例)
bool cas32( int * pVal, int oldVal, int newVal );
pVal 表示要比較和替換數(shù)值的地址,oldVal表示期望的值,newVal表示希望替換成的值。

gcc中:
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
  1. bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
  2. type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
  3. These builtins perform an atomic compare and swap. That is, if the current value of *ptr is oldval, then write newval into *ptr.
  4. The “bool” version returns true if the comparison is successful and newval was written. The “val” version returns the contents of *ptr before the operation. 
復(fù)制代碼
另外,gcc的對(duì)于內(nèi)核中內(nèi)存屏障也有封裝:(內(nèi)核的kfifo實(shí)現(xiàn)可以看到,內(nèi)核在kfifo時(shí)有比CAS機(jī)制更加地lock free,用mb即可。當(dāng)然mb實(shí)現(xiàn)也跟機(jī)器架構(gòu)有關(guān))
  1. __sync_synchronize (...)
  2. This builtin issues a full memory barrier.
復(fù)制代碼
  1.     #define LOCK_PREFIX    "lock;"  
  2.     #define __sync_bool_compare_and_swap(mem, oldval, newval) \  
  3.       ({ __typeof (*mem) ret;                             \  
  4.              __asm __volatile (LOCK_PREFIX "cmpxchgl %2, %1;sete %%al; movzbl %%al,%%eax"                \  
  5.                                 : "=a" (ret), "=m" (*mem)                  \  
  6.                                 : "r" (newval), "m" (*mem), "a" (oldval)\  
  7.                                 :"memory");         \  
  8.                                   ret; })  
復(fù)制代碼
returns true if the comparison is successful and newval was written.


5.下面以說(shuō)說(shuō)無(wú)鎖隊(duì)列的實(shí)現(xiàn),說(shuō)下我的理解
  1. EnQueue(x)   
  2. {
  3.     q = newrecord();
  4.     q->value = x;
  5.     q->next = NULL;

  6.     do{
  7.         p = tail;   
  8.     }while( CAS(p->next, NULL, q) != TRUE);  

  9.     CAS(tail, p, q);
  10. }
  11. DeQueue()        
  12. {
  13.     do{
  14.         p = head;
  15.         if(p->next == NULL){
  16.             returnERR_EMPTY_QUEUE;
  17.         }
  18.     while( CAS(head, p, p->next) != TRUE );
  19.     returnp->next->value;
  20. }
復(fù)制代碼
由于是多線程編程,自然要考慮多些。
考慮加入隊(duì)列的處理:如果thread 1 EnQueue(x)在成功完成第一個(gè)CAS,還沒(méi)開(kāi)始第二個(gè)CAS時(shí)掛掉了。那么other threads就會(huì)全死循環(huán)了:都在等著next字段為NUL的tail,但其實(shí)這個(gè)tail的next恒指向T1 在第一個(gè)CAS中新增的節(jié)點(diǎn)了。

解決此問(wèn)題的修改后的:
  1. EnQueue(x)      
  2. {
  3.     q = newrecord();
  4.     q->value = x;
  5.     q->next = NULL;

  6.     p = tail;
  7.     oldp = p
  8.     do{
  9.         while(p->next != NULL)
  10.             p = p->next;
  11.     }while( CAS(p.next, NULL, q) != TRUE);  

  12.     CAS(tail, oldp, q);
  13. }
復(fù)制代碼
這樣既保證了即使T1 掛掉,但是T1新增的節(jié)點(diǎn)內(nèi)存還能繼續(xù)使用。



回復(fù) 1# send_linux

評(píng)分

參與人數(shù) 1可用積分 +2 收起 理由
crazyhadoop + 2 贊一個(gè)!

查看全部評(píng)分

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報(bào)告]
發(fā)表于 2013-06-21 10:37 |只看該作者
本帖最后由 hellioncu 于 2013-06-21 10:40 編輯

所謂的“無(wú)鎖數(shù)據(jù)結(jié)構(gòu)"其實(shí)不是真的沒(méi)有鎖,只是沒(méi)有使用普通的那種鎖,一般用原子操作(原子增、減、比較和交換CAS等)修改關(guān)鍵計(jì)數(shù)器、指針等,利用內(nèi)存屏障避免亂序執(zhí)行問(wèn)題,在讀寫(xiě)互斥時(shí)一般采用忙等待。

無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的適用性比普通的有鎖結(jié)構(gòu)小,一般用于在讀寫(xiě)沖突概率較小,而對(duì)性能又要求很高的場(chǎng)合。

至于死鎖,解決的問(wèn)題很簡(jiǎn)單,就是對(duì)資源的訪問(wèn)(加解鎖)次序保持一致即可,跟是否使用“無(wú)鎖數(shù)據(jù)結(jié)構(gòu)“沒(méi)有直接的關(guān)系。

論壇徽章:
1
天蝎座
日期:2013-12-06 18:23:58
3 [報(bào)告]
發(fā)表于 2013-06-21 11:45 |只看該作者
回復(fù) 2# hellioncu


    是的,無(wú)鎖數(shù)據(jù)結(jié)構(gòu)巧妙的規(guī)避了競(jìng)爭(zhēng)條件。當(dāng)然也是有代價(jià)的

論壇徽章:
1
獅子座
日期:2013-09-06 17:18:40
4 [報(bào)告]
發(fā)表于 2013-06-21 12:39 |只看該作者
這個(gè)要具體情況具體分析了吧 ,因?yàn)橐恍┧惴ㄐ枰木褪且粋(gè)流程下來(lái)的,不可能用什么方法把數(shù)據(jù)拆分處理這樣就比較難辦了。     另外涉及到多核的話是共享內(nèi)存還是獨(dú)立內(nèi)存的體系結(jié)構(gòu)也是有影響的。

    所以愚見(jiàn)   無(wú)鎖數(shù)據(jù)結(jié)構(gòu),可以運(yùn)算前把數(shù)據(jù)都拆分了 然后再運(yùn)算....

論壇徽章:
18
卯兔
日期:2013-09-27 17:41:0615-16賽季CBA聯(lián)賽之佛山
日期:2016-07-09 17:34:45操作系統(tǒng)版塊每周發(fā)帖之星
日期:2015-12-02 15:01:04IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-12-02 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-03 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-01 06:20:00羊年新春福章
日期:2015-04-01 17:56:06拜羊年徽章
日期:2015-04-01 17:56:062015年迎新春徽章
日期:2015-03-04 09:49:452015年辭舊歲徽章
日期:2015-03-03 16:54:15天秤座
日期:2015-01-14 06:39:28
5 [報(bào)告]
發(fā)表于 2013-06-21 14:05 |只看該作者
本帖最后由 qingduo04 于 2013-06-21 14:08 編輯

     魚(yú)和熊掌不能兼得。

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
6 [報(bào)告]
發(fā)表于 2013-06-21 15:46 |只看該作者
回復(fù) 1# send_linux
這個(gè)話題很有意義。頂一把


   

論壇徽章:
49
15-16賽季CBA聯(lián)賽之福建
日期:2016-06-22 16:22:002015年亞洲杯之中國(guó)
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36雙魚(yú)座
日期:2015-01-02 22:04:33午馬
日期:2014-11-25 09:58:35辰龍
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龍
日期:2014-08-21 10:47:58
7 [報(bào)告]
發(fā)表于 2013-06-21 16:04 |只看該作者
Godbach 發(fā)表于 2013-06-21 15:46
回復(fù) 1# send_linux
這個(gè)話題很有意義。頂一把


分享分享嘛,呵呵

論壇徽章:
93
2015年辭舊歲徽章
日期:2019-10-10 10:51:15CU大;照
日期:2014-02-21 14:21:56CU十二周年紀(jì)念徽章
日期:2020-10-15 16:55:55CU大;照
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大;照
日期:2019-10-10 10:55:38季節(jié)之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季節(jié)之章:冬
日期:2019-10-10 10:57:17CU大;照
日期:2014-02-21 14:22:52CU大;照
日期:2014-03-13 10:40:30CU大;照
日期:2014-02-21 14:23:15
8 [報(bào)告]
發(fā)表于 2013-06-21 17:01 |只看該作者
高級(jí),聆聽(tīng)高手教誨。

論壇徽章:
1
射手座
日期:2014-08-04 16:49:43
9 [報(bào)告]
發(fā)表于 2013-06-21 17:18 |只看該作者
這是一本好書(shū),可惜只有TMD三章,  雖然有新東西 但是大部分都是TCP/IP卷的東東,  看來(lái)要看到高性能的部分 只能買(mǎi)書(shū)了

論壇徽章:
49
15-16賽季CBA聯(lián)賽之福建
日期:2016-06-22 16:22:002015年亞洲杯之中國(guó)
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36雙魚(yú)座
日期:2015-01-02 22:04:33午馬
日期:2014-11-25 09:58:35辰龍
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龍
日期:2014-08-21 10:47:58
10 [報(bào)告]
發(fā)表于 2013-06-21 18:17 |只看該作者
hanzhenlll 發(fā)表于 2013-06-21 17:18
這是一本好書(shū),可惜只有TMD三章,  雖然有新東西 但是大部分都是TCP/IP卷的東東,  看來(lái)要看到高性能的部分 ...


多多交流哈,可以有機(jī)會(huì)獲贈(zèng)的哦
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP