青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
關(guān)于單CPU,多CPU上的原子操作  轉(zhuǎn)自http://software.intel.com/zh-cn/blogs/2010/01/14/cpucpu/?cid=sw:prccsdn956

    所謂原子操作,就是"不可中斷的一個或一系列操作" 。

硬件級的原子操作:
    在單處理器系統(tǒng)(UniProcessor)中,能夠在單條指令中完成的操作都可以認(rèn)為是" 原子操作",因為中斷只能發(fā)生于指令之間。這也是某些CPU指令系統(tǒng)中引入了test_and_set、test_and_clear等指令用于臨界資源互斥的原因。

    在對稱多處理器(Symmetric Multi-Processor)結(jié)構(gòu)中就不同了,由于系統(tǒng)中有多個處理器在獨立地運行,即使能在單條指令中完成的操作也有可能受到干擾。

    在x86 平臺上,CPU提供了在指令執(zhí)行期間對總線加鎖的手段。CPU芯片上有一條引線#HLOCK pin,如果匯編語言的程序中在一條指令前面加上前綴"LOCK",經(jīng)過匯編以后的機器代碼就使CPU在執(zhí)行這條指令的時候把#HLOCK pin的電位拉低,持續(xù)到這條指令結(jié)束時放開,從而把總線鎖住,這樣同一總線上別的CPU就暫時不能通過總線訪問內(nèi)存了,保證了這條指令在多處理器環(huán)境中 的原子性。
軟件級的原子操作:
    軟件級的原子操作實現(xiàn)依賴于硬件原子操作的支持。
    對于linux而言,內(nèi)核提供了兩組原子操作接口:一組是針對整數(shù)進行操作;另一組是針對單獨的位進行操作。
2.1. 原子整數(shù)操作
    針對整數(shù)的原子操作只能對atomic_t類型的數(shù)據(jù)處理。這里沒有使用C語言的int類型,主要是因為:

    1) 讓原子函數(shù)只接受atomic_t類型操作數(shù),可以確保原子操作只與這種特殊類型數(shù)據(jù)一起使用

    2) 使用atomic_t類型確保編譯器不對相應(yīng)的值進行訪問優(yōu)化

    3) 使用atomic_t類型可以屏蔽不同體系結(jié)構(gòu)上的數(shù)據(jù)類型的差異。盡管Linux支持的所有機器上的整型數(shù)據(jù)都是32位,但是使用atomic_t的代 碼只能將該類型的數(shù)據(jù)當(dāng)作24位來使用。這個限制完全是因為在SPARC體系結(jié)構(gòu)上,原子操作的實現(xiàn)不同于其它體系結(jié)構(gòu):32位int類型的低8位嵌入了 一個鎖,因為SPARC體系結(jié)構(gòu)對原子操作缺乏指令級的支持,所以只能利用該鎖來避免對原子類型數(shù)據(jù)的并發(fā)訪問。

    原子整數(shù)操作最常見的用途就是實現(xiàn)計數(shù)器。原子整數(shù)操作列表在中定義。原子操作通常是內(nèi)斂函數(shù),往往通過內(nèi)嵌匯編指令來實現(xiàn)。如果某個函數(shù)本來就是原子的,那么它往往會被定義成一個宏。

在編寫內(nèi)核時,操作也簡單:

    atomic_t use_cnt;

    atomic_set(&use_cnt, 2);

    atomic_add(4, &use_cnt);

    atomic_inc(use_cnt);

2.2. 原子性與順序性

    原子性確保指令執(zhí)行期間不被打斷,要么全部執(zhí)行,要么根本不執(zhí)行。而順序性確保即使兩條或多條指令出現(xiàn)在獨立的執(zhí)行線程中,甚至獨立的處理器上,它們本該執(zhí)行的順序依然要保持。

2.3. 原子位操作

    原子位操作定義在文件中。令人感到奇怪的是位操作函數(shù)是對普通的內(nèi)存地址進行操作的。原子位操作在多數(shù)情況下是對一個字長的內(nèi)存訪問,因而位號該位于0-31之間(在64位機器上是0-63之間),但是對位號的范圍沒有限制。

編寫內(nèi)核代碼,只要把指向了你希望的數(shù)據(jù)的指針給操作函數(shù),就可以進行位操作了:

    unsigned long word = 0;

    set_bit(0, &word); /*第0位被設(shè)置*/

    set_bit(1, &word); /*第1位被設(shè)置*/

    clear_bit(1, &word); /*第1位被清空*/

    change_bit(0, &word); /*翻轉(zhuǎn)第0位*/

