日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用CAS技術(shù)實(shí)現(xiàn)無(wú)鎖隊(duì)列

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:陳皓 ? 2021-01-11 10:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導(dǎo)讀】:本文主要講解利用CAS技術(shù)實(shí)現(xiàn)無(wú)鎖隊(duì)列。

關(guān)于無(wú)鎖隊(duì)列的實(shí)現(xiàn),網(wǎng)上有很多文章,雖然本文可能和那些文章有所重復(fù),但是我還是想以我自己的方式把這些文章中的重要的知識(shí)點(diǎn)串起來(lái)和大家講一講這個(gè)技術(shù)。下面開(kāi)始正文。

關(guān)于CAS等原子操作

在開(kāi)始說(shuō)無(wú)鎖隊(duì)列之前,我們需要知道一個(gè)很重要的技術(shù)就是CAS操作——Compare & Set,或是Compare & Swap,現(xiàn)在幾乎所有的CPU指令都支持CAS的原子操作,X86下對(duì)應(yīng)的是 CMPXCHG 匯編指令。有了這個(gè)原子操作,我們就可以用其來(lái)實(shí)現(xiàn)各種無(wú)鎖(lock free)的數(shù)據(jù)結(jié)構(gòu)。

這個(gè)操作用C語(yǔ)言來(lái)描述就是下面這個(gè)樣子:(代碼來(lái)自Wikipedia的Compare And Swap詞條)意思就是說(shuō),看一看內(nèi)存*reg里的值是不是oldval,如果是的話(huà),則對(duì)其賦值newval。

intcompare_and_swap(int*reg,intoldval,intnewval)
{
intold_reg_val=*reg;
if(old_reg_val==oldval){
*reg=newval;
}
returnold_reg_val;
}

我們可以看到,old_reg_val 總是返回,于是,我們可以在 compare_and_swap 操作之后對(duì)其進(jìn)行測(cè)試,以查看它是否與 oldval相匹配,因?yàn)樗赡苡兴煌@意味著另一個(gè)并發(fā)線(xiàn)程已成功地競(jìng)爭(zhēng)到 compare_and_swap 并成功將 reg 值從 oldval 更改為別的值了。

這個(gè)操作可以變種為返回bool值的形式(返回 bool值的好處在于,可以調(diào)用者知道有沒(méi)有更新成功):

boolcompare_and_swap(int*addr,intoldval,intnewval)
{
if(*addr!=oldval){
returnfalse;
}
*addr=newval;
returntrue;
}

與CAS相似的還有下面的原子操作:(這些東西大家自己看Wikipedia,也沒(méi)什么復(fù)雜的)

  • Fetch And Add,一般用來(lái)對(duì)變量做 +1 的原子操作

  • Test-and-set,寫(xiě)值到某個(gè)內(nèi)存位置并傳回其舊值。匯編指令BST

  • Test and Test-and-set,用來(lái)低低Test-and-Set的資源爭(zhēng)奪情況

:在實(shí)際的C/C++程序中,CAS的各種實(shí)現(xiàn)版本如下:

1)GCC的CAS

GCC4.1+版本中支持CAS的原子操作(完整的原子操作可參看 GCC Atomic Builtins)

bool__sync_bool_compare_and_swap(type*ptr,typeoldvaltypenewval,...)
type__sync_val_compare_and_swap(type*ptr,typeoldvaltypenewval,...)

2)Windows的CAS

在Windows下,你可以使用下面的Windows API來(lái)完成CAS:(完整的Windows原子操作可參看MSDN的InterLocked Functions)

InterlockedCompareExchange(__inoutLONGvolatile*Target,
__inLONGExchange,
__inLONGComperand);

3) C++11中的CAS

C++11中的STL中的atomic類(lèi)的函數(shù)可以讓你跨平臺(tái)。(完整的C++11的原子操作可參看 Atomic Operation Library)

template
boolatomic_compare_exchange_weak(std::atomic*obj,
T*expected,Tdesired);
template
boolatomic_compare_exchange_weak(volatilestd::atomic*obj,
T*expected,Tdesired);

