VMware虛擬化程式設計(8)—多執行緒中的VixDiskLib

範桂颶發表於2017-10-21

目錄

前文列表

VMware 虛擬化程式設計(1) — VMDK/VDDK/VixDiskLib/VADP 概念簡析
VMware 虛擬化程式設計(2) — 虛擬磁碟檔案型別詳解
VMware 虛擬化程式設計(3) —VMware vSphere Web Service API 解析
VMware 虛擬化程式設計(4) — VDDK 安裝
VMware 虛擬化程式設計(5) — VixDiskLib 虛擬磁碟庫詳解之一
VMware 虛擬化程式設計(6) — VixDiskLib 虛擬磁碟庫詳解之二
VMware 虛擬化程式設計(7) — VixDiskLib 虛擬磁碟庫詳解之三

多執行緒注意事項

如果你的應用程式是多執行緒實現,那麼你應該將 VMDK 操作的請求序列化。通過 VixDiskLib_Open 獲取的磁碟控制程式碼 diskHandle 並不會繫結到單個執行緒,而是能夠跨執行緒使用。也就是說,你可以在一個執行緒中開啟磁碟,然後在其他執行緒中使用該磁碟的控制程式碼來進行其他的磁碟操作,但前提是你 必須序列化磁碟操作請求否則在併發的場景中,必定會造成磁碟操作物件混亂的後果。

多執行緒中的 VixDiskLib

首先可以確定的是,VDDK 支援到多個 VMDK File 的併發 I/O。但存在著以下限制:

  • VixDiskLib_InitEx or VixDiskLib_Init 只能被每個程式中的主執行緒呼叫一次。

  • VixDiskLib_InitEx or VixDiskLib_Init 的回撥日誌函式引數不能指定為 NULL。VixDiskLib 提供的預設日誌函式是執行緒非安全的。在多執行緒環境中,必須提供自己實現的的執行緒安全日誌函式。

  • 在呼叫 VixDiskLib_Open 或 VixDiskLib_Close() 時,VDDK 會分別進行或取消多個 lib 庫的初始化。這使得在多執行緒環境中,可能會導致一些需要初始化環境的 lib 庫不能生效。EXAMPLE:這會使 diskhandle2 的某些磁碟操作失敗。

Thread 1: VixDiskLib_Open ...... VixDiskLib_Close
Thread 2: ................................... VixDiskLib_Open ...... VixDiskLib_Close

解決該問題的辦法就是,使用一個指定的執行緒管理所有的 Open 和 Close 操作,而讓其他的執行緒進行 Read 或 Writes 等操作。EXAMPLE:

Open/Close Thread:
VixDiskLib_Open ...... VixDiskLib_Open ...... VixDiskLib_Close ...... VixDiskLib_Close ......
(handle1)              (handle2)              (handle1)               (handle2)
I/O Thread 1:
(owns handle1)    VixDiskLib_Read ... VixDiskLib_Read ...
I/O Thread 2:
(owns handle2)                                VixDiskLib_Read ... VixDiskLib_Read ...

該圖顯示了兩個獨立 diskHandle 上的併發讀取,需要注意的是,在同一個 diskHandle 上進行併發讀取是不被允許的。


相關文章