Архитектура Microsoft Windows для разработчиков

лодочный мотор электрический купитьдоминатор спрей, mail


Занятие 2. Архитектура Windows

(Продолжительность занятия 105 минут)

Понимание архитектуры системы — основа практических навыков разработки приложений. На этом занятии Вы познакомитесь с ключевыми аспектами архитектуры Windows, определяющими функциональность и производительность операционной системы.

 
Изучив материал этого занятия, Вы сможете:

  • как Windows 95 и Windows NT выполняют программный код;
  • как Windows 95 и Windows NT реализуют вытесняющую многозадачность;
  • как Windows 95 и Windows NT управляют памятью;
  • сходства и различия выполнения приложений в Windows 95 и Windows NT;
  • как драйверы устройств обеспечивают независимость от аппаратуры;
  • приемущества применения API Win32 при разработке приложений;
  • назначение и структуру реестра Windows.

Как Windows выполняет программный код

Операционная система Windows для поддержки своей эффективности и целостности использует два режима: пользователя и ядра. Архитектура процессора Intel 80386 и следующих моделей определяет четыре уровня привилегий, называемых кольцами, для защиты кода и данных системы от случайного или преднамеренного изменения со стороны менее привилегированного кода. Такой метод выполнения кода называется моделью защиты Intel.

Уровень привилегий 0, известный как режим ядра, максимальный. Уровень привилегий 3, или режим пользователя, — минимальный. Когда код выполняется на некотором уровне привилегий, говорят, что он выполняется в соответствующем кольце. Операционные системы семейства Windows используют только кольца 0 и 3 (рис. 1.2).

1-4.jpg

Рис. 1.2 Кольца 0 и 3 в модели защиты Intel

Режим ядра

Режим ядра (кольцо 0) — это наиболее привилегированный режим. Работая в нем, код имеет прямой доступ ко всей аппаратуре и всему адресному пространству.

Программное обеспечение, выполняющееся в режиме ядра:

  • имеет прямой доступ к аппаратному обеспечению;
  • имеет доступ ко всей памяти компьютера;
  • не может быть вытеснено в страничный файл на жестком диске;
  • выполняется с большим приоритетом, чем процессы режима пользователя.

В частности, в кольце 0 выполняется код ядра операционных систем Windows 95 и Windows NT. Поскольку компоненты режима ядра защищены архитектурно, процессор предотвращает их изменение другой программой. Хотя кольцо 0 предоставляет максимальную защиту, не следует запускать в кольце 0 что попало — ведь компоненты этого режима имеют доступ ко всей системе. Если программный компонент в режиме ядра потерпит крах, это может разрушить всю систему.

Поскольку одна из задач Windows 95 — максимальная обратная совместимость, многие старые 16-разрядные драйверы и приложения используют прямой доступ к аппаратуре. Windows NT не предоставляет таким приложениям требуемый уровень доступа, поэтому зачастую они не могут работать под управлением Windows NT Workstation и Windows NT Server.

Режим пользователя

Режим пользователя предоставляет меньше привилегий, нежели режим ядра, — в частности, он не обеспечивает прямой доступ к аппаратуре. Код, выполняющийся в кольце 3, ограничен выделенным ему адресным пространством, а для вызова системных сервисов использует интерфейс прикладного программирования (API) Windows.

Процессы режима пользователя характеризуются следующими особенностями.

  • Не имеют прямого доступа к аппаратуре.

    Это защищает систему от неисправных приложений или неавторизованного доступа.

  • Ограничены выделенным им адресным пространством.

    Таким образом операционная система обеспечивает свою целостность. Процессу выделяется определенная область адресов и запрещено выходить за эту область.

  • Могут быть вытеснены из физической памяти в виртуальную память на жестком диске.

    Механизм виртуальной памяти позволяет использовать пространство на жестком диске как дополнительное ОЗУ. О виртуальной памяти подробно рассказано чуть позже в этой главе.

  • Выполняются с меньшим приоритетом, чем компоненты режима ядра.

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

Многозадачность

Прежде чем продолжить занятие, запустите видеоролик Chap01a.exe с компакт-диска. Этот видеоролик познакомит Вас с многозадачностью.

