Для виртуальной машины все виртуально, включая время.Например, за 123 реальных секунды вы можете эмулировать 5432 виртуальных секунды обработки.Распространенным способом измерения виртуального времени является увеличение (или добавление чего-либо) счетчика «число циклов» каждый раз, когда эмулируется виртуальная инструкция.
Время от времени вы пытаетесь синхронизировать виртуальное время св реальном времениЕсли виртуальное время слишком сильно опережает реальное, вы вводите задержку, чтобы реальное время наверстывало.Если виртуальное время отстает от реального времени, то вам нужно найти какой-то повод для замедления.В зависимости от эмулируемой архитектуры вы можете ничего не делать;но для некоторых архитектур есть функции управления питанием, такие как термическое регулирование (например, вы можете притвориться, что виртуальный ЦП перегрелся и работает медленнее, чтобы остыть).
Вы также, вероятно, хотите иметь очередь событий, где разныеэмулированные устройства могут сказать «в определенное время произойдет какое-то событие»;так что если эмулируемый ЦП находится в режиме ожидания (в ожидании события), вы можете перейти к следующему событию.Это обеспечивает естественный способ догнать виртуальную машину, если она работает медленно.
Следующий шаг - определить места, где имеет значение время, и синхронизировать только виртуальное время с реальным временем в этих конкретных местах.Если эмулируемая машина выполняет тяжелую обработку и не делает ничего, что является видимым для внешнего наблюдателя, то внешний наблюдатель не может определить, приближено ли виртуальное время к реальному времени или нет.Когда виртуальная машина делает что-то, что видно внешнему наблюдателю (например, отправляет сетевой пакет, обновляет видео / экран, издает звук и т. Д.), Вы сначала синхронизируете виртуальное время с реальным временем.
Шагкроме того, используется буферизация для разделения, когда что-то происходит внутри эмулятора, когда они видны внешнему наблюдателю.В качестве (преувеличенного) примера представьте, что эмулируемая машина думает, что сейчас 8:23 утра, и она хочет отправить сетевой пакет, но на самом деле это только 8:00 утра.Простое решение - отложить эмуляцию на 23 минуты и затем отправить пакет.Это звучит хорошо, но если (после того, как виртуальная машина отправит пакет), эмулятор изо всех сил пытается не отставать от реального времени (из-за других процессов, запущенных на реальном компьютере или по любой другой причине), эмулятор может отстать, и у вас могут возникнуть проблемы с обслуживаниемиллюзия, что виртуальное время совпадает с реальным временем.В качестве альтернативы вы можете сделать вид, что пакет был отправлен, поместить пакет в буфер и продолжить эмуляцию других вещей, а затем отправить пакет позже (когда на самом деле в реальном времени это 8:23 утра).В этом случае, если (после того, как виртуальная машина отправит пакет), эмулятор изо всех сил пытается не отставать от реального времени, у вас все еще есть 23 минуты свободного времени.