精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

国产成+人+综合+亚洲欧美丁香花| 一本久久a久久精品亚洲| 国产精品久久久久久久av电影| 日韩av片在线免费观看| 日韩欧洲国产| 欧美香蕉大胸在线视频观看| 日韩资源av在线| 国产麻豆91视频| 亚洲理伦在线| 日韩视频免费在线观看| 中文字幕第九页| 成人在线高清| 五月天亚洲精品| 一区精品在线| 黄色av网站在线免费观看| 国产乱对白刺激视频不卡| 日韩免费观看高清| 久久中文字幕无码| 久久社区一区| 亚洲欧美另类自拍| 绯色av蜜臀vs少妇| 激情中国色综合| 日韩欧美国产网站| 久久久天堂国产精品| 国产精品一区二区婷婷| 99亚偷拍自图区亚洲| 成人字幕网zmw| 亚洲精品91天天久久人人| 黄色综合网站| 欧美成人自拍视频| 女人裸体性做爰全过| 任你躁在线精品免费| 日韩丝袜情趣美女图片| 911福利视频| 91精品国产66| 在线视频一区二区三| 欧美 日韩 亚洲 一区| 18av在线视频| 国产精品大尺度| 日韩国产精品一区二区| 日韩av免费观影| 99国产精品久久久久久久久久| 99porn视频在线| 精品国产无码一区二区| 国精产品一区一区三区mba视频| 日韩av片电影专区| 手机在线看片1024| 六月婷婷一区| 日韩av电影手机在线| 看片网址国产福利av中文字幕| 亚洲视频精品| 午夜剧场成人观在线视频免费观看| 麻豆精品一区二区三区视频| 亚洲成av人片乱码色午夜| 久久精品视频一| 国产精品免费人成网站酒店| 91综合网人人| 久久在线精品视频| 三级影片在线看| 欧美日韩爆操| 久久久久久久久国产| 国产精品99精品无码视| 韩日精品在线| 97视频在线观看视频免费视频 | 小泽玛利亚视频在线观看| 免费成人直播| 欧美在线你懂的| 国产精品自拍视频在线| 高清一区二区中文字幕| 欧美va亚洲va在线观看蝴蝶网| 污网站免费观看| 欧美jizz19性欧美| 亚洲视频在线播放| 日本成人精品视频| 国产精品扒开腿做爽爽爽软件| 久久久久久国产| www亚洲视频| 麻豆视频观看网址久久| 亚洲综合自拍一区| 人妻妺妺窝人体色www聚色窝| 久久综合资源网| 亚洲永久一区二区三区在线| 日本孕妇大胆孕交无码| 午夜精品久久久久久久| 中文字幕国产传媒| 一区二区三区高清在线观看| 亚洲精品aⅴ中文字幕乱码| 一卡二卡三卡四卡| 婷婷久久国产对白刺激五月99| 欧美激情高清视频| 国产成人无码一区二区在线播放| 久久99久久99精品免视看婷婷| 99porn视频在线| 国产美女性感在线观看懂色av| 亚洲天堂a在线| 精品中文字幕av| www.欧美视频| 亚洲欧美成人精品| av激情在线观看| 亚洲欧美卡通另类91av| 91亚洲精品视频| 免费在线观看污视频| 亚洲视频一区二区在线观看| 亚洲 欧美 日韩 国产综合 在线 | 国产肥白大熟妇bbbb视频| 亚洲最大av| 国产精品999| 亚洲欧美强伦一区二区| 欧美激情一区不卡| 久久综合色视频| 99视频这里有精品| 亚洲色图综合网| 国产无套在线观看| 国产在线视视频有精品| 日本免费高清不卡| freexxx性亚洲精品| 欧美一区二区不卡视频| 国产毛片欧美毛片久久久| 伊人久久大香线蕉av超碰演员| 成人美女av在线直播| 欧美日韩免费做爰大片| 婷婷开心激情综合| 欧美图片自拍偷拍| 先锋资源久久| 国产日韩欧美视频在线| 欧美巨乳在线| 精品久久久在线观看| 性xxxxxxxxx| 亚洲国产日韩欧美在线| 国产精品久久久| 免费在线国产| 色综合视频在线观看| 国产精品一区二区人妻喷水| 一区二区在线| 91最新国产视频| 日韩大片在线永久免费观看网站| 日韩欧美精品网址| 亚洲国产精品成人综合久久久| 精品1区2区3区4区| 成人av免费看| 调教一区二区| 欧美大片免费久久精品三p| www.xxxx日本| 国产精品538一区二区在线| 国产av第一区| 日韩三级不卡| 欧美精品videofree1080p| 成 人 免费 黄 色| 一区二区三区日韩在线观看| 永久看看免费大片| 黄色另类av| 精品伦理一区二区三区| 涩涩涩视频在线观看| 日韩高清有码在线| 99久久精品国产亚洲| 久久在线观看免费| 亚洲视频在线观看一区二区三区| 国内精品久久久久久99蜜桃| 国产精品久久久久久婷婷天堂| 国产高清免费av在线| 欧美网站大全在线观看| 国产aaaaaaaaa| 国产裸体歌舞团一区二区| 成人在线观看毛片| 欧美aaaaa级| 国产精品高潮呻吟久久av黑人| 成人高清免费在线播放| 欧美精品tushy高清| 久久久久久久国产精品毛片| 99这里只有精品| 天天干在线影院| 亚洲成人精品| 国产欧美韩日| 成人在线观看免费视频| 久久夜色精品国产亚洲aⅴ| www精品国产| 日本韩国精品在线| 翔田千里88av中文字幕| 成人三级伦理片| 日韩免费高清在线| 91精品国产91久久久久久密臀| 99国产视频| 超碰超碰人人人人精品| 日韩三级成人av网| 婷婷视频在线观看| 欧美日韩一级视频| 日本三级黄色大片| 国产三级欧美三级| 人妻 丝袜美腿 中文字幕| 老**午夜毛片一区二区三区| 日本三级福利片| 欧美精品中文| 91视频国产高清| 免费在线小视频| 久久久av一区| 男人久久精品| 日韩美女天天操| 一区二区视频网站| 精品欧美国产一区二区三区| 熟女少妇a性色生活片毛片| 不卡的av网站| theporn国产精品| 免费日韩av片| wwwwww欧美| 日韩精品免费一区二区在线观看| 国产午夜精品在线| 高清一区二区三区av| 国产成人精品午夜| 国产蜜臀在线| 日韩中文有码在线视频| 天堂а在线中文在线无限看推荐| 宅男在线国产精品| 人妻中文字幕一区二区三区| 午夜久久久久久久久| 丝袜 亚洲 另类 欧美 重口| 国产亚洲一区二区在线观看| 亚洲av无码一区二区三区观看| 国产精品一区二区男女羞羞无遮挡| 亚洲免费看av| 久久精品主播| 波多野结衣50连登视频| 亚洲特级毛片| 青青视频免费在线| 国产精品99在线观看| 日韩欧美亚洲在线| 综合干狼人综合首页| 激情五月综合色婷婷一区二区| 日韩视频一二区| 亚洲va欧美va国产综合剧情| 91精品美女| 国产精品美腿一区在线看| 性爽视频在线| 91成人免费观看网站| av老司机免费在线| 欧美精品aaa| 久久香蕉一区| 国模精品视频一区二区三区| 肉肉视频在线观看| 欧美激情视频一区二区三区不卡| 成人video亚洲精品| 久久久91精品国产| 精品自拍一区| 欧美成人激情在线| 26uuu亚洲电影在线观看| 蜜月aⅴ免费一区二区三区 | 欧洲美女7788成人免费视频| 91九色porn在线资源| 欧美片一区二区三区| 污污视频在线看| 国内外成人免费激情在线视频 | 国产精品日韩在线播放| 黄色成人小视频| 成人精品久久久| 国产专区精品| 国产成人精品免费视频大全最热| 东京久久高清| 久久精品午夜一区二区福利| 蜜乳av综合| 视频一区视频二区视频三区视频四区国产 | 久久午夜影视| 我看黄色一级片| 久久av中文字幕片| 91pony九色| 丰满少妇久久久久久久| 天天躁日日躁狠狠躁av| av亚洲产国偷v产偷v自拍| 男生裸体视频网站| 国产情人综合久久777777| 极品尤物一区二区| 亚洲人xxxx| 国产成人精品a视频一区| 欧美性xxxx极品hd满灌| 国模私拍一区二区| 欧美一区二区三区成人| 男人天堂综合网| 亚洲三级av在线| 麻豆网站在线看| 午夜精品一区二区三区视频免费看 | 亚洲精品一区二区三区四区 | 99riav在线| 久久99热精品这里久久精品| 中文字幕在线官网| 成人中文字幕+乱码+中文字幕| 精品国产导航| 一本一生久久a久久精品综合蜜| 欧美精品观看| www日韩视频| 国产精品一级二级三级| 无码人妻aⅴ一区二区三区| 国产精品久久久久久久久免费樱桃 | 国产999精品久久久| 国产一区二区三区| 日本一区二区精品| 午夜日韩电影| 激情网站五月天| 成人在线视频首页| 美国精品一区二区| 午夜久久久影院| 国产又粗又猛又黄又爽| 亚洲国产一区自拍| 黄色小网站在线观看| 日本a级片电影一区二区| 久久久精品区| 亚洲精蜜桃久在线| 亚洲永久网站| 成年人看片网站| 国产精品丝袜一区| 国内精品福利视频| 日韩欧美中文字幕公布| 超碰在线国产| 欧美一级大片在线观看| 7m精品国产导航在线| 亚洲日本精品国产第一区| 亚洲欧美日韩国产一区| 18禁一区二区三区| 亚洲私人影院在线观看| 中文精品久久久久人妻不卡| 精品电影一区二区| av网站导航在线观看免费| 国产精品揄拍500视频| 免费看成人吃奶视频在线| 免费高清一区二区三区| 国内精品国产三级国产a久久| 欧美老女人性生活视频| 欧美日韩一区二区在线 | 中文字幕日韩在线观看| 日韩伦理在线一区| 国产精品久久精品视| 亚洲激情五月| 在线免费看污网站| 国产精品美女一区二区| 蜜臀99久久精品久久久久小说| 日韩国产在线播放| av中文字幕在线观看第一页 | 黄色片免费网址| 国产精品沙发午睡系列990531| 久久久久久在线观看| 日韩精品极品在线观看播放免费视频| 青春草在线免费视频| av成人观看| 影音先锋久久精品| 性久久久久久久久久久| 亚洲综合图片区| 欧美自拍第一页| 91精品国产成人www| 琪琪久久久久日韩精品 | 精品一区二区在线观看| 天堂网中文在线观看| 欧美精品粉嫩高潮一区二区| а√中文在线8| 99re热精品| 亚洲国产一区二区精品专区| 国产十八熟妇av成人一区| 第一福利永久视频精品| 毛片在线播放网址| 国产精品白嫩初高中害羞小美女 | 亚洲国产精品黑人久久久| 亚洲精品毛片一区二区三区| 尤物九九久久国产精品的分类 | 大胸美女被爆操| 欧美精品第1页| 福利网站在线观看| 久久久久久久有限公司| 视频一区在线播放| 少妇高潮一区二区三区喷水| 日韩欧美国产不卡| 涩涩视频网站在线观看| 色乱码一区二区三在线看| 精品一区二区三区免费毛片爱| 欧美成人精品欧美一级| 亚洲黄色成人网| 欧美国产日韩电影| 加勒比海盗1在线观看免费国语版| 成人av网址在线观看| 999视频在线| 欧美精品日韩三级| 日韩欧美国产大片| 日本不卡一区二区在线观看| 一区二区三区日韩在线观看| 欧美3p视频在线观看| 91免费欧美精品| 日韩午夜在线电影| 夫妇露脸对白88av| 欧美α欧美αv大片| 免费观看一级欧美片| 国产精品波多野结衣| 99国产一区二区三精品乱码| 亚洲一区 中文字幕| 性欧美xxxx| 97偷自拍亚洲综合二区| 日韩成人av一区二区| 在线播放欧美女士性生活| 麻豆视频在线看| 在线观看18视频网站| 97se亚洲国产综合自在线不卡 | 中国黄色录像片| 久久久无码精品亚洲日韩按摩| 国产成人久久精品77777综合| 欧美最猛性xxxxx免费| 欧美日韩亚洲一区在线观看|