Многозадачность — способность операционной системы выполнять более одной программы (задачи) одновременно. Противоположный подход — однозаачность, когда один процесс должен быть завершен прежде, чем сможет начаться другой. MS-DOS — пример однозадачной среды, a Windows 95 и Windows NT — многозадачные среды.

Конечно же, и в многозадачной системе программы не выполняются одновременно — процессор переключается между ними. Благодаря этому Вы можете выполнить запрос к базе данных и продолжить работу с редактором текстов до тех пор, пока не появятся результаты запроса. Многозадачность, кроме того, позволяет компьютеру эффективно использовать время, которое иначе было бы потеряно в ожидании команды пользователя или ответа устройств ввода/вывода.

Для понимания многозадачности необходимо сначала познакомиться с процессами и потоками.

Процессы и потоки

Приложение, разработанное для Windows, состоит из одного или более процессов (рис. 1.3). Процесс — это, попросту говоря, выполняемая программа. Ему принадлежат адресное пространство и выделенные ресурсы, а также один или более потоков, выполняющихся в его контексте.

Поток — это основная единица, которой операционная система выделяет процессорное время, и минимальный «квант» кода, который может быть запланирован для выполнения. Кроме того, это часть процесса, выполняющаяся в каждый момент времени. Поток работает в адресном пространстве процесса и использует ресурсы, выделенные процессу.

1-6.jpg

Рис. 1.3 Приоритеты потоков

Любой процесс содержит хотя бы один поток. Каждый процесс 16-разрядного Windows-приложения или программы MS-DOS имеет только один поток, тогда как процессы 32-разрядных Windows-приложений могут включать их несколько.

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

> Изучение работы потоков

  1. Завершите все работающие программы.
  2. В меню Start выберите пункты Programs, Accessories, System Tools, System Monitor.

    Будет запущен System Monitor.

  3. В меню Edit щелкните команду Remove Item.
  4. Выделите все ранее добавленные элементы и щелкните ОК.

    График очистится.

  5. В меню View щелкните Numeric Charts.
  6. В меню Edit щелкните Add Item.
  7. Из списка Category выберите пункт Kernel, из списка Item выберите пункт Threads, а затем щелкните кнопку ОК.

    Сколько потоков активно?

    ответ

  8. В меню Start выберите пункты Programs, Accessories, WordPad.
  9. Переключитесь на System Monitor.

    Сколько потоков активно?

    ответ

  10. На панели инструментов WordPad щелкните кнопку Open.
  11. Переключитесь в окно System Monitor и несколько секунд понаблюдайте за окном KerneL:Threads.

    Сколько потоков активно?

    ответ

  12. Закройте диалоговое окно Open приложения WordPad и завершите работу с ним.
  13. Переключитесь в окно System Monitor.

    Число потоков должно стать равным первоначальному значению.

  14. В меню Start выберите Programs, MS-DOS Prompt.
  15. Переключитесь в окно System Monitor.

    Сколько потоков активно?

    ответ

Почему окно MS-DOS породило два потока?

> Изучение работы многопоточного приложения

  1. Из папки WA\Practice\Ch01 запустите демонстрационную многопоточную про грамму Winbezmt.exe.
  2. Переключитесь в окно System Monitor.

    Сколько потоков активно?

    ответ

  3. Переключитесь на многопоточную демонстрационную программу.
  4. В меню Bezier выберите Add Thread (или нажмите клавиши CTRL+T).
  5. Переключитесь в окно System Monitor.

    Сколько потоков активно?

    ответ

  6. Добавьте еще два потока. Сколько теперь активных потоков?
  7. Завершите работу со всеми программами, включая System Monitor.

Вытесняющая и кооперативная многозадачность

Прежде чем продолжить занятие, запустите видеоролик Chap01b.exe с прилагаемого к книге компакт-диска. В нем сравниваются вытесняющая и кооперативная многозадачность и объясняется, как реализуется многозадачность в отношении MS-DOS-, 16- и 32-разрядных Windows-приложений.

