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

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

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

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

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

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

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

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

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

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

在編寫內核時,操作也簡單:

    atomic_t use_cnt;

    atomic_set(&use_cnt, 2);

    atomic_add(4, &use_cnt);

    atomic_inc(use_cnt);

2.2. 原子性與順序性

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

2.3. 原子位操作

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

編寫內核代碼,只要把指向了你希望的數據的指針給操作函數,就可以進行位操作了:

    unsigned long word = 0;

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

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

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

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

為什么關注原子操作?
    1)在確認一個操作是原子的情況下,多線程環境里面,我們可以避免僅僅為保護這個操作在外圍加上性能開銷昂貴的鎖。
    2)借助于原子操作,我們可以實現互斥鎖。
    3)借助于互斥鎖,我們可以把一些列操作變為原子操作。

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

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

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

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

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

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


posted on 2010-04-03 21:05 chatler 閱讀(1316) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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>
            久久精品道一区二区三区| 国产精品久久久久一区二区| 国内精品久久国产| 欧美.www| 欧美精彩视频一区二区三区| 亚洲午夜精品17c| 一区二区三区四区国产精品| 国产精品亚洲第一区在线暖暖韩国| 午夜欧美电影在线观看| 欧美一区观看| 亚洲免费观看高清完整版在线观看熊 | 日韩亚洲一区在线播放| 一本一本a久久| 国产午夜精品麻豆| 亚洲黄色天堂| 国产精品亚洲一区| 欧美暴力喷水在线| 欧美日韩伊人| 欧美成人免费全部| 欧美视频网站| 欧美不卡高清| 亚洲伦理中文字幕| 麻豆国产精品va在线观看不卡| 美女黄毛**国产精品啪啪| 亚洲一区二区三区四区五区黄| 欧美一区二区三区免费视| 亚洲精品在线二区| 欧美在线一区二区| 亚洲一区二区视频在线观看| 久久这里有精品15一区二区三区| 亚洲电影一级黄| 欧美激情一区二区三级高清视频| 国产精品久久久久免费a∨| 猛男gaygay欧美视频| 欧美亚州韩日在线看免费版国语版| 久久人人97超碰精品888| 欧美日韩综合| 91久久久久久久久久久久久| 国内精品视频在线观看| 亚洲永久免费| 在线亚洲欧美专区二区| 蜜臀av国产精品久久久久| 欧美在线观看日本一区| 免费成人激情视频| 久久综合伊人77777麻豆| 国产精品国产三级国产a| 亚洲精华国产欧美| 91久久综合| 蜜臀久久99精品久久久久久9| 久久精品官网| 国产欧美日韩在线播放| 亚洲视频福利| 亚洲与欧洲av电影| 欧美视频一区二区三区| 日韩一区二区福利| 99re8这里有精品热视频免费| 麻豆精品在线播放| 欧美激情成人在线| 亚洲国产精品999| 久久综合九色九九| 欧美电影在线免费观看网站| 在线不卡a资源高清| 久久精品最新地址| 免费不卡在线视频| 亚洲黄色一区| 欧美激情一区二区三区| 最新亚洲电影| 亚洲午夜激情免费视频| 国产精品成人一区二区三区吃奶 | 亚洲欧美不卡| 国产伦精品一区二区| 亚洲欧美日韩专区| 久久免费视频在线观看| 伊人成人开心激情综合网| 久久亚洲一区二区三区四区| 亚洲国产精品精华液网站| 日韩亚洲在线观看| 国产精品毛片| 久久精品视频在线免费观看| 欧美国产日本在线| 国产精品99久久久久久有的能看| 国产精品久久77777| 欧美一区二区三区另类| 欧美电影资源| 91久久夜色精品国产九色| 一区二区福利| 国产欧美日韩亚洲精品| 久久中文在线| 亚洲午夜精品久久| 久久久噜久噜久久综合| 91久久精品国产91性色| 国产精品国产一区二区 | 亚洲欧洲精品一区| 羞羞答答国产精品www一本| 伊人蜜桃色噜噜激情综合| 欧美精品偷拍| 久久精品国产久精国产爱| 亚洲精品黄网在线观看| 欧美在线视频一区二区三区| 91久久精品一区二区三区| 国产精品嫩草久久久久| 久久亚洲图片| 亚洲欧美激情一区二区| 亚洲国产二区| 久久久蜜桃一区二区人| 亚洲午夜一区二区三区| 亚洲福利电影| 国产日本欧美一区二区三区| 欧美乱大交xxxxx| 久久久久久亚洲精品杨幂换脸 | 免费在线观看日韩欧美| 午夜精品福利视频| 99精品视频一区| 曰韩精品一区二区| 国产手机视频一区二区| 欧美视频日韩视频| 欧美精品成人一区二区在线观看| 欧美伊久线香蕉线新在线| 亚洲最快最全在线视频| 欧美黄色日本| 久热re这里精品视频在线6| 欧美激情按摩在线| 亚洲欧美日韩成人| 亚洲区一区二区三区| 国产一区二区三区日韩| 国产精品网站在线观看| 欧美日韩在线视频观看| 欧美高清免费| 免费一区视频| 欧美成人dvd在线视频| 久久久久一区二区| 久久久久久久综合狠狠综合| 欧美一区二区三区四区在线观看地址| 99视频精品全国免费| 亚洲精品一二区| 亚洲精品日韩综合观看成人91| 欧美www视频| 亚洲大胆av| 亚洲国产天堂久久综合| 亚洲春色另类小说| 亚洲人成高清| 正在播放欧美一区| 99这里只有精品| 亚洲午夜国产成人av电影男同| 一区二区三区精品| 亚洲一区二区在| 亚洲欧美日韩电影| 久久激情视频| 先锋a资源在线看亚洲| 亚洲欧美国产77777| 羞羞色国产精品| 久久久噜久噜久久综合| 美国成人直播| 欧美日韩成人在线视频| 欧美午夜精品一区二区三区| 国产精品视频网站| 激情综合网址| 亚洲精品自在在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲日本免费| 亚洲一区二区成人在线观看| 欧美亚洲一级片| 免费成年人欧美视频| 欧美日韩综合另类| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲激情午夜| 亚洲欧美国产日韩中文字幕| 久久精品日产第一区二区三区| 欧美凹凸一区二区三区视频| 亚洲精品一区二区三区av| 亚洲欧美不卡| 欧美freesex8一10精品| 国产精品久久久久久av下载红粉| 国产亚洲在线| 99在线|亚洲一区二区| 欧美综合国产| 亚洲人成在线观看一区二区| 午夜在线精品偷拍| 欧美屁股在线| 激情久久综艺| 亚洲一线二线三线久久久| 米奇777超碰欧美日韩亚洲| 99视频超级精品| 狼狼综合久久久久综合网| 国产精品国产三级国产aⅴ入口| 韩国成人福利片在线播放| 亚洲无吗在线| 欧美激情一区二区三区不卡| 亚洲欧美日本国产有色| 欧美喷水视频| 91久久精品美女| 久久永久免费| 亚洲一区二区在线看| 欧美国产在线观看| 1769国产精品| 久久久www成人免费毛片麻豆| 一区二区三区精品国产| 欧美精品网站| 亚洲裸体视频| 欧美高清视频一二三区|