Все эти ответы работают в некоторых случаях, но не работают в других.
Например, вы можете полагаться на dmesg
, в то время как данные журнала загрузки все еще находятся в кольцевом буфере, но, скорее всего, это приведет к ошибке на машине, которая работала в течение любого периода времени. Что еще хуже, операционная система без ОС может записать в журнал сообщение о работающем гипервизоре, и в этом случае наивный тест вроде dmesg | grep -i vmware
вернет ложное срабатывание.
Тестирование в Docker совсем другое. Docker не имеет собственного / proc / cpuinfo
; вместо этого он передает информацию о хост-машине. Между тем, dmidecode
не может прочитать каталог / dev / mem
, невидимый Docker.
virt-what
имеет обнаружение контейнеров Docker, но требует исправления, чтобы справиться с недавним изменением привилегий контейнера. Он вылетает при попытке доступа к / proc / 1 / окружающая среда
до того, как достигает тестов для Docker.
Важно обратить внимание на virt-what
caveat emptor:
В большинстве случаев использование этой программы является неправильным. Вместо этого вы должны определить конкретные функции, которые вы действительно хотите использовать.
В моем случае, когда я публикую учебник, который устанавливает тонну дерьма, пользователи могут не захотеть этого, я отказываюсь запускать его на голом железе с помощью этого теста:
[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;
Примечание : Я понимаю, что OP спрашивает конкретно о VMWare в теле вопроса, но название вопроса привлечет многих читателей (таких как я), ищущих более общий случай.
В тексте сказано, что когда нет выбора,
A new process (if one exists in the ready queue) must be selected for execution.
Я понимаю, что это означает, что обсуждаемый выбор касается не того, какой процесс запланировать следующим, а того, можно ли запланировать исследуемый процесс. В случаях 1 и 4 нельзя. В случаях 2 и 3 можно.
Используемая здесь терминология «кооперативный» и «упреждающий» кажется мне странной; совместное планирование обычно означает, что процессы добровольно передают управление, но интерпретация «блокировки» и «прекращения» как совместного планирования несколько надуманная -, на мой взгляд.
В случаях 1 и 4 процессу нечего делать (в случае 1 еще, а в случае 4 когда-либо )и, следовательно, он не может быть запущен планировщиком. т. е. нет выбора :бежать или не бежать... всегда не бежать. В случаях 2 и 3 есть выбор, потому что планировщик должен решить: «Я запускаю этот процесс или другой?» Но только упреждающий планировщик сделает этот выбор, кооперативный планировщик будет ждать, пока запущенный процесс не перейдет в состояние 1 (, т.е. ожидание ввода-вывода или выдачи )или 4 (, завершение либо успешно, либо с ошибкой)