国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

前言

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

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

原子操作是不可分割的操作,在執行完畢時它不會被任何事件中斷。在單處理器系統(UniProcessor,簡稱 UP)中,能夠在單條指令中完成的操作都可以認為是原子操作,因為中斷只能發生在指令與指令之間。

比如,C語言代碼

如果未經優化,有可能生成如下匯編:

這樣在有多個進程執行這段代碼時,就有可能產生并發問題:

這就會出現問題。

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

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

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

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

但是,在多處理器系統(Symmetric Multi-Processor,簡稱 SMP)中情況有所不同,由于系統中有多個處理器在獨立的運行,即使在能單條指令中完成的操作也可能受到干擾。因為這個時候并發的主題不再是進程,而是處理器。

X86架構

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

比如:

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

如圖所示:

X86LOCK

其原理在Intel開發手冊有如下說明:

  •  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.

在執行伴隨的指令期間使處理器的LOCK#信號有效(將指令變為原子指令)。在多處理器環境中,LOCK#信號確保處理器在信號有效時獨占使用任何共享存儲器。

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

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

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

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

操作系統中的實現

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

LOCK_PREFIX的定義如下所示:

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

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

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架構

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

在Linux對于ARM架構的代碼下:

有如下:

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

對于cmpxchg:

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

ARMv6以前的版本通過關本地中斷來保護這塊臨界區,看起來相當簡單,其奧秘就在于ARMv6以前的版本不支持SMP。

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

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

多說一點關于SWP和SWPB的內容

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

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

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

所以在ARMv6及以后的版本中,棄用了SWP,  ARMv6架構引入了獨占訪問內存為止的概念,提供了更靈活的原子內存更新。

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

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

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

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2022-07-01 11:07:56

int原子操作代碼

2023-09-19 23:26:15

++i原子操作C++

2024-01-29 10:09:59

數據庫INT(3)INT(11)

2020-12-17 18:30:44

華為鴻蒙智能手機操作系統

2014-01-09 09:45:41

原子飛原子

2010-04-02 15:53:36

Oracle綁定變量

2020-09-11 06:44:29

Python增強算術

2024-07-01 10:16:55

搜索向量數據類型

2022-06-27 06:06:46

勒索軟件網絡攻擊

2023-05-17 08:52:56

Java原子性可見性

2024-01-31 17:52:04

2017-09-20 07:57:38

AWG電纜導線

2021-04-01 17:36:30

鴻蒙HarmonyOS應用開發

2020-03-25 13:58:00

汽車智能物聯網

2022-03-14 08:33:09

TypeScriptJavaScript前端

2020-07-03 14:05:26

Serverless云服務商

2024-04-24 07:00:00

Redis架構數據持久化

2021-11-29 18:27:12

Web Wasmjs

2023-11-20 22:26:51

Go開發

2013-09-11 17:02:40

紅帽OpenStack
點贊
收藏

51CTO技術棧公眾號