Существуют два типа многозадачности: кооперативная (не вытесняющая) и вытесняющая (рис. 1.4). В кооперативной многозадачной среде (например, Windows 3.1) контроль над процессором никогда не отбирается у задачи — приложение должно самостоятельно отказаться от контроля над процессором, чтобы другое приложение заработало.

Вытесняющая многозадачность отличается от кооперативной тем, что операционная система может получить контроль над процессором без согласия выполняющегося приложения. Лишение приложения контроля над процессором называется вытеснением. Windows 95 и Windows NT используют вытесняющую многозадачность для MS-DOS и 32-разрядных Windows-приложений.

1-8.jpg

Рис.1.4 Вытесняющая и кооперативная многозадачность

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

Windows NT применяет вытесняющую многозадачность при выполнении 16-разрядных приложений Windows и MS-DOS. Windows NT обеспечивает полную защиту памяти 16-разрядных приложений, так как каждое из них выполняется в рамках собственной виртуальной машины. Windows 95, напротив, использует кооперативную многозадачность для всех 16-разрядных приложений — это необходимо для сохранения совместимости с 16-разрядными Windows-программами, которые сами контролируют свое выполнение.

Планирование

С помощью планирования операционная система определяет, какой поток использует процессор в данный момент времени. Windows реализует многозадачность, присваивая каждому потоку приоритет, что позволяет ему использовать ресурсы системы. Планирование основано на заранее заданной единице времени, называемой квантом. Фактическая продолжительность кванта времени зависит от конфигурации системы. Уровни приоритета находятся в диапазоне от 0 (наименьший приоритет) до 31 (наибольший приоритет). Поток с наибольшим приоритетом получает процессор в свое распоряжение (рис. 1.5).

1-9.jpg

Рис. 1.5 Процесс планирования

Приоритет каждого потока определяется по:

  • классу приоритета процесса, которому принадлежит поток;
  • уровню приоритета потока внутри класса приоритета его процесса.

Классы приоритетов

Класс приоритета процесса и уровень приоритета потока определяют базовый приоритет потока. Уровни приоритетов Windows разделены на два класса:

  • реального времени (приоритеты от 16 до 31) — используется для выполнения основных функций операционной системы и обычно не применяется для приложений;
  • переменного приоритета (приоритет от 0 до 15) — определяет процессорный приоритет приложений; приоритет 0 возможен только для бесстраничного системного потока.

Уровни приоритетов

Процессам могут быть присвоены следующие базовые уровни приоритетов:

  • низкий — запускает приложения с уровнем приоритета 4;
  • обычный — запускает приложения с уровнем приоритета 7;
  • высокий — запускает приложения с уровнем приоритета 13;
  • реального времени — запускает приложения с уровнем приоритета 24.

 
Примечание Не запускайте приложения с классом приоритета реального времени — это может привести к нестабильности в работе операционной системы.

Управление памятью

В Windows 95 и NT каждый процесс имеет собственное адресное пространство, что позволяет адресовать до 4 Гб памяти. Отметим, что Windows выделяет процессу 4 Гб адресов памяти, а не физического ОЗУ. Физическая память ограничена имеющимися системными ресурсами (ОЗУ и дисковое пространство). Windows выделяет каждому приложению 2 Гб адресов памяти, а другие 2 Гб резервируются для нужд ядра.

Большинство компьютеров не располагают 4 Гб ОЗУ, и по этой причине Windows использует механизм виртуальной памяти. Таким образом, Windows может перенести часть содержимого физической памяти на жесткий диск, когда объем доступного ОЗУ будет исчерпан. Этот процесс известен как подкачка (рис. 1.6).

1-10.jpg

Рис. 1.6 Выделение виртуальной памяти приложениям

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

Виртуальная память

Процессоры Intel, начиная с модели 80386, позволяют отобразить область физической памяти на любую область 32-разрядных адресов. Виртуальная память Windows использует этот механизм для того, чтобы любая программа вела себя так, будто она имеет собственное физическое ОЗУ.

Windows для доступа к памяти применяет 32-разрядную линейную адресацию: приложения обращаются к памяти с помощью 32-разрядных адресов. Каждая программа имеет собственное виртуальное адресное пространство, которое диспетчер виртуальной памяти преобразует в адреса физического ОЗУ или в файле на жестком диске.

