VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
2017-10-21 11:23
357 查看
目录
目录前文列表
多线程注意事项
多线程中的 VixDiskLib
前文列表
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 上进行并发读取是不被允许的。
相关文章推荐
- VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
- VMware 虚拟化编程(1) — VMDK/VDDK/VixDiskLib/VADP 概念简析
- VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
- VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
- VMware 虚拟化编程(12) — VixDiskLib Sample 程序使用
- VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
- VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计
- VMware 虚拟化编程(11) — VMware 虚拟机的全量备份与增量备份方案
- ./vddk: error while loading shared libraries: libvixDiskLib.so.6
- Unix/Linux环境C编程入门教程(11) 开发环境搭建VMWare虚拟安装之虚拟化检测
- Unix/Linux环境C编程入门教程(11) 开发环境搭建VMWare虚拟安装之虚拟化检测
- VMware 虚拟化编程(4) — VDDK 安装
- VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
- VixDiskLib: Failed to load libvixDiskLibVim.so
- VMware 虚拟化编程(9) — VMware 虚拟机的快照
- VMware 虚拟化编程(14) — VDDK 的高级传输模式详解
- VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
- VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT
- VMware 虚拟化编程(15) — VMware 虚拟机的恢复方案设计
- 关于多线程编程您不知道的 5 件事