精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

對 int 變量賦值的操作是原子的嗎?為什么?

開發(fā) 后端
原子操作是不可分割的操作,在執(zhí)行完畢時它不會被任何事件中斷。在單處理器系統(tǒng)。

前言

這個是在面試的時候遇到的問題,當(dāng)時沒有答出來。回到家以后查了查,整理記錄下來。

原問題:什么指令集支持原子操作?其原理是什么? 如果考慮到全部的指令集,問題太大了,這里簡化下。以X86和ARM為例。

原子操作是不可分割的操作,在執(zhí)行完畢時它不會被任何事件中斷。在單處理器系統(tǒng)(UniProcessor,簡稱 UP)中,能夠在單條指令中完成的操作都可以認(rèn)為是原子操作,因?yàn)橹袛嘀荒馨l(fā)生在指令與指令之間。

比如,C語言代碼

如果未經(jīng)優(yōu)化,有可能生成如下匯編:

這樣在有多個進(jìn)程執(zhí)行這段代碼時,就有可能產(chǎn)生并發(fā)問題:

這就會出現(xiàn)問題。

在單處理器中,解決這個問題的方法是,將count++語句翻譯成單指令操作。

X86指令集支持inc操作,這樣count操作可以在一條指內(nèi)完成。

進(jìn)程的上下文切換總是在一條指令執(zhí)行之后完成,所以不會出現(xiàn)上述的并發(fā)問題。對于單處理器來說,一條處理器指令就是一個原子操作。

同樣,ARM里的SWP和X86里的XCHG都是對于單處理器來說,是原子操作。

但是,在多處理器系統(tǒng)(Symmetric Multi-Processor,簡稱 SMP)中情況有所不同,由于系統(tǒng)中有多個處理器在獨(dú)立的運(yùn)行,即使在能單條指令中完成的操作也可能受到干擾。因?yàn)檫@個時候并發(fā)的主題不再是進(jìn)程,而是處理器。

X86架構(gòu)

Intel X86指令集提供了指令前綴lock用于鎖定前端串行總線FSB,保證了指令執(zhí)行時不會收到其他處理器的干擾。

比如:

使用lock指令前綴之后,處理期間對count內(nèi)存的并發(fā)訪問(Read/Write)被禁止,從而保證了指令的原子性。

如圖所示:

X86LOCK