Постраничная подкачка

Физическое и виртуальное (логическое) адресное пространство каждого процесса разделено на страницы — «кванты» памяти, размер которых зависит от компьютера. Например, для компьютеров х86 размер страницы составляет 4 кб. Ядро может перемещать страницы памяти в страничный файл на диске (Pagefile.sys) и обратно: таким образом, управление памятью становится более гибким. Когда страница перемещается в физическую память, ядро обновляет таблицы страниц соответствующих процессов. Если ядру требуется место в физической памяти, оно вытесняет самые старые страницы физической памяти в страничный файл. Манипуляции ядра с физической памятью совершенно незаметны (прозрачны) для приложений, которые работают только со своими виртуальными адресными пространствами.

> Просмотр эффектов подкачки при помощи System Monitor

  1. В меню Start выберите пункты Programs, Microsoft Visual Basic 5.0, Visual Basic 5.0.
  2. Щелкните значок Existing и выберите проект Lab1.vbp в папке WA\Labs\Ch01. Щелкните кнопку Open.
  3. В ответ на запрос Add this project to Source Safe щелкните No.
  4. Откройте окно кода для события cmdUseRAM_Click и изучите его код.

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

  5. Откройте окно кода для события cmdFreeRAM_Click и изучите его код.

    Оператор Erase используется для повторной инициализации массива HugeArray, который объявлен в разделе General Declaration.

  6. Запустите приложение.

    Автоматически запустится System Monitor.

  7. В меню Options окна System Monitor выберите команду Chart.
  8. Задайте значение Update Interval, соответствующее быстрейшему обновлению, и щелкните ОК.
  9. В меню Edit выберите команду Add Item.
  10. В списке Category выберите пункт Memory Manager, а в списке Item — пункт Allocated Memory. Щелкните ОК.
  11. Повторите пункты 9—10 и выберите из списка Item пункт Swapfile in use.
  12. В меню View окна System Monitor щелкните команду Always on Top.
  13. В меню View выберите команду Bar Charts.
  14. Переместите окно System Monitor так, чтобы одновременно видеть приложе ние Visual Basic.
  15. В приложении Visual Basic щелкните кнопку Use RAM.

    Обратите внимание на усиленное использование файла подкачки и памяти.

  16. При щелчке кнопки Free RAM ресурсы будут освобождены.
  17. Закройте приложение Visual Basic и System Monitor.
  18. Выйдите из Visual Basic.

Выполнение приложений

Windows 95 и Windows NT по-разному выполняют приложения, особенно 16-разрядные.

Механизм сообщений Windows

В отличие от MS-DOS, Windows для управления приложениями использует модель сообщений. Сообщение генерируется всякий раз, когда происходит какое-то событие, например пользователь нажимает и отпускает клавишу на клавиатуре или передвигает мышь. Сообщение помещается в так называемую очередь сообщений. Активное приложение постоянно проверяет свою очередь и извлекает из нее поступившие сообщения.

1-11.jpg

Рис.1.7 Очереди сообщении

Обмен сообщениями в 16-разрядных версиях Windows

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

Обмен сообщениями в Windows 95

В Windows 95 проблемы единой очереди сообщений разрешены: у каждого выполняющегося Win32-пpилoжeния — своя очередь. Каждый поток в Win32-пpилoжe-нии имеет собственную очередь сообщений и, значит, никак не влияет на поведение других работающих приложений. Если Winl6- или Win32-пpилoжeниe потерпит крах, остальные Win32-пpилoжeния будут действовать на основе вытесняющей многозадачности и смогут принимать поступающие сообщения из своих очередей.

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

Виртуальные машины

Windows NT выполняет приложения в рамках виртуальных машин (Virtual Machine, VM). Фактически VM — это создаваемая операционной системой среда для выполнения приложения, которая полностью эмулирует все ресурсы компьютера. С точки зрения приложения, виртуальная машина — это полноценный компьютер, предоставляющий ему все имеющиеся ресурсы.

1-12.jpg

Рис. 1.8 Виртуальные машины