無(wú)鎖隊(duì)列的鏈表實(shí)現(xiàn)

下面的代碼主要參考于兩篇論文:

  • John D. Valois 1994年10月在拉斯維加斯的并行和分布系統(tǒng)系統(tǒng)國(guó)際大會(huì)上的一篇論文——《Implementing Lock-Free Queues》

  • 美國(guó)紐約羅切斯特大學(xué) Maged M. Michael 和 Michael L. Scott 在1996年3月發(fā)表的一篇論文 《Simple, Fast, and Practical Non-Blocking and Blocking ConcurrentQueue Algorithms》

(注:下面的代碼并不完全與這篇論文相同)

初始化一個(gè)隊(duì)列的代碼很簡(jiǎn),初始化一個(gè)dummy結(jié)點(diǎn)(注:在鏈表操作中,使用一個(gè)dummy結(jié)點(diǎn),可以少掉很多邊界條件的判斷),如下所示:

InitQueue(Q)
{
node=newnode()
node->next=NULL;
Q->head=Q->tail=node;
}

我們先來(lái)看一下進(jìn)隊(duì)列用CAS實(shí)現(xiàn)的方式,基本上來(lái)說(shuō)就是鏈表的兩步操作:

第一步,把tail指針的next指向要加入的結(jié)點(diǎn)。tail->next = p;

第二步,把tail指針移到隊(duì)尾。tail = p;

EnQueue(Q,data)//進(jìn)隊(duì)列
{
//準(zhǔn)備新加入的結(jié)點(diǎn)數(shù)據(jù)
n=newnode();
n->value=data;
n->next=NULL;
do{
p=Q->tail;//取鏈表尾指針的快照
}while(CAS(p->next,NULL,n)!=TRUE);
//while條件注釋?zhuān)喝绻麤](méi)有把結(jié)點(diǎn)鏈在尾指針上,再試
CAS(Q->tail,p,n);//置尾結(jié)點(diǎn)tail=n;
}

我們可以看到,程序中的那個(gè) do-while 的 Retry-Loop 中的 CAS 操作:如果 p->next 是 NULL,那么,把新結(jié)點(diǎn) n 加到隊(duì)尾。如果不成功,則重新再來(lái)一次!

就是說(shuō),很有可能我在準(zhǔn)備在隊(duì)列尾加入結(jié)點(diǎn)時(shí),別的線(xiàn)程已經(jīng)加成功了,于是tail指針就變了,于是我的CAS返回了false,于是程序再試,直到試成功為止。這個(gè)很像我們的搶電話(huà)熱線(xiàn)的不停重播的情況。

但是你會(huì)看到,為什么我們的“置尾結(jié)點(diǎn)”的操作(第13行)不判斷是否成功,因?yàn)椋?/p>

  • 如果有一個(gè)線(xiàn)程T1,它的while中的CAS如果成功的話(huà),那么其它所有的 隨后線(xiàn)程的CAS都會(huì)失敗,然后就會(huì)再循環(huán),

  • 此時(shí),如果T1 線(xiàn)程還沒(méi)有更新tail指針,其它的線(xiàn)程繼續(xù)失敗,因?yàn)閠ail->next不是NULL了。

  • 直到T1線(xiàn)程更新完 tail 指針,于是其它的線(xiàn)程中的某個(gè)線(xiàn)程就可以得到新的 tail 指針,繼續(xù)往下走了。

  • 所以,只要線(xiàn)程能從 while 循環(huán)中退出來(lái),意味著,它已經(jīng)“獨(dú)占”了,tail 指針必然可以被更新。

  • 這里有一個(gè)潛在的問(wèn)題——如果T1線(xiàn)程在用CAS更新tail指針的之前,線(xiàn)程停掉或是掛掉了,那么其它線(xiàn)程就進(jìn)入死循環(huán)了。下面是改良版的EnQueue()

