Программирование (в среде Windows)
Покупка
Основная коллекция
Тематика:
Текстовые редакторы
Издательство:
Новосибирский государственный технический университет
Автор:
Гунько Андрей Васильевич
Год издания: 2019
Кол-во страниц: 155
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7782-3890-9
Артикул: 778162.01.99
В учебном пособии изложены основные сведения об интерфейсах прикладного программирования вообще и Win32 API в частности, описаны методы и средства разработки многозадачного и многопоточного программного обеспечения в операционных системах семейства Windows, а также средства межзадачной и межпоточной коммуникации: анонимные и именованные каналы, почтовые ящики, отображаемые на память файлы, события, семафоры, взаимные исключения. Кроме того, кратко обсуждаются средства коммуникации процессов по сети, а также особенности взаимодействия приложений и системных служб. Предназначено для студентов II курса, обучающихся по направлениям 27.03.04 «Управление в технических системах» и 09.03.01 «Информатика и вычислительная техника», также может быть полезно студентам других технических специальностей, связанных с разработкой многозадачного и многопоточного программного обеспечения в среде операционных систем семейства Windows.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 27.03.04: Управление в технических системах
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство науки и высшего образования Российской Федерации НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ А.В. ГУНЬКО ПРОГРАММИРОВАНИЕ (В СРЕДЕ WINDOWS) Утверждено Редакционно-издательским советом университета в качестве учебного пособия НОВОСИБИРСК 2019
УДК 004.451.9(075.8) Г 948 Рецензенты: канд. техн. наук, доцент В.А. Астапчук, канд. техн. наук Д.О. Романников Работа подготовлена на кафедре автоматики Гунько А.В. Г 948 Программирование (в среде Windows): учебное пособие / А.В. Гунько – Новосибирск: Изд-во НГТУ, 2019 – 155 с. ISBN 978-5-7782-3890-9 В учебном пособии изложены основные сведения об интерфейсах прикладного программирования вообще и Win32 API в частности, описаны методы и средства разработки многозадачного и многопоточного программного обеспечения в операционных системах семейства Windows, а также средства межзадачной и межпоточной коммуникации: анонимные и именованные каналы, почтовые ящики, отображаемые на память файлы, события, семафоры, взаимные исключения. Кроме того, кратко обсуждаются средства коммуникации процессов по сети, а также особенности взаимодействия приложений и системных служб. Предназначено для студентов II курса, обучающихся по направлениям 27.03.04 «Управление в технических системах» и 09.03.01 «Информатика и вычислительная техника», также может быть полезно студентам других технических специальностей, связанных с разработкой многозадачного и многопоточного программного обеспечения в среде операционных систем семейства Windows. УДК 004.451.9(075.8) ISBN 978-5-7782-3890-9 © Гунько А.В., 2019 © Новосибирский государственный технический университет, 2019
1. ПРИНЦИПЫ ПОСТРОЕНИЯ ИНТЕРФЕЙСОВ ОПЕРАЦИОННЫХ СИСТЕМ Операционная система (ОС) всегда выступает как интерфейс меж ду аппаратурой компьютера и пользователем с его задачами. Под интерфейсами операционных систем следует понимать специальные интерфейсы системного и прикладного программирования, предназначенные для выполнения следующих задач [1]. 1. Управление процессами, которое включает в себя следующий набор основных функций: запуск, приостанов и снятие задачи с выполнения; задание или изменение приоритета задачи; взаимодействие задач между собой (механизмы сигналов, сема форы, очереди, конвейеры, почтовые ящики); RPC (Remote Procedure Call) – удаленный вызов подпрограмм. 2. Управление памятью: запрос на выделение блока памяти; освобождение памяти; изменение параметров блока памяти (память может быть забло кирована процессом либо предоставлена в общий доступ); отображение файлов на память (имеется не во всех системах). 3. Управление вводом/выводом: запрос на управление виртуальными устройствами (управление вводом/выводом является привилегированной функцией ОС); файловые операции (запросы к системе управления файлами на создание, изменение и удаление данных, собранных в файлы). Пользовательский интерфейс операционной системы реализуется с помощью специальных программных модулей, которые принимают его команды на соответствующем языке (возможно, с использованием графического интерфейса) и транслируют их в обычные вызовы в соответствии с основным интерфейсом системы. Обычно эти модули называют интерпретатором команд.
Получив от пользователя команду, такой модуль после лексическо го и синтаксического анализа либо сам выполняет действие, либо обращается к другим модулям ОС, используя механизм API (Application Program Interface, интерфейс прикладного программирования). В случае графических интерфейсов (GUI, Graphic User Interface) указание курсором на объекты и щелчок (клик) или двойной щелчок по соответствующим клавишам приводит к каким-либо действиям – запуску программы, ассоциированной с указываемым объектом, выбору и/или активизации пунктов меню и т. д. Такая интерфейсная подсистема транслирует «команды» пользователя в обращения к ОС. Управление GUI – частный случай задачи управления вводом/выводом, не являющийся частью ядра операционной системы, хотя в ряде случаев разработчики ОС относят функции GUI к основному системному API. Интерфейс прикладного программирования Необходимо разделить термин API на следующие направления: API как интерфейс высокого уровня, принадлежащий к библиотекам RTL. RTL (Run Time Library) – библиотека времени выполнения; она включает в себя те стандартные подпрограммы, которые система программирования подставляет на этапе компиляции. В общем случае RTL включает в себя не только модули из системы программирования, но и модули самой ОС; API прикладных и системных программ, входящих в поставку операционной системы; прочие API. Интерфейс прикладного программирования предназначен для использования прикладными программами системных ресурсов ОС и реализуемых ею функций. API описывает совокупность функций и процедур, принадлежащих ядру или надстройкам ОС. Представляет собой набор функций, предоставляемых системой программирования разработчику прикладной программы и ориентированных на организацию взаимодействия результирующей прикладной программы с целевой вычислительной системой. Целевая вычислительная система представляет собой совокупность программных и аппаратных средств, в окружении которых выполняется результирующая программа. API включает в себя не только сами функции, но и соглашения об их использовании, которые регламентируются ОС, архитектурой целевой вычислительной системы и системой программирования.
Существует несколько вариантов реализации API: реализация на уровне ОС; реализация на уровне системы программирования; реализация на уровне внешней библиотеки процедур и функций. Система программирования в каждом из этих вариантов предоставляет разработчику средства для подключения функций API к исходному коду программы и организации их вызовов. Объектный код функций API подключается к результирующей программе компоновщиком при необходимости. Возможности API можно оценивать со следующих позиций: эффективность выполнения функций API – включает в себя скорость выполнения функций и объем вычислительных ресурсов, необходимых для их выполнения; широта предоставляемых возможностей; зависимость прикладной программы от архитектуры целевой вычислительной системы. Реализация функций API на уровне ОС За их выполнение ответственность несет ОС. Объектный код, выполняющий функции, либо непосредственно входит в состав ОС (или даже ядра ОС), либо поставляется в составе динамически загружаемых библиотек, разработанных для данной ОС. Система программирования ответственна за то, чтобы организовать интерфейс для вызова этого кода. Результирующая программа обращается непосредственно к ОС, поэтому достигается наибольшая эффективность выполнения функций API по сравнению с другими вариантами реализации API. Недостаток организации API по такой схеме – полное отсутствие переносимости не только кода результирующей программы, но и кода исходной программы. Программа, созданная для одной архитектуры вычислительной системы, не сможет исполняться на другой вычислительной системе даже после того, как ее объектный код будет полностью перестроен. Зачастую система программирования не сможет выполнить перестроение исходного кода дли новой архитектуры вычислительной системы, поскольку многие функции API, ориентированные на определенную ОС, в новой архитектуре просто отсутствуют. Для переноса прикладной программы с одной вычислительной системы на другую требуется изменение исходного кода программы.
Пример API такого рода – набор функций, предоставляемых пользователю со стороны ОС типа Microsoft Windows – WinAPI (WindowsAPI) [2]. Даже внутри этого корпоративного API существует определенная несогласованность, которая несколько ограничивает переносимость программ между различными ОС типа Windows. Еще один пример такого API – набор сервисных функций ОС типа MS-DOS, реализованный в виде набора подпрограмм обслуживания программных прерываний. Реализация функций API на уровне системы программирования Функции API предоставляются пользователю в виде библиотеки функций соответствующего языка программирования. Обычно речь идет о библиотеке времени исполнения – RTL. Система программирования предоставляет пользователю библиотеку соответствующего языка программирования и обеспечивает подключение к результирующей программе объектного кода, ответственного за выполнение этих функций. Эффективность функций API в таком варианте будет несколько ниже, чем при непосредственном обращении к функциям ОС. Так происходит, поскольку для выполнения многих функций API библиотека RTL языка программирования все равно должна выполнять обращения к функциям ОС. Наличие всех необходимых вызовов и обращений к функциям ОС в объектном коде RTL обеспечивает система программирования. Рассмотрим вызов в программе на языке С для ОС Windows функ ции по запросу 256 байт памяти Unsigned char * ptr = mallос (256); Из кода пользовательской программы будет осуществлен вызов библиотечной функции mallос, код которой расположен в RTL. Библиотека времени выполнения в данном случае реализует вызов mallос уже как вызов системной функции API HeapAlloc: LPVOID HeapAlloc; HANDLE hHeap; /* указатель на блок */ DWORD dwFlags; /* свойства блока */ DWORD dwBytes; /* размер блока */
Параметры выделяемого блока памяти в таком случае задаются си стемой программирования, пользователь лишен возможности задавать их напрямую. Но возможно использование функций API прямо в тексте программы, если подгрузить системную библиотеку Kernel32.dll: unsigned char * ptr = = (LPVOID) HeapAlloc( GetProcessHeap(), 0, 256); Переносимость исходного кода программы при использовании RTL будет самой высокой, поскольку синтаксис и семантика всех функций строго регламентированы в стандарте соответствующего языка программирования. Они зависят от языка, а не от архитектуры целевой вычислительной системы. Поэтому для выполнения прикладной программы на новой платформе достаточно заново построить код результирующей программы с помощью соответствующей системы программирования. Для каждой платформы будет требоваться свой код RTL языка программирования. Реализация функций API с помощью внешних библиотек Внешние библиотеки предоставляются пользователю в виде библиотеки процедур и функций, созданной сторонним разработчиком. Система программирования ответственна только за то, чтобы подключить объектный код библиотеки к результирующей программе. Причем внешняя библиотека может быть и динамически загружаемой (загружаемой во время выполнения программы). Эффективность выполнения – самая низкая, потому что внешняя библиотека обращается как к функциям ОС, так и к функциям RTL языка программирования. Требование к переносимости исходного кода только одно – используемая внешняя библиотека должна быть доступна в любой из архитектур вычислительных систем, на которые ориентирована прикладная программа. Это возможно, если используемая библиотека удовлетворяет какому-то принятому стандарту, а система программирования поддерживает этот стандарт. Например, библиотеки, удовлетворяющие стандарту POSIX, доступны в большинстве систем программирования для языка С. И если прикладная программа использует только библиотеки этого стандарта, то ее исходный код будет переносимым.
Платформенно-независимый интерфейс POSIX POSIX (Portable Operating System Interface for Computer Environments) – платформенно независимый системный интерфейс для компьютерного окружения. Это стандарт IEEE, описывающий системные интерфейсы для открытых операционных систем, в том числе оболочки, утилиты и инструментарии. Стандарт базируется на UNIXсистемах, но допускает реализацию и в других ОС. Этот стандарт подробно описывает VMS (Virtual Memory System, систему виртуальной памяти), многозадачность (МРЕ, Multiprocess Executing) и технологию переноса операционных систем (CTOS). Таким образом, на самом деле POSIX представляет собой множество стандартов, именуемых POSIX.1 – POSIX.12. Следует отметить, что POSIX.1 предполагает язык С как основной язык описания системных функций API. На рис. 1 изображена типовая схема реализации строго соответствующего POSIX приложения. Видно, что для взаимодействия с операционной системой программа использует только библиотеки POSIX.1 и стандартную библиотеку RTL языка С, в которой возможно использование лишь 110 различных функций, также описанных стандартом POSIX.1. Рис. 1. Приложения, строго соответствующие стандарту POSIX Реализации POSIX API на уровне операционной системы различны. Если UNIX-системы изначально соответствуют спецификациям IEEE
Standard 1003.1–1990, то WinAPI не является POSIX-совместимым. Для его поддержки в MS Windows NT введен специальный модуль поддержки POSIX API, работающий на уровне привилегий пользовательских процессов. Он обеспечивает конвертацию и передачу вызовов из пользовательской программы к ядру системы и обратно, работая с ядром через WinAPI. Приложения, написанные с использованием WinAPI, могут передавать информацию POSIX-приложениям через стандартные механизмы потоков ввода/вывода (stdin, stdout). Вопросы для самопроверки 1. Перечислите основные задачи, решаемые программными интерфейсами операционных систем. 2. Для чего предназначен и что включает в себя интерфейс прикладного программирования (API)? 3. Какие существуют варианты реализаций API, каковы критерии их сравнения? 4. Каковы особенности реализаций функций API на уровне ОС? 5. Каковы особенности реализаций функций API на уровне системы программирования? 6. Каковы особенности реализаций функций API с помощью внешних библиотек?
2. ОС WINDOWS И WINDOWS API Назначение операционной системы (ОС) Физическими (или аппаратными) ресурсами компьютера называются физические устройства, из которых состоит компьютер. К таким устройствам относятся: центральный процессор, оперативная память, внешняя память, шины передачи данных и различные устройства ввода/вывода информации. Логическими (или информационными) ресурсами компьютера называются данные и программы, которые хранятся в памяти компьютера. Когда говорят обо всех ресурсах компьютера, включая как физические, так и логические ресурсы, то обычно используют термины ресурсы компьютера или системные ресурсы. Для выполнения на компьютере какой-либо программы необходимо, чтобы она имела доступ к ресурсам компьютера. Этот доступ обеспечивает операционная система. Можно сказать, что операционная система – это комплекс программ, который обеспечивает доступ к ресурсам компьютера и управляет ими. Другими словами, операционная система – это администратор или менеджер ресурсов компьютера. Назначение операционной системы состоит в обеспечении пользователя программными средствами для использования ресурсов компьютера и эффективном разделении этих ресурсов между пользователями. Отсюда следует, что главными функциями операционной системы являются управление ресурсами компьютера и диспетчеризация (или планирование) этих ресурсов.