Каждое 16-разрядное Windows- и MS-DOS-приложение под управлением Windows NT выполняется в отдельном адресном пространстве, называемом виртуальной DOS-машиной (Virtual DOS Machine, VDM). При этом обеспечивается защита программы, a Windows NT может реализовать вытесняющую многозадачность для всех сервисов операционной системы и приложений.

В Windows 95 предусмотрено выполнение MS-DOS-приложений в отдельных VDM, однако, поскольку часть памяти доступна всем виртуальным машинам, MS-DOS-приложения представляют собой потенциальную угрозу стабильности системы.

> Проверка функций 16- и 32-разрядных Windows-программ

  1. В папке WA\Practice\Ch01 дважды щелкните файл Spind16. Будет запущена программа SPIND16.
  2. Щелкните Open.
  3. На экране откроется диалоговое окно Open.
  4. Выберите файл Billg.bmp и щелкните кнопку ОК.

    В окне SPIND16 появится изображение Билла Гейтса.

  5. Щелкните кнопку Spin или Flip.

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

  6. Повторите пункты 1—4 с программой SPIND32.
  7. Оставьте обе программы активными.

> Создание 16-разрядной общей ошибки защиты

  1. Запустите файл Badapp16.exe из папки WA\Practice\Ch01.
  2. Расположите окна программ на рабочем столе так, чтобы видеть их все.

    Для этого, например, щелкните правой кнопкой мыши панель задач Windows и выберите в меню команду Tile Horizontally или Tile Vertically. Они автоматически выравнивают все окна открытых программ на рабочем столе.

  3. Переключитесь в окно программы Bad App.
  4. В меню Action выберите команду Options и отключите звук.
  5. В меню Action выберите GP-Fault.

    Когда фитиль на экране догорит, бомба взорвется. В этот момент возникнет общая ошибка защиты.

    Windows 95 откроет диалоговое окно с предложением завершить приложение или проигнорировать ошибку.

  6. Щелкните кнопку Close.

    Windows 95 откроет диалоговое окно Application Error с детальным описанием ошибки и второй кнопкой Close. Оставьте это диалоговое окно открытым.

  7. Переключитесь в окно SPIND32.

    Активна ли программа?

    ответ

  8. Переключитесь в окно SPIND16.

    Активна ли программа?

    ответ

  9. Щелкните кнопку Close в диалоговом окне Bad App.

    Активно ли приложение SPIND16?

    ответ

  10. Оставьте приложения работать.

> Пример зависания 16-разрядного Windows-приложения

  1. Снова запустите файл Badapp16.exe.
  2. Расположите окна программ на рабочем столе так, чтобы видеть их все.
  3. В меню Action окна Bad App выберите команду Hang.

    Когда фитиль на экране догорит, бомба взорвется. В этот момент приложение остановится.

  4. Убедитесь, что ни одна программа (ни 32-разрядная, ни 16-разрядная) не откликается.
  5. Откройте диалоговое окно Close Programs, нажав клавиши CTRL+ALT+DEL.
  6. В списке приложений выберите Bad App [Not responding] и щелкните кнопку End Task.

    Появится диалоговое окно с запросом и кнопками End Task и Cancel.

  7. Второй раз нажмите кнопку End Task. Остальные программы станут активными.

Драйверы устройств в Windows

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

1-13.jpg

Рис. 1.9 Архитектура драйверов устройств

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

  • дисплеи;
  • звуковые карты;
  • устройства связи;
  • принтеры;
  • сетевые адаптеры.

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

Драйверы защищенного и реального режима

Драйверы реального режима созданы для работы в реальном режиме операционной системы MS-DOS. Они не так безопасны и устойчивы, как драйверы защищенного режима, которые используют преимущества архитектуры защищенного режима процессоров 80386 и последующих моделей. Драйвер защищенного режима или драйвер виртуального устройства (Virtual Device Driver, VxD) обеспечивает быстрый разделяемый доступ к устройству. Кроме того, операционные системы семейства Windows выполняют 32-разрядный код защищенного режима более эффективно, чем 16-разрядный код реального режима.

Windows 95 поддерживает оба типа драйверов, a Windows NT — только драйверы защищенного режима. Компания Microsoft настоятельно рекомендует применять 32-разрядные драйверы защищенного режима везде, где возможно.

