mpi阻塞型函式的死鎖

2021-07-10 21:06:49 字數 2307 閱讀 5863

1.

總會死鎖的情形

call mpi_comm_rank(comm, rank, ierr)

if (rank.eq.0) then

call mpi_recv(recvbuf, count, mpi_real, 1, tag, comm, status, ierr)

call mpi_send(sendbuf, count, mpi_real, 1, tag, comm, ierr)

else if( rank .eq. 1)

call mpi_recv(recvbuf, count, mpi_real, 0, tag, comm, status, ierr)

call mpi_send(sendbuf, count, mpi_real, 0, tag, comm, ierr)

end if

講解:程序0的第一條接收語句a能否完成取決於程序1的第二條傳送語句d,即a依賴於d,從執行次序上可以明顯地看出,程序0向程序1傳送訊息的語句c的執行又依賴於它前面的接收語句a的完成,即c依賴於a;同時,程序1的第一條接收語句b能否完成取決於程序0的第二條傳送語句c的執行,即b依賴於c,從執行次序上可以明顯地看出,向程序0傳送訊息的語句d的執行又依賴於b的完成,故有a依賴於d,而d又依賴於b,b依賴於c,c依賴於a,形成了乙個環,程序0和程序1相互等待,彼此都無法執行下去,必然導致死鎖。

圖7-1 總會死鎖的情形

2.可能死鎖的情形

call mpi_comm_rank(comm, rank, ierr)

if (rank.eq.0) then

call mpi_send(sendbuf, count, mpi_real, 1, tag, comm, ierr)                                   a

call mpi_recv(recvbuf, count, mpi_real, 1, tag, comm, status, ierr)                     c

else (rank .eq.1)

call mpi_send(sendbuf, count, mpi_reak, 0, tag, comm, status, ierr)                    b

call mpi_recv(recvbuf, count, mpi_real, 0, tag, comm, status, ierr)                      d

end if

圖7-2 可能死鎖的情形

由於程序0或程序1的傳送需要系統提供緩衝區(在mpi的四種通訊模式中有詳細的解釋),如果系統緩衝區不足,則程序0或程序1的傳送將無法完成,相應的,程序1和程序0的接收也無法正確完成。顯然對於需要相互交換資料的程序,直接將兩個傳送語句寫在前面也是不安全的。

說明:當程序0傳送的訊息長度超過緩衝區大小時,要等到全部訊息傳送完成函式才能返回,在這種情況下,a的完成依賴於d的成功接收,而d的呼叫依賴於b的完成,b傳送訊息要等到c成功接收,而c的呼叫依賴於a的完成,從而造成彼此依賴,陷入死鎖。

3.可以避免死鎖的情形

call mpi_comm_rank(comm, rank, ierr)

if (rank.eq.0) then

call mpi_send(sendbuf, count, mpi_real, 1, tag, comm, ierr)

call mpi_recv(recvbuf, count, mpi_real, 1, tag, comm, status, ierr)

else (rank .eq. 1)

call mpi_recv(recvbuf, count, mpi_real, 0, tag, comm, status, ierr)

call mpi_send(sendbuf, count, mpi_real, 0, tag, comm, ierr)

end if 

圖7-3 可以避免死鎖的情形

c的完成只需要a完成,而a的完成只要有對應的d存在,則不需要系統提供緩衝區也可以進行,這裡恰恰滿足這樣的條件,因此a總能夠完成,因此d也一定能完成。當a和d完成後,b的完成只需要相應的c,不需要緩衝區也能完成,因此b和c也一定能完成,所以說這樣的通訊形式是安全的。顯然a和c,d和b同時互換,從原理上說和這種情況是一樣的,因此也是安全的。

SQL Server的阻塞 死鎖問題

通過 sysprocesses 簡單查詢死鎖及解決死鎖辦法 簡單查詢死鎖,如下四步可以輕鬆解決 第一步 查詢死鎖語句 1 條件是 blocked 0 select dbid,from sys.sysprocesses where 1 1 and spid 50 and blocked 0 and s...

鎖的阻塞,死鎖,鎖公升級

因為不同鎖之間的相容性關係,所以在有些時刻,乙個事務中的鎖需要等待另乙個事務中的鎖釋放它所占用的資源。在innodb儲存引擎的源 中,用mutex資料結構來實現鎖。在訪問資源前需要用mutex enter函式進行申請,在資源訪問或修改完畢後立即執行mutex exit函式 當乙個資源已被乙個事務占有...

函式的過載與泛型函式

include iostream using namespace std template 泛型設計 void print elemtype pbegin,elemtype pend 函式的過載 void print int pbegin,int pend void print char pbegi...