Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор ДВК (http://zx-pk.ru/showthread.php?t=18351)

Patron 5th January 2014 15:58

Quote:

Originally Posted by Titus (Post 658499)
Чего-то мне кажется, что это вообще достаточно медленная концепция.

Это с непривычки.

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

Чтобы при многопоточной эмуляции быстродействие с блокировками было ниже, чем при однопоточной без блокировок - код блокировки должен суммарно выполняться дольше, чем код эмуляции - тогда удвоенное быстродействие двух физических ядер будет "убито" непрерывно выполняющимся кодом блокировок. Если код блокировок будет "отъедать" ровно столько же процессорного времени хост-машины, сколько и код эмуляции - быстродействие многопоточной эмуляции будет РАВНО быстродействию однопоточной. Во всех остальных случаях многопоточная эмуляция будет быстрее.

Titus 5th January 2014 16:21

Quote:

Originally Posted by Patron (Post 658506)
Это с непривычки.

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

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

Patron 5th January 2014 16:34

Quote:

Originally Posted by Titus (Post 658509)
Для точной потактовой эмуляции это неподходящий вариант вообще

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

Titus 5th January 2014 16:42

Quote:

Originally Posted by Patron (Post 658514)
Точнее - для максимальной синхронности виртуального времени. Ведь у каждого процессора может быть своя тактовая частота, поэтому привязка должна идти не к тактам, а к виртуальному времени.

Нет, привязка должна быть к единому тактовому источнику эмулируемой системы. Если кварцев несколько, то этоможно аппроксимировать тоже одним источником, но со специально введенными дополнительными дробными погрешностями, для точной эмитации биения частот кварца. Как, например, у меня в EmuStudio. Один процессор 8.0001МГц (можно любые дробные тайминги поставить), второй 6.25МГц.

Patron 5th January 2014 16:54

Quote:

Originally Posted by Titus (Post 658517)
привязка должна быть к единому тактовому источнику эмулируемой системы

Это и есть "виртуальное время". В модульном API события привязываются к виртуальному времени с точностью 1 нс ( т.е. единый тактовый источник эмулируемой системы имеет частоту 1 ГГц ).

Titus 5th January 2014 16:56

Quote:

Originally Posted by Patron (Post 658518)
Это и есть "виртуальное время". В модульном API события привязываются к виртуальному времени с точностью 1 нс ( т.е. единый тактовый источник эмулируемой системы имеет частоту 1 ГГц ).

И как при этом работают два процессора (допустим ВМ2) в разных потоках, разделяя одну шину?
Пример, по шагам, как они взаимодействуют?

Patron 5th January 2014 17:12

Quote:

Originally Posted by Titus (Post 658520)
И как при этом работают два процессора (допустим ВМ2) в разных потоках, разделяя одну шину?
Пример, по шагам, как они взаимодействуют?

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

Titus 5th January 2014 17:20

Quote:

Originally Posted by Patron (Post 658525)
Лучше им никак не взаимодействовать, потому что у каждого потока своё виртуальное время и рассинхронизация виртуального времени двух потоков может достигать 15 мс, а любая синхронизация требует "усыпления" опережающего потока.

А по сути (если это, например, УКНЦ) они постоянно взаимодействуют с общим ресурсом - чипсетом.

---------- Post added at 16:20 ---------- Previous post was at 16:16 ----------

Quote:

Originally Posted by Patron (Post 658525)
может достигать 15 мс

Кстати, почему 15мс, если минимальный квант переключения задач под виндой 1мс?

Patron 5th January 2014 17:25

Quote:

Originally Posted by Titus (Post 658527)
А по сути (если это, например, УКНЦ) они постоянно взаимодействуют с общим ресурсом - чипсетом.

Для такого варианта многопоточная эмуляция не очень подходит.

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

Например, когда ДВК запускает программу пользователя в КМД - единственный способ для реальной ДВК определить, когда реальный КМД завершит выполнение программы пользователя - это дождаться бита готовности в регистре статуса КМД ( или соответствующего прерывания ). В такой ситуации частичная несинхронность многопоточной эмуляции совершенно незаметна и на общую достоверность эмуляции никак не влияет.

Titus 5th January 2014 17:29

Quote:

Originally Posted by Patron (Post 658530)
В такой ситуации частичная несинхронность многопоточной эмуляции совершенно незаметна и на общую достоверность эмуляции никак не влияет.

Но это все же не 100% точная эмуляция)


All times are GMT +4. The time now is 02:58.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.