Интерфейс прикладного программирования Win32

Интерфейс прикладного программирования (Application Programming Interface, API) Win32 обеспечивает приложениям доступ ко всему спектру функций операционных систем семейства Windows. Функции, сообщения и структуры Win32 формируют последовательный и единообразный API для Windows 95 и Windows NT. Средства API Win32 позволяют разрабатывать приложения, успешно работающие на всех платформах и в то же время при надобности использующие уникальные особенности любой из них.

Многие функции API интегрированы в состав таких программ, как Visual Basic. Например, функцию API Win32 MessageBox можно вызвать непосредственно или через функцию Visual Basic MsgBox. Средствами Visual Basic обычно пользоваться легче, однако во многих случаях разработчики найдут непосредственное применение и самим функциям API Win32.

Основной код API Win32

Базовый код API Win32 содержится в трех библиотеках динамической загрузки (Dynamic Link Library, DLL): USER32, GDI32 и KERNEL32.

1-14.jpg

Рис.1.10 Библиотеки API Win32

USER32

User32.dll и User.exe создают и контролируют окна на экране, выполняя все запросы по созданию, перемещению, изменению размеров и уничтожению окон. User.exe, кроме того, обрабатывает запросы, относящиеся к значкам и другим элементам интерфейса пользователя, а также переадресует события, порожденные различными устройствами ввода, соответствующим приложениям.

GD132

Gdi32.dll и Gdi.exe контролируют интерфейс графических устройств (Graphics Device Interface, GDI). GDI выполняет графические операции при создании изображения на системном дисплее и других устройствах, включая:

  • вывод на экран;
  • вывод на принтер;
  • включение/отключение пикселов.

KERNEL32

Kernel32.dll выполняет базовые функции операционной системы, в том числе:

  • управление памятью;
  • файловый ввод/вывод;
  • загрузку программы;
  • выполнение программы.

 
Примечание При объявлении функций API в Visual Basic 32-разрядные функции чувствительны к регистру символов, а эквивалентные 16-разрядные функции — нет. Это необходимо иметь в виду при преобразовании 16-разрядных приложений в 32-разрядные.

32- и 16-разрядные компоненты

В Windows 95 включены 16-разрядные версии User, GDI и Kernel. Комбинация 16-разрядного и 32-разрядного кода позволяет сохранить совместимость с существующими приложениями и драйверами и одновременно увеличить производительность системы по сравнению с Windows 3.1. Windows 95 использует 32-разрядный код везде, где это увеличивает производительность не в ущерб совместимости. Для включения в Windows 95 16-разрядных компонентов есть три основные причины:

  • код для 16-разрядных систем обеспечивает обратную совместимость с приложениями и драйверами, разработанными для Windows 3.1;
  • в некоторых случаях 16-разрядный код выполняется быстрее, чем аналогичный 32-разрядный;
  • 32-разрядный код требует больше памяти, чем эквивалентный 16-разрядный.

Одна из основных задач Windows 95 — эффективная работа на компьютерах с ограниченным объемом ОЗУ, и применение 16-разрядного кода способствует решению этой задачи.

Подсистемы ввода/вывода и драйверы устройств, включая сетевые и файловые системы, являются полностью 32-разрядными, как и все компоненты управления памятью и планирования. Часто возникающая при этом проблема вызова 32-разрядной функции из 16-разрядного приложения (или наоборот) решается при помощи шлюзования.

Шлюзование

Эта операция выполняется, когда операционная система преобразует вызов 16-разрядной функции в вызов 32-разрядной. Процессы Windows 95 и Windows NT не могут содержать одновременно и 16-разрядный, и 32-разрядный код. Шлюз позволяет коду с одной стороны границы вызывать код с другой ее стороны. Каждая платформа использует один или несколько механизмов шлюзования:

  • механизм базовых шлюзов позволяет 16-разрядному Windows-приложению в системе под управлением Windows 95 и Windows NT загрузить и вызвать 32-разрядную библиотеку;
  • с помощью механизма плоских шлюзов, реализованного только в Windows NT, Win32-пpилoжeниe загружает и вызывает 16-разрядную библиотеку и наоборот.