EnQueue(Q,data)//進(jìn)隊(duì)列改良版v1
{
n=newnode();
n->value=data;
n->next=NULL;
p=Q->tail;
oldp=p
do{
while(p->next!=NULL)
p=p->next;
}while(CAS(p.next,NULL,n)!=TRUE);//如果沒(méi)有把結(jié)點(diǎn)鏈在尾上,再試
CAS(Q->tail,oldp,n);//置尾結(jié)點(diǎn)
}

我們讓每個(gè)線(xiàn)程,自己fetch 指針 p 到鏈表尾。但是這樣的fetch會(huì)很影響性能。而且,如果一個(gè)線(xiàn)程不斷的EnQueue,會(huì)導(dǎo)致所有的其它線(xiàn)程都去 fetch 他們的 p 指針到隊(duì)尾,能不能不要所有的線(xiàn)程都干同一個(gè)事?這樣可以節(jié)省整體的時(shí)間?

比如:直接 fetch Q->tail 到隊(duì)尾?因?yàn)椋械木€(xiàn)程都共享著 Q->tail,所以,一旦有人動(dòng)了它后,相當(dāng)于其它的線(xiàn)程也跟著動(dòng)了,于是,我們的代碼可以改進(jìn)成如下的實(shí)現(xiàn):

EnQueue(Q,data)//進(jìn)隊(duì)列改良版v2
{
n=newnode();
n->value=data;
n->next=NULL;
while(TRUE){
//先取一下尾指針和尾指針的next
tail=Q->tail;
next=tail->next;
//如果尾指針已經(jīng)被移動(dòng)了,則重新開(kāi)始
if(tail!=Q->tail)continue;
//如果尾指針的next不為NULL,則fetch全局尾指針到next
if(next!=NULL){
CAS(Q->tail,tail,next);
continue;
}
//如果加入結(jié)點(diǎn)成功,則退出
if(CAS(tail->next,next,n)==TRUE)break;
}
CAS(Q->tail,tail,n);//置尾結(jié)點(diǎn)
}

上述的代碼還是很清楚的,相信你一定能看懂,而且,這也是 Java 中的 ConcurrentLinkedQueue 的實(shí)現(xiàn)邏輯,當(dāng)然,我上面的這個(gè)版本比 Java 的好一點(diǎn),因?yàn)闆](méi)有 if 嵌套,嘿嘿。

好了,我們解決了EnQueue,我們?cè)賮?lái)看看DeQueue的代碼:(很簡(jiǎn)單,我就不解釋了)

DeQueue(Q)//出隊(duì)列
{
do{
p=Q->head;
if(p->next==NULL){
returnERR_EMPTY_QUEUE;
}
while(CAS(Q->head,p,p->next)!=TRUE);
returnp->next->value;
}

我們可以看到,DeQueue的代碼操作的是 head->next,而不是 head 本身。這樣考慮是因?yàn)橐粋€(gè)邊界條件,我們需要一個(gè)dummy的頭指針來(lái)解決鏈表中如果只有一個(gè)元素,head 和 tail 都指向同一個(gè)結(jié)點(diǎn)的問(wèn)題,這樣 EnQueue 和 DeQueue 要互相排斥了。

但是,如果 head 和 tail 都指向同一個(gè)結(jié)點(diǎn),這意味著隊(duì)列為空,應(yīng)該返回 ERR_EMPTY_QUEUE,但是,在判斷 p->next == NULL 時(shí),另外一個(gè)EnQueue操作做了一半,此時(shí)的 p->next 不為 NULL了,但是 tail 指針還差最后一步,沒(méi)有更新到新加的結(jié)點(diǎn),這個(gè)時(shí)候就會(huì)出現(xiàn),在 EnQueue 并沒(méi)有完成的時(shí)候, DeQueue 已經(jīng)把新增加的結(jié)點(diǎn)給取走了,此時(shí),隊(duì)列為空,但是,head 與 tail 并沒(méi)有指向同一個(gè)結(jié)點(diǎn)。如下所示:b031238e-523c-11eb-8b86-12bb97331649.jpg

