Для студентов згиа специальности 080403 ”Программное обеспечение




НазваниеДля студентов згиа специальности 080403 ”Программное обеспечение
страница4/34
Дата публикации25.02.2013
Размер3.71 Mb.
ТипМетодическое пособие
uchebilka.ru > Информатика > Методическое пособие
1   2   3   4   5   6   7   8   9   ...   34
^

Системное программирование в Windows


В этом разделе мы подробно рассмотрим вопросы системного программирования с использованием интерфейса Win32 API. Будут описываться управление потоками и процессами; синхронизация потоков; передача данных между процессами, с использованием анонимных и именованных каналов, а также почтовых ящиков; структурная обработка исключений; управление виртуальной памятью; управление файлами и каталогами; асинхронная обработка данных; создание динамически подключаемых библиотек; разработка сервисов.
^

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





      1. Интерфейс Win32 API и поддерживающие его платформы

Windows API (application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows. Является самым прямым способом взаимодействия приложений с Windows. Для создания программ, использующих Windows API, «Майкрософт» выпускает SDK, который называется Platform SDK и содержит документацию, набор библиотек, утилит и других инструментальных средств [2, 5, 13, 14, 17].

Windows API был изначально спроектирован для использования в программах, написанных на языке C (или C++). Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model. Существуют следующие версии Windows API:

  • Win16 — первая версия Windows API для 16-разрядных версий Windows. Изначально назывался просто Windows API, затем стал называться Win16 для отличения от Win32.

  • Win32s — подмножество Win32, устанавливаемое на семейство 16-разрядных систем Windows 3.x и реализующее ограниченный набор функций Win32 API для этих систем.

  • Win32 — 32-разрядный API для современных версий Windows. Самая популярная ныне версия. Базовые функции этого API реализованы в DLL kernel32.dll и advapi32.dll; базовые модули GUI — в user32.dll и gdi32.dll. Win32 появился вместе с Windows NT и затем был перенесён (в несколько ограниченном виде) в системы серии Windows 9x. В современных версиях Windows, происходящих от Windows NT, работу Win32 GUI обеспечивают два модуля: csrss.exe (Client/Server Runtime Subsystem), работающий в пользовательском режиме, и win32k.sys в режиме ядра. Работу же системных Win32 API обеспечивает ядро - ntoskrnl.exe

  • Win64 — 64-разрядная версия Win32, содержащая дополнительные функции для использования на 64-разрядных компьютерах. Win64 API можно найти только в 64-разрядных версиях Windows XP, Windows Server 2003, Windows Vista и Windows Server 2008.

      1. ^ Основные задачи управления памятью.

Память один из наиболее важных ресурсов вычислительной системы. Производительность работы программного обеспечения в значительной мере зависит от эффективного управления памятью. В 32-х разрядных операционных системах Windows управление памятью основывается на концепции виртуальной памяти, которая поддерживается аппаратно [2]. В этом разделе мы перейдём к более детальному рассмотрению вопроса. Память представлена двумя различными «слоями»: физическая память, с которой работает аппаратура и специальные программные модули, и виртуальная память доступная остальному программному обеспечению. Виртуальное адресное пространство открыто программному обеспечению, в то время как реальное физическое расположение данных и кода скрыто от пользовательских программ и большей части системных компонентов. Операционная система использует такое представление памяти для решения ряда важнейших задач:

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

  • ^ Расширение памяти за счёт использования дискового пространства для хранения содержимого виртуальной памяти. Операционная система хранит на диске данные, не требующиеся в данный момент, тем самым, освобождая физическую память для более необходимой информации. Аппаратура поддерживает механизм исключений, который позволяет программно перехватить обращение к данным не присутствующим в физической памяти и загрузить эти данные с диска. Такая операция производится скрытно от программы, которая читает или записывает данные в виртуальную память.

  • ^ Выделение частного адресного пространства (контекста памяти) каждому процессу в мультизадачной среде. Все процессы в системе используют одинаковый диапазон виртуальных адресов. Но каждый процесс имеет свой собственный набор таблиц страниц. Это позволяет отображать одинаковые виртуальные адреса в различные физические адреса для различных процессов. По умолчанию (т.е. без дополнительных действий со стороны программы) процессу не известны физические адреса, в которых располагается его код и данные и конечно процесс не имеет доступа к физическому месту расположения кода и данных других процессов. Процесс просто не может указать виртуальный адрес который будет отображён в физическую память, занимаемую другим процессом. Точнее, эта операция может быть выполнена только под контролем операционной системы.

  • ^ Быстрое переключение контекстов памяти при переключении задач. Windows – мультизадачная операционная система. Основным понятием мультизадачности является поток. Поток это цепочка инструкций МП – код, расположенный в адресном пространстве какого либо процесса. Один процесс приложения может содержать один или более потоков. ОС делит процессорное время на небольшие интервалы, которые называются квантами и периодически выделяет эти кванты для исполнения каждого потока. Переключение потоков происходит, в частности при истечении времени кванта или в случае если поток завершился до этого момента. Если следующий поток в очереди и текущий принадлежат разным процессам, система должна переключить контекст памяти, т.е. изменить текущие таблицы страниц. Это переключение контекста легко осуществляется коррекцией таблиц страниц или изменением указателя на каталог таблиц страниц в регистре процессора CR3.

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

  • ^ Защита областей памяти от доступа со стороны пользовательских приложений и запрещение модификации содержимого памяти. 32-х разрядные операционные системы Windows используют плоскую модель памяти (размер сегментов 4Гб) при работе с приложениями Win32. Теоретически эти приложения могут использовать адреса в диапазоне от 0 до 0xFFFFFFFF. Но значительная часть этого адресного пространства зарезервирована операционной системой для собственных нужд. Эта системная память может быть защищена от доступа приложений расположенных в третьем кольце защиты. Кроме того, данные в нулевом или третьем кольце защиты могут быть доступны только для чтения. Это используется, например, для секций, в которых размещается код, который не следует модифицировать.




      1. ^ Страничная организация памяти

Все эти полезные свойства основаны на технике трансляции страниц реализованной аппаратно в процессоре Intel 80386 [18]. Всё виртуальное адресное пространство разделяется на блоки одинаковой длины. Эти блоки называются страницами. Размер страницы равен 4K (4096 байт). Физический адрес страницы определяется соответствующей записью в таблице страниц. Таблицы страниц создаются операционной системой. Таблицы страниц составляют двухуровневую древовидную структуру. В корне этой структуры располагается каталог таблиц страниц. Каталог это таблица, записи которой указывают на таблицы страниц. В свою очередь записи таблиц страниц содержат ссылки на страницы. Структура приведена на рисунке 2.1.



Рис. 2.1. Структура дерева для трансляции адресов страниц.

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

      1. ^ Виртуальное адресное пространство процесса

Каждому процессу выделяется собственное виртуальное адресное пространство. Для 32-разрядных процессов его размер составляет 4 Гб [2]. Соответственно 32-битный указатель может быть любым числом от 0x00000000 до 0xFFFFFFFF. Всего, таким образом, указатель может принимать 4,294,967,296 значений, что как раз и перекрывает четырехгигабайтовый диапазон. Для 64-разрядных процессов размер адресного пространства равен 16 экзабайтам, поскольку 64-битный указатель может быть любым числом от 0x00000000'00000000 до 0xFFFFFFFF'FFFFFFFF и принимать 18,446,744,073,709,551,616 значений, охватывая диапазон в 16 экзабайтов.

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

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

  • ^ Раздел для выявления нулевых указателей. Этот раздел адресного пространства резервируется для того, чтобы программисты могли выявлять нулевые указатели. Любая попытка чтения или записи в память по этим адресам вызывает нарушение доступа. Довольно часто в программах, написанных на С/С++, отсутствует скрупулезная обработка ошибок. Например, в следующем фрагменте кода такой обработки вообще нет:



int* pnSomeInteger = (int*) malloc(sizeof(int)); *pnSomeInteger = 5;

При нехватке памяти malloc вернет NULL. Но код не учитывает эту возможность и при ошибке обратится к памяти по адресу 0x00000000. А поскольку этот раздел адресного пространства заблокирован, возникнет нарушение доступа и данный процесс завершится. Эта особенность помогает программистам находить "жучков" в своих приложениях.

  • ^ Раздел для кода и данных пользовательского режима. В этом разделе располагается закрытая (неразделяемая) часть адресного пространства процесса. Ни один процесс не может получить доступ к данным другого процесса, размещенным в этом разделе. Основной объем данных, принадлежащих процессу, хранится именно здесь (это касается всех приложений).

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




      1. ^ Функции для управления памятью

Операционная система предлагает несколько способов работы с памятью. Функции управления памятью разделяются на три основные группы: функции управления виртуальной памятью, функции управления кучей (heap) и функции для организации отображения файлов в память (memory mapped files). Приведём краткое описание каждой группы функций:

^ Функции управления виртуальной памятью.

Эти функции используются для резервирования и управления состоянием страниц виртуальной памяти. Функции, как правило, используются для работы с большими блоками памяти, выровненными по границе страниц. Страница виртуальной памяти может быть свободна (free), зарезервирована (reserved) и используема (committed). Свободные страницы потенциально доступны, однако не используются в данный момент и не зарезервированы для использования в будущем. Такие страницы могут быть преобразованы в зарезервированные или используемые. Зарезервированные страницы не занимают физического пространства на диске или в памяти. Резервирование диапазона виртуальных адресов означает лишь только то, что этот диапазон не будет участвовать в последующих операциях резервирования памяти. Содержимое страниц используемой памяти хранится в физической памяти и на диске в файле подкачки. Такие страницы могут быть защёлкнуты (locked). Если страница защелкнута, её содержимое всегда находится в физической памяти. Для резервирования и/или перевода в используемое состояние страниц памяти используется функция VirtuallAlloc.

LPVOID VirtualAlloc(

LPVOID lpAddress, // базовый адрес области памяти

DWORD dwSize, // размер области памяти в байтах

DWORD flAllocationType, // тип операции

DWORD flProtect // атрибуты защиты памяти

);

Параметр flAllocationType задаёт тип операции - резервирование памяти и/или перевод в используемое состояние. Параметр flProtect определяет атрибуты защиты области памяти. lpAddress - начальный адрес - всегда выравнивается по границе 64K для резервируемой памяти и по границе 4k для используемой памяти. Размер всегда округляется вверх до границы страницы. Пример использования функции:

/* Резервируем область (регион)размером 10 МБ */

lpBase = VirtualAlloc (NULL, 10485760, MEM_RESERVE, PAGE_NOACCESS);

/* Переводим в ипользумое состояние 3-ю страницу этой области. */

lpPage3 = VirtualAlloc (lpBase + (2 * 4096),

4096,

MEM_COMMIT,

PAGE_READWRITE);

Функция VirtualFree используется для освобождения зарезервированной или используемой памяти.

BOOL VirtualFree(

LPVOID lpAddress, // базовый адрес области памяти

DWORD dwSize, // размер области памяти в байтах

DWORD dwFreeType // тип операции

);

Функция может перевести память из используемого состояния в зарезервированное или свободное. Тип операции задаётся четвёртым параметром dwFreeType.

Примеры:

/* Переводим из используемого в зарезервированное состояние 3-ю страницу ранее размещённого диапазона. */

VirtualFree (lpBase + (2*4096),4096,MEM_DECOMMIT,PAGE_NOACCESS);

/* Освобождаем весь диапазон размером 10 МБ. */

VirtualFree (lpBase,10485760,MEM_RELEASE,PAGE_NOACCESS);

Атрибуты защиты заданные функцией VirtualAlloc можно изменить с помощью функции VirtualProtect.

BOOL VirtualProtect(

LPVOID lpAddress, // базовый адрес области памяти

DWORD dwSize, // размер области памяти в байтах

DWORD flNewProtect, // атрибуты защиты памяти

PDWORD lpflOldProtect // адрес для возврата старых атрибутов защиты

);

Праметр flNewProtect может содержать флаги: PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READ и др.
1   2   3   4   5   6   7   8   9   ...   34

Похожие:

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к лабораторному практикуму для студентов згиа...
Методические указания к лабораторному практикуму для студентов згиа специальности 080403 «Программное обеспечение автоматизированных...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания для студентов специальности 080403
Згиа [8, 10] и других вузов [4]. Наиболее полно описаны курсовые, дипломные и квалификационные работы, однако большинство положений...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к курсовой работе по дисциплине «Системное...
Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» для студентов специальности...

Для студентов згиа специальности 080403 ”Программное обеспечение iconПравила использования программного обеспечения в рамках программы...
Используя программное обеспечение вы тем самым подтверждаете свое согласие придерживаться этих правил. Если вы не согласны, не используйте...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания по выполнению лабораторных работ по курсу “
Информационные управляющие системы и технологии, 080403 – Программное обеспечение автоматизированных систем

Для студентов згиа специальности 080403 ”Программное обеспечение iconКлассификация программного обеспечения
В отличие от аппаратного обеспечения, программы, которые выполняются на нем, неосязаемы и классифицируются как программное обеспечение....

Для студентов згиа специальности 080403 ”Программное обеспечение iconКурсовая работа выполняется на основании 'Задания на курсовую работу'...
Целью курсовой работы является закрепление практических навыков самостоятельной постановки и решения задачи обработки данных с помощью...

Для студентов згиа специальности 080403 ”Программное обеспечение icon1. Классификация программного обеспечения
Назначением ЭВМ является выполнение программ. Программа содержит команды, определяющие порядок действии компьютера. Совокупность...

Для студентов згиа специальности 080403 ”Программное обеспечение iconОпорный конспект лекций по дисциплине Компьютерная графика для специальности...
Тема. Основные понятия компьютерной графики. Аппаратное и программное обеспечение

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания и задание к выполнению курсового проекта по...
Методические указания и задание к выполнению курсового проекта по дисциплине «Алгоритмическое и программное обеспечение электротехнических...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<