Использование API Win32

В этом упражнении Вы создадите окно сообщения, используя API Win32 и встроенную функцию Visual Basic MsgBox. > Создание окна сообщения средствами API Win32

  1. Запустите Microsoft Visual Basic и создайте новый проект стандартного исполняемого модуля.
  2. В меню Project выберите команду Add Module.
  3. В разделе General Declarations наберите следующий код:

    Declare Function MessageBox Lib "user32" Alias "MessageBoxA"(ByVal hwnd As Long, ByVal IpText As String, ByVal IpCaption As String, ByVal wType As Long) As Long

  4. Добавьте новую командную кнопку в форму Form1.
  5. В обработчике события Click кнопки Command1 наберите следующий код:

    MessageBox Me.hwnd, "API MessageBox function", "API", 0

  6. Запустите приложение.
  7. Щелкните кнопку Commandl.

    Функция API Win32 MessageBox будет вызвана непосредственно из кода Visual Basic.

> Создание окна сообщения средствами Visual Basic

  1. Запустите Visual Basic и создайте новый проект стандартного исполняемого модуля.
  2. Добавьте командную кнопку в форму Forml.
  3. В обработчике события Click кнопки Commandl наберите следующий код:

    MsgBox "Visual Basic MsgBox function"

  4. В меню Run щелкните команду Start, чтобы запустить программу.
  5. Щелкните кнопку Commandl.

    Обратите внимание на появившееся окно сообщения — на сей раз Visual Basic самостоятельно вызвал функцию MessageBox из библиотеки User32.dll.

Реестр Windows

Реестр — это унифицированная база данных, содержащая информацию об аппаратной и программной конфигурации локального компьютера. Здесь же хранятся данные системы и приложений. Реестр выполняет ту же роль, что и INI-файлы в Windows 3.1. Windows 95 по-прежнему позволяет использовать INI-файлы, однако в первую очередь они обеспечивают обратную совместимость. Преимущества реестра — возможность присоединить к одному ключу множество элементов различных типов. Кроме того, сетевые средства обеспечивают доступ к реестру по сети для удаленного администрирования и диагностики.

Редактор реестра

В Windows 95 и Windows NT реестр можно просматривать и редактировать средствами редактора реестра REGEDIT.EXE, расположенного в папке Windows (рис. 1.11).

Будьте осторожны, изменяя элементы реестра при помощи редактора реестра, — он не распознает синтаксические и семантические ошибки и не предупреждает о создании некорректного элемента. Неверный элемент реестра может сделать систему неработоспособной. К счастью, в большинстве случаев Вам не придется модифицировать реестр напрямую — для изменения параметров системы чаще всего достаточно диспетчера устройств и других апплетов Панели управления.

1-15.jpg

Рис. 1.11 Редактор реестра Windows

Структура реестра

Реестр — это древовидная иерархическая база данных. Он хранится в двух файлах, состав которых определяется конфигурацией системы. Обычно их два: один содержит настройки, специфичные для пользователя (файл USER.DAT), а другой — настройки, специфичные для компьютера (обычно SYSTEM.DAT). Каждый узел иерархического дерева называется ключом. Реестр напоминает файловую систему: любой ключ может содержать вложенные ключи (аналог вложенных каталогов) и данные (аналог файлов). В ключе хранится произвольное число значений данных любого типа. Каждое значение называется элементом реестра. Компоненты ключей реестра перечислены ниже.

 

Компонент ключа

Обязательный

Описание

Имя

Да

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

Класс

Нет

Имя класса объекта. Предназначен для использования в коде методов класса, экземпляры которого хранятся в реестре, Приложениями обычно не используется

Дескриптор защиты

Нет

Ключи содержат стандартные дескрипторы защиты Windows NT, допускают управление доступом и могут быть подвергнуты аудиту

Время последней записи

Нет

Время, когда ключ был последний раз модифицирован. Любое изменение элемента считается изменением его родительского ключа

Элемент(ы)

Нет

Информация, хранящаяся в ключе: имя для идентификации значения, тип для определения типа данных и сами данные соответствующей длины и формата