其原理在Intel開發(fā)手冊有如下說明:

  •  Description
  •  Causes the processor’s LOCK# signal to be asserted during execution of the accompanying instruction (turns the instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal ensures that the processor has exclusive use of any shared memory while the signal is asserted.
  •  The LOCK prefix can be prepended only to the following instructions and only to those forms of the instructions where the destination operand is a memory operand: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, CMPXCHG16B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG. If the LOCK prefix is used with one of these instructions and the source operand is a memory operand, an undefined opcode exception (#UD) may be generated. An undefined opcode exception will also be generated if the LOCK prefix is used with any instruction not in the above list. The XCHG instruction always asserts the LOCK# signal regardless of the presence or absence of the LOCK prefix.
  •  The LOCK prefix is typically used with the BTS instruction to perform a read-modify-write operation on a memory location in shared memory environment.
  •  The integrity of the LOCK prefix is not affected by the alignment of the memory field. Memory locking is observed for arbitrarily misaligned fields.

在執(zhí)行伴隨的指令期間使處理器的LOCK#信號有效(將指令變?yōu)樵又噶睿T诙嗵幚砥鳝h(huán)境中,LOCK#信號確保處理器在信號有效時獨(dú)占使用任何共享存儲器。

LOCK前綴只能附加在下面的指令之前,并且只適用于那些目標(biāo)操作數(shù)是內(nèi)存操作數(shù)的指令格式:ADD,ADC,AND,BTC,BTR,BTS,CMPXCHG,CMPXCH8B,CMPXCHG16B,DEC,INC, NEG,NOT,OR,SBB,SUB,XOR,XADD和XCHG。

如果LOCK前綴與這些指令之一一起使用,并且源操作數(shù)是內(nèi)存操作數(shù),則可能會生成未定義的操作碼異常(#UD)。如果LOCK前綴與任何不在上述列表中的指令一起使用,也會產(chǎn)生未定義的操作碼異常。無論是否存在LOCK前綴,XCHG指令都始終聲明LOCK#信號。

LOCK前綴通常與BTS指令一起使用,以在共享存儲器環(huán)境中的存儲器位置上執(zhí)行讀取 – 修改 – 寫入操作。

LOCK前綴的完整性不受存儲器字段對齊的影響。內(nèi)存鎖定是針對任意不對齊的字段。

操作系統(tǒng)中的實(shí)現(xiàn)

Linux源碼中對于原子自增一是如下定義的:

LOCK_PREFIX的定義如下所示:

可見:在對稱多處理器架構(gòu)的情況下,LOCK_PREFIX被解釋為指令前綴lock。而對于單處理器架構(gòu),LOCK_PREFIX不包含任何內(nèi)容。

另外,對于CAS,有cmpxchg指令進(jìn)行操作。代碼如下:

static __always_inline int atomic_cmpxchg(atomic_t *v, int old, int new)
{
return cmpxchg(&v->counter, old, new);
}
#define cmpxchg(ptr, old, new) \
__cmpxchg(ptr, old, new, sizeof(*(ptr)))
#define __cmpxchg(ptr, old, new, size) \
__raw_cmpxchg((ptr), (old), (new), (size), LOCK_PREFIX)
#define __raw_cmpxchg(ptr, old, new, size, lock) \
({ \
__typeof__(*(ptr)) __ret; \
__typeof__(*(ptr)) __old = (old); \
__typeof__(*(ptr)) __new = (new); \
switch (size) { \
case __X86_CASE_B: \
{ \
volatile u8 *__ptr = (volatile u8 *)(ptr); \
asm volatile(lock "cmpxchgb %2,%1" \
: "=a" (__ret), "+m" (*__ptr) \
: "q" (__new), "0" (__old) \
: "memory"); \
break; \
} \
case __X86_CASE_W: \
{ \
volatile u16 *__ptr = (volatile u16 *)(ptr); \
asm volatile(lock "cmpxchgw %2,%1" \
: "=a" (__ret), "+m" (*__ptr) \
: "r" (__new), "0" (__old) \
: "memory"); \
break; \
} \
case __X86_CASE_L: \
{ \
volatile u32 *__ptr = (volatile u32 *)(ptr); \
asm volatile(lock "cmpxchgl %2,%1" \
: "=a" (__ret), "+m" (*__ptr) \
: "r" (__new), "0" (__old) \
: "memory"); \
break; \
} \
case __X86_CASE_Q: \
{ \
volatile u64 *__ptr = (volatile u64 *)(ptr); \
asm volatile(lock "cmpxchgq %2,%1" \
: "=a" (__ret), "+m" (*__ptr) \
: "r" (__new), "0" (__old) \
: "memory"); \
break; \
} \
default: \
__cmpxchg_wrong_size(); \
} \
__ret; \
})

ARM架構(gòu)

在ARM架構(gòu)下,沒有LOCK#指令,其具體實(shí)現(xiàn)如下:## ARMv6之前 早期的ARM架構(gòu)是不支持SMP的,這些單核架構(gòu)的CPU實(shí)現(xiàn)原子操作的方式就是通過關(guān)閉CPU中斷來完成的。

在Linux對于ARM架構(gòu)的代碼下:

有如下:

這個是好多操作共用的一套代碼。

對于cmpxchg:

可以看到,對v->counter的操作是一個臨界區(qū),指令的執(zhí)行不能被打斷,內(nèi)存的訪問也需要保持沒有干擾。

ARMv6以前的版本通過關(guān)本地中斷來保護(hù)這塊臨界區(qū),看起來相當(dāng)簡單,其奧秘就在于ARMv6以前的版本不支持SMP。

比如經(jīng)典的read-modify-write問題,其本質(zhì)是保持一個對內(nèi)存read和write訪問的原子性問題,也就是說內(nèi)存的讀和寫的訪問不能被打斷。對該問題的解決可以通過硬件、軟件或者軟硬件結(jié)合的方法來進(jìn)行。

早期的ARM CPU給出的方案就是依賴硬件:SWP這個匯編指令執(zhí)行了一次讀內(nèi)存操作、一次寫內(nèi)存操作,但是從程序員的角度看,SWP這條指令就是原子的,讀寫之間不會被任何的異步事件打斷。具體底層的硬件是如何做的呢?這時候,硬件會提供一個lock signal,在進(jìn)行memory操作的時候設(shè)定lock信號,告訴總線這是一個不可被中斷的內(nèi)存訪問,直到完成了SWP需要進(jìn)行的兩次內(nèi)存訪問之后再clear lock信號。

多說一點(diǎn)關(guān)于SWP和SWPB的內(nèi)容

這兩個指令是用來同步的,不是用來執(zhí)行原子操作的。在將獨(dú)占訪問引入ARM架構(gòu)之前,SWP和SWPB指令常用于同步。

其局限性是:如果中斷在觸發(fā)交換操作時觸發(fā),則處理器必須在執(zhí)行中斷之前完成指令的加載和存儲部分,從而增加中斷延遲。由于獨(dú)立加載和獨(dú)占存儲是單獨(dú)的指令,因此在使用新的同步基元時會降低此效果。

但是在多核系統(tǒng)中,交換指令期間阻止所有處理器訪問主存會降低系統(tǒng)性能。在處理器工作在不同頻率但是共享相同主存的多核系統(tǒng)中,情況尤其如此。

所以在ARMv6及以后的版本中,棄用了SWP,  ARMv6架構(gòu)引入了獨(dú)占訪問內(nèi)存為止的概念,提供了更靈活的原子內(nèi)存更新。

ARMv6體系結(jié)構(gòu)以Load-Exclusive和Store-Exclusive同步原語LDREX和STREX的形式引入了Load Link和Store Conditional指令。從ARMv6T2開始,這些指令在ARM和Thumb指令集中可用。獨(dú)立加載和專有存儲提供了靈活和可擴(kuò)展的同步,取代了棄用的SWP和SWPB指令。

后來使用的是LDREX和STREX指令,在armv7之后就用了ldrex和strex:

訪存指令LDREX/STREX和普通的LDR/STR訪存指令不一樣,它是“獨(dú)占”訪存指令。這對指令訪存過程由一個稱作“exclusive monitor”的部件來監(jiān)視是否可以進(jìn)行獨(dú)占訪問。

責(zé)任編輯:龐桂玉 來源: C語言與C++編程
相關(guān)推薦

2022-07-01 11:07:56

int原子操作代碼

2023-09-19 23:26:15

++i原子操作C++

2024-01-29 10:09:59

數(shù)據(jù)庫INT(3)INT(11)

2020-12-17 18:30:44

華為鴻蒙智能手機(jī)操作系統(tǒng)

2014-01-09 09:45:41

原子飛原子

2010-04-02 15:53:36

Oracle綁定變量

2020-09-11 06:44:29

Python增強(qiáng)算術(shù)

2024-07-01 10:16:55

搜索向量數(shù)據(jù)類型

2022-06-27 06:06:46

勒索軟件網(wǎng)絡(luò)攻擊

2023-05-17 08:52:56

Java原子性可見性

2024-01-31 17:52:04

2017-09-20 07:57:38

AWG電纜導(dǎo)線

2021-04-01 17:36:30

鴻蒙HarmonyOS應(yīng)用開發(fā)

2020-03-25 13:58:00

汽車智能物聯(lián)網(wǎng)

2020-07-03 14:05:26

Serverless云服務(wù)商

2022-03-14 08:33:09

TypeScriptJavaScript前端

2021-11-29 18:27:12

Web Wasmjs

2024-04-24 07:00:00

Redis架構(gòu)數(shù)據(jù)持久化

2023-11-20 22:26:51

Go開發(fā)

2013-09-11 17:02:40

紅帽OpenStack
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国产系列电影在线播放网址| 91看片破解版| 精品999视频| 欧美日韩国产欧| 亚洲国产欧美久久| 国产1区2区在线| 美女隐私在线观看| 日韩高清电影一区| 久久这里只有精品99| 美女网站视频黄色| 牛牛电影国产一区二区| 国产日韩精品一区二区浪潮av| 成人网在线视频| 毛片视频网站在线观看| 91精品精品| 亚洲免费一在线| 男插女视频网站| 激情开心成人网| 亚洲午夜激情网站| 一本一道久久a久久精品综合| 性一交一乱一透一a级| 噜噜爱69成人精品| 日韩高清a**址| 污视频在线观看免费网站| 91av亚洲| 亚洲超碰精品一区二区| 国产精品h视频| 国产精品一区二区婷婷| 成人精品国产福利| 欧美激情一区二区三级高清视频| 天堂久久精品忘忧草| 盗摄系列偷拍视频精品tp| 欧美日韩1区2区| 波多野结衣作品集| 国产高清自产拍av在线| 一区二区三区精品在线| 国产麻豆电影在线观看| 五月天婷婷在线视频| 激情综合网av| 国产精品久久中文| www.久久久久久久| 在线综合欧美| 97婷婷涩涩精品一区| 午夜激情福利电影| japanese国产精品| 亚洲精品自拍第一页| 影音先锋资源av| 日韩成人视屏| 日韩欧美国产一区二区在线播放| 天天干天天综合| 123成人网| 欧美亚洲日本国产| 在线观看的毛片| av成人亚洲| 亚洲一区二区三区爽爽爽爽爽 | caopor在线视频| 2024最新电影在线免费观看| 亚洲精品国产一区二区精华液| 最近看过的日韩成人| 美女av在线播放| 亚洲欧美日韩国产综合| 99亚洲国产精品| 免费毛片在线看片免费丝瓜视频 | 国产精品网站在线观看| 天堂精品一区二区三区| 福利在线观看| 亚洲欧美综合网| 日本老太婆做爰视频| 毛片大全在线观看| 午夜精品福利一区二区三区av| 波多野结衣之无限发射| yjizz视频网站在线播放| 国产亲近乱来精品视频| 亚洲图片都市激情| 中文国产字幕在线观看| 亚洲国产sm捆绑调教视频| 国产青青在线视频| 你懂得影院夜精品a| 精品视频免费在线| 一级黄色电影片| 全国精品免费看| 在线视频中文亚洲| 九九久久免费视频| 久久午夜视频| 欧美黑人巨大xxx极品| 国产中文字幕免费| 日韩影院精彩在线| 91影院未满十八岁禁止入内| 水莓100国产免费av在线播放| 91视频免费播放| 亚洲精品国产精品国自产| 在线视频观看国产| 色综合婷婷久久| 欧美中文字幕在线观看视频| 毛片在线网站| 欧美精品一卡二卡| 亚洲精品乱码久久久久久久| 久久要要av| 91精品国产高清| 国产毛片一区二区三区va在线| 99久久免费精品| 国产成人三级视频| 欧美三级网址| 精品成人佐山爱一区二区| 中文字幕免费在线看线人动作大片| 午夜日韩福利| 国产精品夜间视频香蕉| 日韩在线视频第一页| 中文字幕一区二区三区乱码在线| 亚洲熟妇无码一区二区三区| 亚洲热av色在线播放| 亚洲跨种族黑人xxx| 精品一区在线视频| 久久国产精品色| 精品国产一区二区三区麻豆小说 | 国产永久av在线| 亚洲一区二区三区三| 可以看污的网站| 精品在线播放| 国内精品免费午夜毛片| 97在线公开视频| 国产欧美综合色| 欧美aⅴ在线观看| 国产精品17p| 久久国产精品电影| 97精品人妻一区二区三区香蕉| 久久人人爽人人爽| 日本福利视频在线| 国产精品久久久久av蜜臀| 另类专区欧美制服同性| 中文字幕视频免费观看| 久久久99久久| 日本精品www| 日韩欧美在线精品| 午夜精品福利电影| 亚洲精品视频专区| 亚洲黄一区二区三区| 天天久久综合网| 香蕉精品视频在线观看| 国产日韩在线看| 午夜小视频在线| 欧美日本在线观看| 国产黄色录像片| 久久99精品久久久久婷婷| 日韩欧美亚洲日产国| 欧美free嫩15| 日韩中文字幕免费看| 曰批又黄又爽免费视频| 中文字幕av一区二区三区高| 91制片厂毛片| 97精品视频在线看| 成人欧美一区二区三区黑人孕妇| 日本三级视频在线播放| 欧美日韩电影在线| 内射一区二区三区| 国产精品99久| 国产日韩欧美二区| 草莓视频丝瓜在线观看丝瓜18| 精品国产免费一区二区三区四区 | 免费久久精品视频| 亚洲人成人77777线观看| 四虎精品在线观看| 欧美成在线视频| 欧美视频xxx| 欧美视频二区36p| 国产精久久一区二区三区| 免费观看成人av| 懂色av粉嫩av蜜臀av| 日韩成人久久| 欧美一区二区.| 精品国产乱码一区二区三| 91片黄在线观看| 一本久道中文无码字幕av| 久久五月天小说| 99久久久精品免费观看国产| 美女av在线免费看| 伊人男人综合视频网| 国产又爽又黄免费软件| 亚洲国产视频直播| 亚洲成人网在线播放| 精品亚洲国产成人av制服丝袜 | 麻豆成人精品| 一区二区三区四区不卡| 天堂av一区| 日本高清视频一区| 久操视频在线| 亚洲精品一区二区三区不| 艳妇乳肉豪妇荡乳av| 亚洲午夜在线观看视频在线| 国产综合精品在线| 国产盗摄女厕一区二区三区| 亚洲成熟丰满熟妇高潮xxxxx| 99久久婷婷这里只有精品| 国产精品一区二区免费看| 欧美与亚洲与日本直播| 色综合久久悠悠| 中文字幕精品在线观看| 亚洲精品国产a| 国产熟妇久久777777| 国产精品一区二区在线观看网站| 一本一道久久a久久精品综合| av综合网址| 国产欧美日韩高清| 成人黄色动漫| 美女啪啪无遮挡免费久久网站| 香蕉视频免费在线看| 日韩精品最新网址| 中文字幕视频免费观看| 欧美性色xo影院| 久久久久久久9999| 成人欧美一区二区三区1314| 熟女高潮一区二区三区| 国产91丝袜在线18| 成人免费性视频| 日韩国产一区二区| 欧美福利一区二区三区| 丁香5月婷婷久久| 亚洲综合色激情五月| 国产成人免费精品| 国产成人av网| 激情视频网站在线播放色| 欧美日韩国产成人| 国产精品va在线观看视色| 伊人久久免费视频| 麻豆导航在线观看| 欧美色图天堂网| 日本一区二区三区精品| 亚洲午夜三级在线| 男人的天堂久久久| 不卡av在线免费观看| 婷婷中文字幕在线观看| 久久成人精品无人区| 久久精品网站视频| 日日夜夜免费精品| 熟妇人妻va精品中文字幕| 夜夜嗨网站十八久久 | 成人在线观看亚洲| 久久综合色影院| jizz性欧美10| 欧美巨猛xxxx猛交黑人97人| 91精品国产91久久久久久青草| 久久精品视频亚洲| sm国产在线调教视频| 欧美精品在线免费观看| 四季久久免费一区二区三区四区| 久久国产精品偷| 欧美午夜大胆人体| 欧美激情国产精品| 免费看电影在线| 97超级碰碰人国产在线观看| 一区二区三区短视频| 欧美最猛性xxxx| 欧洲av一区二区| 国产精品视频最多的网站| 成人午夜一级| 91丨九色丨国产在线| 日韩欧美高清一区二区三区| 51国偷自产一区二区三区的来源| 亚洲电影一区| 精品欧美一区二区在线观看视频 | 一区二区三区四区视频在线观看 | 国产农村妇女精品| 国产精品视频在| 亚洲色大成网站www久久九九| 欧美偷拍第一页| 亚洲福利视频一区二区| 亚洲伊人成人网| 在线观看成人免费视频| 青草影院在线观看| 亚洲一区二区三区在线播放| 国产成人啪精品午夜在线观看| 国产精品天天看| 国产老头老太做爰视频| 一区二区国产盗摄色噜噜| 日韩精品视频播放| 色激情天天射综合网| 国产又粗又猛视频免费| 精品久久久久久无| 国产区av在线| 精品中文字幕在线| 亚洲欧美韩国| 亚洲最大福利视频| 亚洲动漫精品| 色哺乳xxxxhd奶水米仓惠香| 国产一区二区精品| 九九热精品国产| 99久久国产综合精品女不卡| 手机av在线不卡| 亚洲国产精品综合小说图片区| 九九九在线观看| 欧美一区二区福利在线| 精品电影在线| 欧美日韩电影在线观看| 视频在线日韩| 99热国产免费| 日韩精品中文字幕第1页| 国产美女作爱全过程免费视频| 日韩福利电影在线观看| 国产麻豆剧传媒精品国产| 国产日韩欧美综合在线| 久久综合加勒比| 欧美日韩免费高清一区色橹橹| 好吊色在线观看| 俺也去精品视频在线观看| 男人av在线播放| 亚洲一区二区在线播放| 精品成av人一区二区三区| 亚洲一区二区三区av无码| 精品综合久久久久久8888| 精品无人区无码乱码毛片国产 | 潘金莲一级淫片aaaaaa播放| 欧美大肚乱孕交hd孕妇| 看女生喷水的网站在线观看| 日韩av免费看网站| 噜噜噜天天躁狠狠躁夜夜精品| 午夜在线视频免费观看| 日韩福利电影在线| 国产成人无码一区二区在线观看 | 国产欧美久久久久| 麻豆国产欧美日韩综合精品二区| 2025韩国理伦片在线观看| 91在线视频免费91| 国产精品99无码一区二区| 91精品国产一区二区人妖| 成人在线观看免费| 欧美一区视频在线| 欧美sss在线视频| 精品人妻人人做人人爽| 国产一区二区毛片| 中文字幕美女视频| 欧美日韩一区高清| 成人精品一区二区三区免费 | 国产亚洲短视频| 国偷自拍第113页| 亚洲激情自拍图| a在线视频v视频| 国产精品欧美久久| 激情欧美一区二区三区| 欧美成人精品一区二区综合免费| 亚洲人成网站影音先锋播放| 国产乱人乱偷精品视频| 久久精品小视频| 欧美成人精品一级| 日本一二三区视频在线| 国产精品综合网| 青青草手机视频在线观看| 日韩欧美在线综合网| 牛牛电影国产一区二区| 国产欧美韩日| 亚洲尤物影院| 三级网站在线免费观看| 欧美亚洲动漫制服丝袜| 69av亚洲| 亚洲综合自拍一区| 黄色成人91| 成人免费无码大片a毛片| 疯狂欧美牲乱大交777| 国产精品综合在线| 欧美乱大交xxxxx| 国产一级成人av| av免费播放网址| 国产日本一区二区| 在线黄色av网站| 欧美插天视频在线播放| 久久这里只有精品一区二区| 欧美性久久久久| 中文字幕的久久| 国产黄色片免费| 日本精品视频在线播放| 成人在线丰满少妇av| 一起草最新网址| 欧美色xxxx| 黄色网在线看| 国产亚洲精品自在久久| 日本女人一区二区三区| 日本xxxx裸体xxxx| 91精品1区2区| aaa大片在线观看| 久久久久久久久久久久久9999| 日韩高清不卡一区二区三区| 四虎免费在线视频| 国产网站欧美日韩免费精品在线观看| 成人国产精品| 国产曰肥老太婆无遮挡| 国产肉丝袜一区二区| h狠狠躁死你h高h| 国产第一区电影| 欧美日韩视频| 精品国产成人亚洲午夜福利| 日韩丝袜情趣美女图片| 亚洲国产成人二区| 成人在线观看www| 国产亚洲1区2区3区| www.激情五月| 国产精品日韩欧美综合| 日韩一区二区久久| 欧美大片xxxx| 国产一区二区三区在线视频 | 日韩精品福利视频| 国产精品99久久久久久似苏梦涵|