雖然,EnQueue的函數(shù)會(huì)把 tail 指針置對(duì),但是,這種情況可能還是會(huì)導(dǎo)致一些并發(fā)問(wèn)題,所以,嚴(yán)謹(jǐn)來(lái)說(shuō),我們需要避免這種情況。于是,我們需要加入更多的判斷條件,還確保這個(gè)問(wèn)題。下面是相關(guān)的改進(jìn)代碼:

DeQueue(Q)//出隊(duì)列,改進(jìn)版
{
while(TRUE){
//取出頭指針,尾指針,和第一個(gè)元素的指針
head=Q->head;
tail=Q->tail;
next=head->next;
//Q->head指針已移動(dòng),重新取head指針
if(head!=Q->head)continue;

//如果是空隊(duì)列
if(head==tail&&next==NULL){
returnERR_EMPTY_QUEUE;
}

//如果tail指針落后了
if(head==tail&&next==NULL){
CAS(Q->tail,tail,next);
continue;
}
//移動(dòng)head指針成功后,取出數(shù)據(jù)
if(CAS(Q->head,head,next)==TRUE){
value=next->value;
break;
}
}
free(head);//釋放老的dummy結(jié)點(diǎn)
returnvalue;
}

上面這段代碼的邏輯和 Java 的 ConcurrentLinkedQueue 的 poll 方法很一致了。也是《Simple, Fast, and Practical Non-Blocking and Blocking ConcurrentQueue Algorithms》這篇論文中的實(shí)現(xiàn)。

CAS的ABA問(wèn)題

所謂ABA(見(jiàn)維基百科的ABA詞條),問(wèn)題基本是這個(gè)樣子:

  • 進(jìn)程P1在共享變量中讀到值為A

  • P1被搶占了,進(jìn)程P2執(zhí)行

  • P2把共享變量里的值從A改成了B,再改回到A,此時(shí)被P1搶占。

  • P1回來(lái)看到共享變量里的值沒(méi)有被改變,于是繼續(xù)執(zhí)行。

雖然P1以為變量值沒(méi)有改變,繼續(xù)執(zhí)行了,但是這個(gè)會(huì)引發(fā)一些潛在的問(wèn)題。ABA問(wèn)題最容易發(fā)生在lock free 的算法中的,CAS首當(dāng)其沖,因?yàn)镃AS判斷的是指針的值。很明顯,值是很容易又變成原樣的。

比如上述的DeQueue()函數(shù),因?yàn)槲覀円宧ead和tail分開(kāi),所以我們引入了一個(gè)dummy指針給head,當(dāng)我們做CAS的之前,如果head的那塊內(nèi)存被回收并被重用了,而重用的內(nèi)存又被EnQueue()進(jìn)來(lái)了,這會(huì)有很大的問(wèn)題。(內(nèi)存管理中重用內(nèi)存基本上是一種很常見(jiàn)的行為)

這個(gè)例子你可能沒(méi)有看懂,維基百科上給了一個(gè)活生生的例子——

你拿著一個(gè)裝滿(mǎn)錢(qián)的手提箱在飛機(jī)場(chǎng),此時(shí)過(guò)來(lái)了一個(gè)火辣性感的美女,然后她很暖昧地挑逗著你,并趁你不注意的時(shí)候,把用一個(gè)一模一樣的手提箱和你那裝滿(mǎn)錢(qián)的箱子調(diào)了個(gè)包,然后就離開(kāi)了,你看到你的手提箱還在那,于是就提著手提箱去趕飛機(jī)去了。

這就是ABA的問(wèn)題。

解決ABA的問(wèn)題

維基百科上給了一個(gè)解——使用double-CAS(雙保險(xiǎn)的CAS),例如,在32位系統(tǒng)上,我們要檢查64位的內(nèi)容

  • 一次用CAS檢查雙倍長(zhǎng)度的值,前半部是值,后半部分是一個(gè)計(jì)數(shù)器。

  • 只有這兩個(gè)都一樣,才算通過(guò)檢查,要吧賦新的值。并把計(jì)數(shù)器累加1。