HKEY CLASSES ROOT

Ключ HKEY_CLASSES_ROOT содержит те же данные, что и файл REG.DAT в Windows 3.1,— сведения о встраивании и связывании объектов (Object Linking and Embedding, OLE) и ассоциации файлов с приложениями, которые позволяют Windows запускать приложение, соответствующее выбранному файлу.

HKEY_LOCAL_MACHINE

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

HKEY_CURRENT.CONFIG

Этот ключ содержит информацию о текущей конфигурации аппаратуры компьютера и используется в основном на компьютерах с несколькими аппаратными конфигурациями, например при подключении портативного компьютера к стыковочной станции и отключении от нее. Информация, содержащаяся в этом ключе, копируется из ключа HKEY_LOCAL_MACHINE.

HKEY_USERS

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

HKEY_CURRENT_USER

Этот ключ содержит настройки системы и программ, относящиеся к текущему пользователю. Он создается при регистрации пользователя в системе на основе информации из соответствующего раздела ключа HKEY_USERS. Именно здесь хранятся сведения о том, как данный пользователь сконфигурировал рабочую станцию — например, данные том, что каждый старт системы должен сопровождаться звуковым эффектом. Прочая информация может включать цветовые схемы, ярлыки, состояние рабочего стола и т.п.

HKEY_DYN_DATA

Этот ключ содержит динамическую информацию о состоянии различных устройств, причем она создается заново при каждом старте системы. Ключ HKEY_DYN_DATA используется как часть системы измерения производительности и для конфигурации устройств Plug-and-Play. Информация, содержащаяся здесь, меняется при добавлении новых устройств и удалении существующих. Для каждого устройства это данные о соответствующем аппаратном ключе, известных проблемах и текущем состоянии устройства. Ключ HKEY_DYN_DATA также содержит сведения о состоянии системы, формируемые с помощью утилиты System Monitor. Это ключ не входит в состав файлов реестра и всегда создается динамически.

Модификация реестра Windows

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

Для сохранения параметров приложения в реестре применяются операторы Visual Basic SaveSetting и GetSetting и соответствующие функции API Windows. Они имеют следующий синтаксис:

  • SaveSetting (приложение, раздел, ключ, параметр)
  • GetSetting (приложение, раздел, ключ, [по умолчанию])

 
Пример В приведенном ниже коде с помощью оператора SaveSetting создаются элементы реестра для приложения, заданного в аргументе приложение, а затем применяется оператор GetSetting для получения значений параметров. Поскольку задано значение по умолчанию, возврат значения гарантирован.

Поместить настройки в реестр

SaveSetting "МуАрр","Startup", "Top", 75

SaveSetting "MyApp","Startup", "Left", 50

использовать настройки из реестра для отображения текущей формы

Me.Left = GetSetting(appname := "МуАрр",

section := "Startup", key := "Left", default := "0")

Me.Top = GetSetting(appname := "МуАрр",

section := "Startup", key := "Top", default := "0")


Резюме

Изучение операционной системы Windows следует начинать с архитектуры системы. Операционная система Windows для поддержки своей эффективности и целостности использует два режима: пользователя и ядра.

Windows 95 и Windows NT — многозадачные операционные системы. Однако в действительности одновременно не выполняется больше одного процесса — процессор переключается между ними. В Windows 95 и NT каждый процесс имеет собственное адресное пространство, что позволяет адресовать до 4 Гб памяти.

Интерфейс прикладного программирования (API) Win32 обеспечивает приложениям доступ ко всему спектру функций операционных систем семейства Windows. Функции, сообщения и структуры Win32 образуют последовательный и единообразный API для Windows 95 и Windows NT. Средства API Win32 позволяют разрабатывать приложения, которые успешно работают на всех платформах, в то же время сохраняя возможность использовать уникальные особенности любой из них.

Реестр — это унифицированная база данных, где хранится информация об аппаратной и программной конфигурации локального компьютера. Преимущества реестра — возможность присоединить к одному ключу множество элементов различных типов. Кроме того, сетевые средства обеспечивают доступ к реестру по сети для удаленного администрирования и диагностики.