Поведение синхронизации потоков в VMWare с одной и той же гостевой ОС, другой хост-системой - PullRequest
2 голосов
/ 07 марта 2011

Я учусь на курс по информатике и столкнулся с интересной проблемой. Недавнее назначение включало методы синхронизации для pthreads. Студенты должны были избегать взаимных блокировок, используя мьютексы, барьеры, условные переменные и т. Д. Каждый учащийся использует одну и ту же версию Ubuntu на виртуальной машине VMWare (либо Workstation, либо Fusion, в зависимости от их системы). Очевидно, что ОС хоста может отличаться для каждого студента.

Теперь вот запутанная часть: поведение синхронизации у некоторых студентов сильно отличается от того, что я вижу, когда запускаю их программу. Для некоторых студентов я могу выполнить ее задание и сразу увидеть тупик. Однако, когда она запускает его дома, она никогда не заходит в тупик.

Насколько я понимаю, поведение взаимоблокировки зависит только от планировщика гостевой ОС. ОС хоста не должна иметь к этому никакого отношения. Тем не менее, несмотря на то, что у нас у всех одинаковые гостевые ОС, проблема сохраняется. Кто-нибудь знает, почему это может быть?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

Похоже, у студента недетерминированный тупик.Это очень часто - в основном есть небольшое окно, где код может зайти в тупик, но в противном случае приложение работает нормально.Ей повезло, но у вас нет.

Небольшие тайминги планирования могут быть причиной - у вашего ЦП может быть другая тактовая частота, или другое количество ядер, или другая фоновая загрузка, или что-то ещеи этого достаточно, чтобы изменить расписание.

Это на самом деле классическая проблема - многопоточный код работает нормально в тестовой среде, но сталкивается с проблемами в производственной среде из-за условий гонки, которые просто никогда не проявлялись при тестировании.

1 голос
/ 07 марта 2011

Я предполагаю, что ваша виртуальная машина настроена на использование только одного виртуального ядра, чтобы ее можно было запускать на любой хост-машине. Если это так, вы правы, если предположите, что планировщик гостевой ОС отвечает за каждое упреждение задания ученика.

Однако на сам планировщик сильно влияет аппаратная платформа, на которой он работает. Разные системы будут запускать гостевую ОС быстрее или медленнее, или создавать аппаратные прерывания, которые обрабатывают или эмулируют разное количество времени. Все это повлияет на решения по планированию гостевой ОС.

Мне очень нравится, как вы распределяете виртуальную машину, чтобы убедиться, что у всех одинаковая среда разработки и среда выполнения для назначения. Однако то, что у всех одинаковое программное обеспечение, не означает, что они будут видеть одинаковое поведение.

0 голосов
/ 26 августа 2014

Вам также необходимо учитывать сам хост.У меня был случай идентичных процессоров (я думал), но у меня была немного другая версия чипсета Intel.Это означало, что в одной виртуальной машине регистр переключения задач был оптимизирован в KVM, а в другой KVm оптимизировать не удалось.Это приводило к тому, что в гостевой системе время для идентичных виртуальных машин и хостов различалось.

Также имейте в виду, что хост может запускать процессы совместного использования страниц или любое другое число в разное время, что может изменить время в гостевой системе..

Может быть весело запускать вашу программу гостевого потока под valgrind.Поскольку это очень медленно, проблемы с синхронизацией часто появляются в многопоточных приложениях.

...