為什么關(guān)注原子操作?
    1)在確認(rèn)一個操作是原子的情況下,多線程環(huán)境里面,我們可以避免僅僅為保護這個操作在外圍加上性能開銷昂貴的鎖。
    2)借助于原子操作,我們可以實現(xiàn)互斥鎖。
    3)借助于互斥鎖,我們可以把一些列操作變?yōu)樵硬僮鳌?/p>

GNU C中x++是原子操作嗎?
    答案不是。x++由3條指令完成。x++在單CPU下不是原子操作。
    對應(yīng)3條匯編指令
    movl x, %eax
    addl $1, %eax
    movl %eax, x
    在vc2005下對應(yīng)
    ++x;
    004232FA mov eax,dword ptr [x]
    004232FD add eax,1
    00423300 mov dword ptr [x],eax
    仍然是3條指令。
    所以++x,x++等都不是原子操作。因其步驟包括了從內(nèi)存中取x值放入寄存器,加寄存器,把值寫入內(nèi)存三個指令。

如何實現(xiàn)x++的原子性?
    在單處理器上,如果執(zhí)行x++時,禁止多線程調(diào)度,就可以實現(xiàn)原子。因為單處理的多線程并發(fā)是偽并發(fā)。
    在多處理器上,需要借助cpu提供的Lock功能。鎖總線。讀取內(nèi)存值,修改,寫回內(nèi)存三步期間禁止別的CPU訪問總線。同時我估計使用Lock指令鎖總線的時候,OS也不會把當(dāng)前線程調(diào)度走了。要是調(diào)走了,那就麻煩了。

    在多處理器系統(tǒng)中存在潛在問題的原因是:
    不使用LOCK指令前綴鎖定總線的話,在一次內(nèi)存訪問周期中有可能其他處理器會產(chǎn)生異常或中斷,而在異常處理中有可能會修改尚未寫入的地址,這樣當(dāng)INC操作完成后會產(chǎn)生無效數(shù)據(jù)(覆蓋了前面的修改)。

    spinlock 用于CPU同步, 它的實現(xiàn)是基于CPU鎖定數(shù)據(jù)總線的指令.
    當(dāng)某個CPU鎖住數(shù)據(jù)總線后, 它讀一個內(nèi)存單元(spinlock_t)來判斷這個spinlock 是否已經(jīng)被別的CPU鎖住. 如果否, 它寫進一個特定值, 表示鎖定成功, 然后返回. 如果是, 它會重復(fù)以上操作直到成功, 或者spin次數(shù)超過一個設(shè)定值. 鎖定數(shù)據(jù)總線的指令只能保證一個機器指令內(nèi), CPU獨占數(shù)據(jù)總線.
    單CPU當(dāng)然能用spinlock, 但實現(xiàn)上無需鎖定數(shù)據(jù)總線.

    spinlock在鎖定的時候,如果不成功,不會睡眠,會持續(xù)的嘗試,單cpu的時候spinlock會讓其它process動不了.

from:
http://blog.csdn.net/microtong/archive/2010/01/20/5211750.aspx