這樣一來(lái),ABA發(fā)生時(shí),雖然值一樣,但是計(jì)數(shù)器就不一樣(但是在32位的系統(tǒng)上,這個(gè)計(jì)數(shù)器會(huì)溢出回來(lái)又從1開(kāi)始的,這還是會(huì)有ABA的問(wèn)題)

當(dāng)然,我們這個(gè)隊(duì)列的問(wèn)題就是不想讓那個(gè)內(nèi)存重用,這樣明確的業(yè)務(wù)問(wèn)題比較好解決,論文《Implementing Lock-Free Queues》給出一這么一個(gè)方法——使用結(jié)點(diǎn)內(nèi)存引用計(jì)數(shù)refcnt?。ㄕ撐摹禨imple, Fast, and Practical Non-Blocking and Blocking ConcurrentQueue Algorithms》中的實(shí)現(xiàn)方法也基本上是一樣的,用到的是增加一個(gè)計(jì)數(shù),可以理解為版本號(hào))

SafeRead(q)
{
loop:
p=q->next;
if(p==NULL){
returnp;
}
Fetch&Add(p->refcnt,1);
if(p==q->next){
returnp;
}else{
Release(p);
}
gotoloop;
}

其中的 Fetch&Add和Release分是是加引用計(jì)數(shù)和減引用計(jì)數(shù),都是原子操作,這樣就可以阻止內(nèi)存被回收了。

用數(shù)組實(shí)現(xiàn)無(wú)鎖隊(duì)列

本實(shí)現(xiàn)來(lái)自論文《Implementing Lock-Free Queues》

使用數(shù)組來(lái)實(shí)現(xiàn)隊(duì)列是很常見(jiàn)的方法,因?yàn)闆](méi)有內(nèi)存的分部和釋放,一切都會(huì)變得簡(jiǎn)單,實(shí)現(xiàn)的思路如下:

  • 數(shù)組隊(duì)列應(yīng)該是一個(gè)ring buffer形式的數(shù)組(環(huán)形數(shù)組)

  • 數(shù)組的元素應(yīng)該有三個(gè)可能的值:HEAD,TAIL,EMPTY(當(dāng)然,還有實(shí)際的數(shù)據(jù))

  • 數(shù)組一開(kāi)始全部初始化成EMPTY,有兩個(gè)相鄰的元素要初始化成HEAD和TAIL,這代表空隊(duì)列。

  • EnQueue操作。假設(shè)數(shù)據(jù)x要入隊(duì)列,定位TAIL的位置,使用double-CAS方法把(TAIL, EMPTY) 更新成 (x, TAIL)。需要注意,如果找不到(TAIL, EMPTY),則說(shuō)明隊(duì)列滿(mǎn)了。

  • DeQueue操作。定位HEAD的位置,把(HEAD, x)更新成(EMPTY, HEAD),并把x返回。同樣需要注意,如果x是TAIL,則說(shuō)明隊(duì)列為空。

算法的一個(gè)關(guān)鍵是——如何定位HEAD或TAIL?

  • 我們可以聲明兩個(gè)計(jì)數(shù)器,一個(gè)用來(lái)計(jì)數(shù)EnQueue的次數(shù),一個(gè)用來(lái)計(jì)數(shù)DeQueue的次數(shù)。

  • 這兩個(gè)計(jì)算器使用使用Fetch&ADD來(lái)進(jìn)行原子累加,在EnQueue或DeQueue完成的時(shí)候累加就好了。

  • 累加后求個(gè)模什么的就可以知道TAIL和HEAD的位置了。

如下圖所示:

b05246d6-523c-11eb-8b86-12bb97331649.jpg

小結(jié)

以上基本上就是所有的無(wú)鎖隊(duì)列的技術(shù)細(xì)節(jié),這些技術(shù)都可以用在其它的無(wú)鎖數(shù)據(jù)結(jié)構(gòu)上。

  • 無(wú)鎖隊(duì)列主要是通過(guò)CAS、FAA這些原子操作,和Retry-Loop實(shí)現(xiàn)。

  • 對(duì)于Retry-Loop,我個(gè)人感覺(jué)其實(shí)和鎖什么什么兩樣。只是這種“鎖”的粒度變小了,主要是“鎖”HEAD和TAIL這兩個(gè)關(guān)鍵資源。而不是整個(gè)數(shù)據(jù)結(jié)構(gòu)。

