日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于单CPU,多CPU上的原子操作

發(fā)布時間:2025/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于单CPU,多CPU上的原子操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

硬件級的原子操作:
在單處理器系統(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)樵硬僮鳌?/span>

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)生異?;蛑袛?#xff0c;而在異常處理中有可能會修改尚未寫入的地址,這樣當(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動不了.

轉(zhuǎn)載于:https://www.cnblogs.com/cuker919/archive/2010/01/21/4878641.html

總結(jié)

以上是生活随笔為你收集整理的关于单CPU,多CPU上的原子操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色人阁av | 91秘密入口| av网站黄色 | 久久精品国产免费 | 浪浪视频在线观看 | 国产高清视频免费 | 欧美日韩精品久久久免费观看 | 久久福利一区 | 中文字幕一区在线 | www.九色| 国产精品激情偷乱一区二区∴ | 亚洲欧美一区二区三区不卡 | 国产精品一线二线三线 | 国产福利视频一区二区 | 人体写真 福利视频 | 可以在线观看的黄色 | av片在线免费观看 | 尤物精品在线观看 | 成人av毛片 | 日韩一区二区三区中文字幕 | 黄色成年视频 | 国模私拍大尺度裸体av | 巨胸大乳www视频免费观看 | 污污视频在线观看免费 | 亚洲AV无码精品自拍 | 中文字幕 自拍偷拍 | 自拍视频在线播放 | 免费成人一级片 | 日韩精品三级 | 十八禁一区二区三区 | 亚洲国产婷婷 | 欧美一区不卡 | 国产精品伦子伦免费视频 | 在线观看黄色网页 | 亚洲熟女少妇一区二区 | 又黄又爽又刺激的视频 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 久久久噜噜噜 | 18禁免费无码无遮挡不卡网站 | 亚洲一区av| 强行挺进白丝老师里呻吟 | 亚洲免费一二三区 | 伊人久久大香线蕉综合网站 | 欧美在线视频免费 | 高跟91娇喘 | 大香伊人中文字幕精品 | 欧美激情一区在线 | 日本黄色免费观看 | 国产-第1页-浮力影院 | 久久综合久 | 51 吃瓜网 | a级片网址 | 久久久久亚洲日日精品 | 在线观看av国产一区二区 | 日韩成人免费在线观看 | 欧美99热| 欧美激情videos | 最近中文字幕av | aaa一级黄色片 | 中文字幕网站在线观看 | 免费天堂av| 亚洲天堂va | 香蕉在线看 | 爽插| 少妇三级| 色婷婷香蕉在线一区二区 | 免费在线性爱视频 | av三级在线观看 | 日韩精品影院 | 成人免费看片视频 | 麻豆传媒在线观看视频 | 婷婷激情电影 | 亚洲国产综合网 | 韩国黄色一级片 | 欧美熟妇激情一区二区三区 | 尤物视频在线观看免费 | 日韩黄色网址 | 国产精品偷伦视频免费看 | 欧美成人精品一区二区免费看片 | 奇米四色在线观看 | 欧美精品一区二区三区久久 | 国模精品一区二区三区 | 涩里番在线观看 | 日韩av网址大全 | 国产精品视屏 | 麻豆精品视频在线观看 | 国产九九久久 | 亚洲熟妇无码另类久久久 | 久久嫩草精品久久久久 | 成人动漫一区 | a天堂中文网 | 天天上天天干 | 午夜精品无码一区二区三区 | 高清国产mv在线观看 | 在线精品免费视频 | 国产福利三区 | 欧美特级黄色录像 | 2019av视频 | 国产av无码专区亚洲av |