Эмуляция нескольких ОС Подсистемы окружения операционной
системы NT реализованы как системы типа клиент/сервер. Как часть процесса компиляции,
прикладные программы прикрепляются на этапе компоновки к API операционной системы,
который экспортируют подсистемы окружения ОС NT . Связывание на этапе компоновки
подключает прикладную программу к клиентским DLLs подсистем окружения, которые
осуществляют экспорт API. Например, Win32 программа - это клиент подсистемы окружения
Win32, поэтому она связана с клиентскими DLL Win32, включая Kerael32.dll, gdi32.dll,
и user32.dll. Программа POSIX связана с клиентской DLL POSIX - psxdll.dll.
Клиентские DLL выполняют задачи от имени их серверов, но они выполняются, как
часть клиентского процесса. Как показано рис. 1, в некоторых случаях пользовательская
DLL может полностью реализовывать API без необходимости обращения к помощи сервера;
в других случаях сервер должен помочь. Помощь сервера обычно необходима только
когда должна быть модифицирована общая информация, связанная с подсистемой окружения.
Когда пользовательская DLL требует помощи от сервера, DLL посылает сообщение,
известное, как вызов локальной процедуры (LPC) на сервер. Когда сервер завершает
указанный запрос и возвращает ответ, DLL может завершить функцию и возвратить
управление клиенту. И пользовательская DLL и сервер могут использовать «родной»
API, когда это необходимо. API подсистем окружения дополняют «родной» API специфическими
функциональными возможностями или семантикой. 
Рис. 1 |