還有一些和Lock Free的文章你可以去看看:

Code Project 上的雄文 《Yet another implementation of a lock-free circular array queue》

Herb Sutter的《Writing Lock-Free Code: A Corrected Queue》– 用C++11的std::atomic模板。

IBM developerWorks的《設(shè)計(jì)不使用互斥鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)》

責(zé)任編輯:xj

原文標(biāo)題:無(wú)鎖隊(duì)列的實(shí)現(xiàn)

文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11822

    瀏覽量

    219602
  • CAS
    CAS
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    15617

原文標(biāo)題:無(wú)鎖隊(duì)列的實(shí)現(xiàn)

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    IDT72V51233/72V51243/72V51253:多隊(duì)列流控設(shè)備的技術(shù)剖析與應(yīng)用指南

    IDT72V51233/72V51243/72V51253:多隊(duì)列流控設(shè)備的技術(shù)剖析與應(yīng)用指南 在電子設(shè)備設(shè)計(jì)中,高效的數(shù)據(jù)處理與傳輸一直是工程師們追求的目標(biāo)。今天,我將為大家深入剖析
    的頭像 發(fā)表于 04-12 09:40 ?455次閱讀

    RDMA設(shè)計(jì)43:隊(duì)列刪除及連接斷開(kāi)功能測(cè)試

    在接收到正確的刪除隊(duì)列請(qǐng)求后,首先進(jìn)入連接斷開(kāi)流程,即四次揮手?jǐn)噫?如圖中紅框部分。隨后進(jìn)行隊(duì)列刪除操作。返回隊(duì)列操作狀態(tài) 0x2b,符合設(shè)計(jì)預(yù)期,驗(yàn)證通過(guò)。
    的頭像 發(fā)表于 02-24 07:50 ?674次閱讀
    RDMA設(shè)計(jì)43:<b class='flag-5'>隊(duì)列</b>刪除及連接斷開(kāi)功能測(cè)試

    面試必看:排隊(duì)自旋之MCS實(shí)現(xiàn)原理與關(guān)鍵考點(diǎn)

    在并發(fā)編程面試中,“” 是繞不開(kāi)的核心話(huà)題,而自旋作為輕量級(jí)的代表,其優(yōu)化方案更是高頻考點(diǎn)。
    的頭像 發(fā)表于 02-09 16:51 ?867次閱讀
    面試必看:排隊(duì)自旋<b class='flag-5'>鎖</b>之MCS<b class='flag-5'>鎖</b>的<b class='flag-5'>實(shí)現(xiàn)</b>原理與關(guān)鍵考點(diǎn)

    RDMA設(shè)計(jì)25:隊(duì)列管理模塊之發(fā)送模塊詳細(xì)設(shè)計(jì)分析

    發(fā)送隊(duì)列存儲(chǔ)為所有發(fā)送隊(duì)列共用的存儲(chǔ)空間,根據(jù)用戶(hù)環(huán)境和開(kāi)發(fā)板環(huán)境不同可由 BRAM、URAM 或 LUTRAM 實(shí)現(xiàn)。發(fā)送隊(duì)列管理單元?jiǎng)t負(fù)責(zé)管理這個(gè)存儲(chǔ)空間,并處理用戶(hù)指令和發(fā)送
    的頭像 發(fā)表于 01-25 16:27 ?5500次閱讀
    RDMA設(shè)計(jì)25:<b class='flag-5'>隊(duì)列</b>管理模塊之發(fā)送模塊詳細(xì)設(shè)計(jì)分析

    RDMA設(shè)計(jì)26:隊(duì)列管理模塊設(shè)計(jì)之接收隊(duì)列模塊詳細(xì)分析

    本文主要交流設(shè)計(jì)思路,在本博客已給出相關(guān)博文100多篇,希望對(duì)初學(xué)者有用。注意這里只是拋磚引玉,切莫認(rèn)為參考這就可以完成商用IP設(shè)計(jì)。 (2)接收隊(duì)列 接收隊(duì)列由一個(gè)接收隊(duì)列管理單元組成。與發(fā)送
    發(fā)表于 01-22 09:03

    RDMA設(shè)計(jì)24:隊(duì)列管理模塊設(shè)計(jì)

    隊(duì)列管理模塊采用管理與存儲(chǔ)分離的結(jié)構(gòu)進(jìn)行設(shè)計(jì),由發(fā)送隊(duì)列存儲(chǔ)、發(fā)送隊(duì)列管理、接收隊(duì)列管理、完成條目解析、異常完成條目處理和 Round-Robin 仲裁組成。
    的頭像 發(fā)表于 01-20 11:45 ?1581次閱讀
    RDMA設(shè)計(jì)24:<b class='flag-5'>隊(duì)列</b>管理模塊設(shè)計(jì)

    看透微突發(fā):利用 INT 技術(shù)實(shí)現(xiàn)交換機(jī)隊(duì)列級(jí)的實(shí)時(shí)擁塞告警

    星融元開(kāi)發(fā)的 EasyRoCE-CMA 是基于 INT 技術(shù)的擁塞監(jiān)控工具 。它利用納秒級(jí)精度的 HDC 與 BDC 捕獲信息 ,實(shí)現(xiàn)交換機(jī)端口級(jí)擁塞與丟包的一站式可視化 。該工具能精準(zhǔn)定位故障根因,輔助 AI 智算網(wǎng)絡(luò)快速調(diào)優(yōu)
    的頭像 發(fā)表于 01-16 15:29 ?1417次閱讀
    看透微突發(fā):<b class='flag-5'>利用</b> INT <b class='flag-5'>技術(shù)</b><b class='flag-5'>實(shí)現(xiàn)</b>交換機(jī)<b class='flag-5'>隊(duì)列</b>級(jí)的實(shí)時(shí)擁塞告警

    RDMA設(shè)計(jì)17:隊(duì)列管理模塊設(shè)計(jì)2

    。 (2)接收隊(duì)列 接收隊(duì)列由一個(gè)接收隊(duì)列管理單元組成。與發(fā)送隊(duì)列類(lèi)似的是,接收隊(duì)列管理單元也由若干表單構(gòu)成,其中包括 RQ1 表單和用戶(hù)
    發(fā)表于 01-04 14:54

    MC74VHCT373A高速CMOS八路D型存器技術(shù)解析

    安森美 (onsemi) MC74VHCT373A存器是一款高速CMOS八路存器,具有三態(tài)輸出,采用硅柵極CMOS技術(shù)制造。這些D型存器的高速操作與等效雙極型SCHOTTKY T
    的頭像 發(fā)表于 11-22 14:06 ?1730次閱讀
    MC74VHCT373A高速CMOS八路D型<b class='flag-5'>鎖</b>存器<b class='flag-5'>技術(shù)</b>解析

    基于環(huán)形隊(duì)列的UART收發(fā)回顯實(shí)驗(yàn)

    問(wèn)題。在本實(shí)驗(yàn)中,我們使用環(huán)形隊(duì)列來(lái)實(shí)現(xiàn)實(shí)驗(yàn)1的串口收發(fā)回顯,將串口接收到的數(shù)據(jù)暫存在隊(duì)列中,待完成一次接收后再將隊(duì)列中的數(shù)據(jù)全部發(fā)出去。
    的頭像 發(fā)表于 10-27 13:51 ?2178次閱讀
    基于環(huán)形<b class='flag-5'>隊(duì)列</b>的UART收發(fā)回顯實(shí)驗(yàn)

    藍(lán)牙無(wú)感開(kāi)鎖模塊在智能柜/智能箱包上是如何應(yīng)用的?

    隨著智能硬件的快速普及和用戶(hù)對(duì)便捷性、安全性的持續(xù)追求,傳統(tǒng)鎖具正經(jīng)歷一場(chǎng)從“被動(dòng)防護(hù)”向“智能管理”的深度轉(zhuǎn)型。安朔科技基于藍(lán)牙BLE技術(shù)推出的手機(jī)綁定+無(wú)感開(kāi)鎖整體解決方案,專(zhuān)為智能柜與智能
    的頭像 發(fā)表于 09-04 16:13 ?1735次閱讀
    藍(lán)牙<b class='flag-5'>無(wú)</b>感開(kāi)鎖模塊在智能柜<b class='flag-5'>鎖</b>/智能箱包上是如何應(yīng)用的?

    好視角無(wú)源雙通道智能機(jī)柜

    的機(jī)柜門(mén)需求。其核心優(yōu)勢(shì)在于采用無(wú)源雙通道技術(shù),通過(guò)智能鑰匙同時(shí)實(shí)現(xiàn)非接觸與接觸開(kāi)關(guān),并有記錄。有效解決了數(shù)據(jù)中心、通信基站、變電站等特殊場(chǎng)景下不允許取電或布線(xiàn)成
    的頭像 發(fā)表于 08-07 11:12 ?969次閱讀
    好視角<b class='flag-5'>無(wú)</b>源雙通道智能機(jī)柜<b class='flag-5'>鎖</b>

    RabbitMQ消息隊(duì)列解決方案

    在現(xiàn)代分布式系統(tǒng)架構(gòu)中,消息隊(duì)列作為核心組件,承擔(dān)著系統(tǒng)解耦、異步處理、流量削峰等重要職責(zé)。RabbitMQ作為一款成熟的消息隊(duì)列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業(yè)的首選方案。本文將從運(yùn)維工程師的角度,詳細(xì)闡述RabbitMQ從單機(jī)部署到集群搭建的完
    的頭像 發(fā)表于 07-08 15:55 ?782次閱讀

    白城LP-SCADA工業(yè)產(chǎn)線(xiàn)高密度數(shù)據(jù)采集 實(shí)時(shí)響應(yīng)無(wú)滯后

    并行處理:支持10萬(wàn)+測(cè)點(diǎn)的并行接入與處理,應(yīng)用無(wú)隊(duì)列、內(nèi)存數(shù)據(jù)庫(kù)、時(shí)序數(shù)據(jù)庫(kù)、MQTT等核心技術(shù),內(nèi)置網(wǎng)絡(luò)、串口采樣模塊,支持高速數(shù)據(jù)采集。 多協(xié)議兼容性與自適應(yīng):支持各種工業(yè)通信
    發(fā)表于 06-19 14:51

    氮化鎵電源芯片U8722CAS打嗝模式實(shí)現(xiàn)噪音和紋波最優(yōu)化

    電源芯片U8722CAS采用了打嗝噪音優(yōu)化技術(shù),可自適應(yīng)的調(diào)節(jié)打嗝VSKIP_OUT的閾值,實(shí)現(xiàn)噪音和紋波的最優(yōu)化!氮化鎵電源芯片U8722CAS在輕載和空載狀態(tài)下
    的頭像 發(fā)表于 06-12 15:46 ?1241次閱讀
    氮化鎵電源芯片U8722<b class='flag-5'>CAS</b>打嗝模式<b class='flag-5'>實(shí)現(xiàn)</b>噪音和紋波最優(yōu)化
    和林格尔县| 淅川县| 确山县| 西峡县| 临汾市| 乌什县| 应城市| 大城县| 芜湖市| 石门县| 平舆县| 古蔺县| 宁陵县| 仪征市| 尚义县| 兴海县| 洛阳市| 清水河县| 兖州市| 扎鲁特旗| 汉阴县| 咸阳市| 普宁市| 邹平县| 武宁县| 商洛市| 泉州市| 石泉县| 稷山县| 闵行区| 漳浦县| 汨罗市| 荔浦县| 海口市| 万盛区| 阳春市| 临朐县| 古交市| 广元市| 临江市| 噶尔县|