欧美精品一二区| 缅甸午夜性猛交xxxx| 欧美高清在线精品一区| 欧美aaaaaaa| 亚洲色图都市激情| 中文字幕亚洲一区二区三区五十路| 日本欧美在线看| 欧美日韩高清| 精品视频一区二区三区在线观看| 黄视频在线免费看| 国产精品久久亚洲不卡| 亚洲电影视频在线| 福利视频午夜| 亚洲男男gay视频| 美女av免费在线观看| 免费久久久一本精品久久区| 一道本成人在线| 亚洲免费综合| 2021年精品国产福利在线| 麻豆视频在线| 97国产精东麻豆人妻电影| 日韩video| www.xxx亚洲| 日韩免费毛片视频| 国产九九在线观看| 蜜桃专区在线| 尤物网站在线| 久久精品视频免费看 | 亚洲精品老司机| 国产一区二区看久久| 美女一区二区久久| 美女福利一区二区三区| 最新亚洲精品| 国内自拍视频一区二区三区 | 午夜不卡视频| 中文字幕97| 国产极品尤物在线| 在线一区观看| 99热亚洲精品| 日韩 欧美 视频| 欧美另类一区| 91免费电影网站| 成人女保姆的销魂服务| 欧美另类老女人| 亚洲美女自拍视频| 一区二区三区www| 精品国产一区久久久| 亚洲欧美日韩精品久久亚洲区| 精品1区2区3区| 欧美性受xxxx黑人xyx性爽| 亚洲国产你懂的| 日韩欧美黄色动漫| 精品乱人伦小说| 日韩精品中文字幕久久臀| 亚洲加勒比久久88色综合| 日韩精品久久久久久福利| 久久精品成人动漫| 久久久久久久成人| 国产精品网站视频| www.成人三级视频| 欧美裸体网站| 日本老熟妇毛茸茸| 1024在线播放| 亚洲精品综合| 国产成人l区| 美女网站在线| 超碰在线caoporn| av天天av| 成年人在线看片| 国产人妻互换一区二区| 中文字幕一区二区三区有限公司| 法国空姐在线观看免费| 你懂的网址一区二区三区| 一本色道久久综合亚洲精品婷婷| 国产精品成人aaaaa网站| 精品福利影视| 成人激情在线播放| 中文字幕国产日韩| 日韩精品有码在线观看| 欧美一级二级在线观看| 欧美日韩一区二区三区高清| 色噜噜久久综合| 亚洲欧洲成人精品av97| 天天操天天色综合| 在线播放视频一区| 最近中文字幕2019免费| 久久久久999| 欧美精品一区二区免费| 久久久影视传媒| 日韩精品欧美精品| 国产一区二区导航在线播放| 欧美高清一级片在线观看| 久久日韩精品一区二区五区| 久久一区二区视频| 亚洲在线观看免费视频| 综合激情一区| 神马影院我不卡午夜| 台湾成人av| 日漫免费在线观看网站| 欧美a一欧美| 成人性视频免费网站| 亚洲国产成人爱av在线播放| 国产日韩欧美电影在线观看| 无码人妻丰满熟妇区毛片18| 亚洲wwwww| 国产欧美成人| 欧美日韩精品欧美日韩精品一综合| 国产欧美亚洲精品| 涩爱av在线播放一区二区| heyzo久久| 亚洲男人电影天堂| 国产精品久久久久久亚洲影视| 在线观看成人网| 欧美午夜网站| 国产精品每日更新| 青青在线视频一区二区三区| 成年人网站大全| 日韩高清影视在线观看| 欧美激情一区二区三区不卡| www国产精品视频| 无限资源日本好片| 久久不见久久见国语| 韩国v欧美v日本v亚洲v| 亚洲美女av在线| 伊人久久99| 香蕉久久夜色精品| 欧美色欧美亚洲另类二区| 不卡av电影在线观看| 欧美日韩卡一卡二| 依依成人精品视频| 欧美亚洲免费在线一区| 欧美成人午夜激情在线| 国产一区二区三区在线免费| sqte在线播放| 成人妖精视频yjsp地址| 亚洲图片欧洲图片av| 国语精品免费视频| 在线免费色视频| 亚洲精品一区二区在线播放∴| 国产专区综合网| 在线观看亚洲专区| 欧美制服第一页| 亚洲不卡中文字幕无码| 日韩精品一二| 日韩av在线发布| 国产一区二区三区毛片| 无码免费一区二区三区免费播放 | 在线看国产日韩| 韩日午夜在线资源一区二区| 日韩另类视频| 欧美少妇一区二区| 校园春色 亚洲色图| 麻豆久久久久久| 国产精品99久久久久久久| 四虎影视精品永久在线观看| 日韩三区在线观看| 免费在线观看麻豆视频 | 久久在线免费观看视频| 污污软件在线观看| 中文字幕精品在线不卡| 99亚洲精品视频| 国产一区二区三区成人欧美日韩在线观看| 久久免费视频网站| 成人国产精品入口免费视频| 日韩欧美在线观看一区二区三区| 午夜在线观看视频网站| 中文字幕精品—区二区四季| 六月丁香婷婷激情| 国产iv一区二区三区| 四虎一区二区| 狠狠88综合久久久久综合网| 91九色对白| 欧美大片一区| 国产精品国模大尺度私拍| 色综合综合网| 国产精品成人播放| 九九精品在线| 亚洲欧洲xxxx| 日韩精品三区| 久久成人国产精品| 亚洲乱码一区| 国产精品91久久久| 在线观看国产精品入口| 成人一区二区在线| 欧美xxx在线观看| 国产亚洲自拍偷拍| 国产精品普通话对白| 亚洲永久激情精品| 国产一区二区伦理| 人妻无码视频一区二区三区| 国产精品久久国产精麻豆99网站 | 可以看毛片的网址| 久久久久久久综合日本| 很黄很污的网站| 亚洲一区av在线| 麻豆传媒视频在线观看| 亚洲激情在线观看| 久久免费精品| 国产精品第三页| 日韩二区三区四区|