shell 指令後加 後沒有實現併發原因分析

2021-10-03 12:33:13 字數 1146 閱讀 6578

復現程式

#!/bin/bash

cd /tmp

fallocate -l 256m  disk

mkfs.ext4 disk

nbd-server 8000 /tmp/disk

nbd-client -d /dev/nbd0

nbd-client localhost 8000 /dev/nbd0

sleep 1s

nbd-client -d /dev/nbd0 &             #後台執行,讓第二次connect立即開始

nbd-client localhost 8000 /dev/nbd0

rm -f disk

第二次connect並沒有在disconnect阻塞期間就開始執行,為什麼?

測試用例本身沒有問題,是disconnect這個程序中持有資源,然後connect程序正好需要這個資源,所以導致connect這個程序必須等待disconnect程序結束之後才可以執行。

具體的**分析如下;

建立連線會呼叫:nbd_genl_connect

斷開連線胡呼叫:nbd_genl_disconnect

driver/block/nbd.c中:

//建立連線和斷開連線都是同乙個doit,都在genl_family_rcv_msg被呼叫,

2100 static const struct genl_ops nbd_connect_genl_ops = ,

2106     ,

2111     ,

2116     ,  

2121 };

net/netlink/genetlink.c

genl_rcv_msg

genl_family_rcv_msg

err = ops->doit(skb, &info);

net/netlink/genetlink.c中

641 static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,

642             struct netlink_ext_ack *extack)

643

沒有atomic h後如何在linux實現原子操作

2017 04 22更新 gcc 4.7 開始支援c 11的記憶體一致性模型,提供了 atomic 系列函式,可以替代原有的 sync 系列。在訪存行為上,更為清晰,推薦使用。2011 09 06更新 需要使用atomic add return函式,發現編譯時找不到該函式的入口,閱讀iatomic....

沒有atomic h後如何在linux實現原子操作

2010 12 30更新 今天同事告訴我說有個 usr include alsa iatomic.h,也能實現原子操作,使用的時候 include就可以了,原有的atomic系列函式這裡都有,不過我還沒試過。正文 在linux2.6.18之後,刪除了和,gcc提供了內建的原子操 作函式,更適合使用者...

CPU加電後第一條指令

當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不太穩定,主機板上的控制晶元組會向cpu發出並保持乙個reset 重置 訊號,讓 cpu內部自動恢復到初始狀態,但cpu在此刻不會馬上執行指令。當晶元組檢測到電源已經開始穩定供電了 當然從不穩定到穩定的過程只是一瞬間的事情 它便撤去r...