posted on 2010-04-03 21:05 chatler 閱讀(1324) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品久久综合| 亚洲美女淫视频| 午夜日韩在线观看| 亚洲人成网站在线播| 国产在线观看精品一区二区三区| 欧美精品乱人伦久久久久久 | 久久这里只精品最新地址| 宅男精品视频| 亚洲茄子视频| 亚洲电影网站| 激情综合电影网| 国产一区清纯| 国产美女精品| 国产精品五区| 国产精品国产一区二区| 欧美日韩国产一区二区三区| 免费亚洲网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久不射中文字幕| 午夜精品福利一区二区蜜股av| 一本色道久久| 一本一本久久a久久精品牛牛影视| 亚洲国产欧美在线 | 亚洲欧美日韩在线一区| 一区二区国产日产| aa级大片欧美| 亚洲五月六月| 亚洲专区一二三| 亚洲欧美另类在线观看| 亚洲一区精品电影| 亚洲欧美日韩精品| 午夜精品久久久久| 欧美一级二级三级蜜桃| 欧美一区二区免费视频| 欧美在线观看一二区| 欧美在线视屏| 久久影院午夜片一区| 美女视频网站黄色亚洲| 免费观看成人| 欧美日韩成人综合在线一区二区| 欧美久久电影| 国产精品久久久久久福利一牛影视| 欧美午夜宅男影院在线观看| 欧美午夜在线观看| 国产日韩欧美| 精品成人国产| 亚洲精品久久久久久一区二区| 日韩一级黄色片| 亚洲在线视频| 久久久午夜精品| 亚洲福利精品| 亚洲色在线视频| 欧美在线关看| 欧美国产先锋| 国产精品久久久久av免费| 国产丝袜一区二区| 亚洲国内精品| 亚洲永久精品大片| 久久久亚洲精品一区二区三区 | 一区二区三区在线免费视频| 亚洲福利专区| 亚洲一区二区免费视频| 久久精品免视看| 欧美国产一区二区| 中日韩美女免费视频网站在线观看| 香蕉久久夜色精品| 狼狼综合久久久久综合网| 欧美日韩一区二区三区在线看| 国产乱人伦精品一区二区 | 性感少妇一区| 欧美国产精品| 亚洲伊人色欲综合网| 久久免费精品视频| 欧美日韩性视频在线| 国产一区999| 一本大道久久精品懂色aⅴ | 欧美成在线视频| 国产精品日韩欧美一区| 亚洲国产欧洲综合997久久| 亚洲一级黄色| 欧美激情小视频| 午夜精品免费| 欧美日本国产精品| 精品二区久久| 性欧美1819sex性高清| 亚洲国产成人久久综合| 欧美一区二区三区久久精品| 欧美日韩国产一级片| 精东粉嫩av免费一区二区三区| 亚洲视频中文字幕| 欧美ed2k| 欧美一区二区三区免费视频| 欧美日韩高清在线| 亚洲国产黄色片| 欧美亚洲专区| 99re8这里有精品热视频免费 | 国产精品综合| 一本久道综合久久精品| 欧美成人自拍视频| 欧美影院久久久| 国产精品久久久久久久午夜片| 亚洲精品久久久久中文字幕欢迎你| 久久精品国产综合精品| 亚洲一二三区在线观看| 欧美美女日韩| 亚洲精品一区久久久久久 | 午夜精品一区二区三区在线| 欧美日韩一区二区在线| 亚洲精品小视频| 欧美va亚洲va香蕉在线| 久久精品国产亚洲一区二区| 国产欧美日韩亚洲| 亚洲自拍电影| 99亚洲一区二区| 欧美日韩一区二区在线| 99精品热视频| 亚洲日本欧美| 欧美乱人伦中文字幕在线| 亚洲精品一区二区在线| 欧美福利电影在线观看| 噜噜噜在线观看免费视频日韩| 好吊妞**欧美| 乱人伦精品视频在线观看| 久久福利一区| 黄色一区二区在线观看| 久久视频一区二区| 久久九九免费视频| 亚洲大片在线| 亚洲第一中文字幕| 欧美高清在线一区| 夜色激情一区二区| 一本久久青青| 国产伦精品一区二区三区在线观看 | 狂野欧美一区| 久久免费少妇高潮久久精品99| 一区一区视频| 欧美高清视频一区| 欧美国产专区| 一区二区三区视频在线| 一区二区三区福利| 国产精品日韩欧美大师| 久久精品欧美日韩| 久久在线免费观看视频| 亚洲精品久久视频| 99精品99久久久久久宅男| 国产精品看片资源| 久久久久久穴| 蜜臀久久99精品久久久久久9| 亚洲精品在线二区| 亚洲视频一区二区免费在线观看| 国产精品一区二区黑丝| 久久综合色婷婷| 欧美国产三级| 香蕉国产精品偷在线观看不卡| 性色一区二区| 亚洲精华国产欧美| 一区二区三区欧美在线| 国产一区在线播放| 亚洲国产精品一区在线观看不卡 | 1000部国产精品成人观看| 亚洲高清在线| 国产精品乱看| 欧美**人妖| 欧美特黄一区| 久久午夜精品一区二区| 欧美精品大片| 久久国产精品免费一区| 嫩草影视亚洲| 欧美一区二区三区免费观看视频| 久久久久国产精品一区三寸| 99视频+国产日韩欧美| 午夜精品一区二区在线观看 | 久久另类ts人妖一区二区| 欧美成人免费一级人片100| 亚洲一区视频在线| 久久婷婷综合激情| 亚洲女同同性videoxma| 久久夜色精品| 亚洲欧美日韩爽爽影院| 裸体女人亚洲精品一区| 午夜欧美不卡精品aaaaa| 蜜桃精品久久久久久久免费影院| 亚洲一区激情| 美女久久网站| 久久精品国产欧美激情| 欧美激情一区在线观看| 久久久久久久999| 欧美四级剧情无删版影片| 欧美成人r级一区二区三区| 国产精品你懂得| 亚洲人成亚洲人成在线观看图片| 国产一区二区精品久久| 夜夜精品视频| 亚洲毛片在线| 美日韩精品视频| 榴莲视频成人在线观看| 国产欧美日韩亚洲精品| 一区二区高清视频| 99亚洲视频| 欧美成人午夜剧场免费观看|