我是计算机科学课程的助教,我遇到了一个有趣的问题。最近的一项任务涉及pthreads的同步技术。学生必须使用互斥锁,障碍,条件变量等避免死锁......每个学生在VMWare虚拟机上运行相同版本的Ubuntu(根据系统的不同,可以是Workstation或Fusion)。显然,每个学生的主持OS可能不同。
现在这里有一个令人困惑的部分:一些学生的同步行为与我在运行程序时看到的非常不同。对于一些学生,我可能会执行她的任务并立即看到死锁。然而,当她在家里跑步时,她永远不会陷入僵局。
根据我的理解,死锁行为似乎只取决于客户操作系统的调度程序。主机操作系统应该与此无关。然而,即使我们都拥有相同的客户操作系统,问题仍然存在。有没有人知道为什么会这样?
谢谢!
答案 0 :(得分:3)
听起来学生有一个非确定性的死锁。这很常见 - 基本上有一个小窗口,代码可能会死锁,但除此之外应用程序运行正常。她很幸运,但你没有。
小的调度时间可能是罪魁祸首---您的CPU可能具有不同的时钟速度,不同的内核数量,或不同的后台负载等等,这足以改变调度。
这实际上是一个经典的问题---多线程代码在测试环境中运行良好但在生产环境中遇到问题,因为竞争条件从未在测试中表现出来。
答案 1 :(得分:1)
我将假设您的虚拟机配置为仅使用一个虚拟核心,以便可以在任何主机上运行。如果是这样,你可以假设客户操作系统的调度程序负责学生任务的每个先发制人。
但是,调度程序本身受其运行的硬件平台的影响很大。不同的系统将更快或更慢地运行客户操作系统,或产生需要不同时间来处理或模拟的硬件中断。所有这些都会影响来宾操作系统的调度决策。
我非常喜欢您如何分发VM以确保每个人都具有相同的开发和运行时环境。但是,仅仅因为每个人都拥有相同的软件并不意味着他们会看到相同的行为。
答案 2 :(得分:0)
您还需要考虑主机本身。我曾经遇到过相同CPU的情况(我认为),但英特尔芯片组版本略有不同。这意味着在一个VM中,任务切换寄存器在KVM中进行了优化,而另一个KVm无法进行优化。这导致了来宾中看似相同的虚拟机和主机的不同时间。
另请注意,主持人可能会在不同时间运行页面共享流程或任何其他可能会改变访客时间的内容。
在valgrind下运行guest虚拟机线程程序会很有趣。由于速度非常慢,因此通常会在线程应用程序中弹出计时问题。