Спонсор: Microsoft
Санкт-Петербургский государственный университет
Опубликован: 13.11.2010 | Доступ: свободный | Студентов: 6727 / 1528 | Оценка: 4.64 / 4.23 | Длительность: 45:08:00
ISBN: 978-5-9963-0495-0
Лекция 28:

Системные механизмы Windows

< Лекция 27 || Лекция 28: 1234 || Лекция 29 >

Программный интерфейс Windows

Доступ к объектам ядра.Процесс получает доступ к объекту ядра, называемому XXX, путем вызова функции CreateXXX для получения (открытия) ссылки ( handle ) на XXX. Ссылка уникальна для данного процесса.

Ссылка может быть закрыта вызовом функции CloseHandle. Система может удалить данный объект, если счетчик ссылок на него стал равным нулю.

Windows 2000 применяет три способа совместного использования объекта несколькими процессами:

  • Дочерний процесс наследует ссылку на объект
  • Один процесс дает объекту имя при его создании, а другой процесс открывает данное имя
  • Функцию DuplicateHandle, которая обеспечивает, если известна ссылка на процесс и значение ссылки, получение для другого процесса ссылки на тот же объект.

Программный интерфейс Windows: Управление процессами

Процесс запускается функцией CreateProcess, которая загружает все динамически линкуемые библиотеки, используемые процессом, и создает первичный поток ( primary thread ). Дополнительные потоки могут создаваться функцией CreateThread. Каждая DLL или exe-файл, загружаемые в адресное пространство процесса, идентифицируются ссылкой на экземпляр (instance handle).

Планирование в Win32 использует четыре класса приоритетов:

  • IDLE_PRIORITY_CLASS (уровень приоритетов 4)
  • NORMAL_PRIORITY_CLASS (уровень 8 — типичный для большинства процессов)
  • HIGH_PRIORITY_CLASS (уровень 13)
  • REALTIME_PRIORITY_CLASS (уровень 24).

Для обеспечения уровней производительности, необходимых для интерактивных программ, Windows 2000 использует специальное правило планирования для процессов класса NORMAL_PRIORITY_CLASS. Windows 2000 различает основной процесс ( foreground process),который в данный момент выбран на экране, и фоновые процессы ( background processes ), которые не выбраны в данный момент. Когда процесс становится основным, Windows 2000 увеличивает его квант планирования, как правило, в три раза.

Ядро динамически изменяет приоритет потока, в зависимости от того, связан ли он с вводом-выводом или с процессором.

Для синхронизации доступа к общим объектам несколькими потоками ядро предоставляет синхронизирующие объекты, такие как семафоры и мьютексы (mutexes). Кроме того, потоки могут синхронизироваться с использованием функций WaitForSingleObject или WaitForMultipleObjects. Другой метод синхронизации в Win32 APIкритическая секция.

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

Windows 2000 поддерживает концепцию волокон с целью переноса унаследованных UNIX-приложений, написанных на основе модели исполнения волокон. Имеется механизм преобразования потока в волокно – ConvertThreadToFiber.

Взаимодействие процессов.Win32 – приложения могут выполнять взаимодействие между процессами путем совместного использования разделяемых объектов ядра.

Альтернативный способ взаимодействия процессов – передача сообщений; он наиболее популярен для Windows GUI - приложений. При этом один поток посылает сообщение другому потоку или окну. Вместе с сообщением поток может также посылать данные.

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

Управление виртуальной и физической памятью и рабочими наборами в Windows

Для организации виртуальной памяти используются следующие функции Win32:

  • VirtualAlloc резервирует или согласует для резервирования виртуальную память.
  • VirtualFree освобождает виртуальную память.

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

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

Куча (heap) в окружении Win32 – это область (region) зарезервированного адресного пространства. Для процесса Win32 создается куча, размер которой по умолчанию равен 1 MB .Доступ к куче синхронизирован, с целью защиты структур данных, связанных с распределением памяти в куче, от разрушения при совместном доступе из нескольких потоков.

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

Для управление физической памятью поддерживается традиционная концепция рабочего набора (множества) – working set.Рабочий набор — все физические страницы, которыми "владеет" процесс. По существу, это все страницы, к которым процесс может обратиться, не вызвав сбоя страницы. Предел рабочего набора — максимальное число страниц, которыми процесс может владеть. При достижении предела добавление каждой новой страницы должно сопровождаться исключением одной страницы из набора ( замена в рабочем наборе ).

Верхний предел размера набора для каждого процесса по умолчанию - максимальное значение для всей системы - вычисляется и сохраняется в MmMaximumWorkingSetSize. Это примерно объем основной памяти минус 512 страниц (2 мегабайта в архитектуре x86) и минус минимальный размер системного рабочего набора (1.5 мегабайта в x86). Это интересные данные, поскольку они дают представление, сколько памяти реально теряется на нужды ОС. Реальный верхний предел составляет 2 гигабайта минус 64 мегабайта для 32-битовой ОС Windows.

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

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

В Windows 2000 подобная схема реализована только для однопроцессорных систем, в Windows XP и Windows Server 2003 — для любых, в том числе – для многопроцессорных систем. В системах Windows XP и Windows Server 2003 для управления памятью реализован новый флаг VirtualAlloc MEM_WRITE_WATCH.

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

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

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

Системный рабочий набор.Подобно тому, как все процессы имеют рабочие наборы, подкачиваемые код и данные системного пространства Windows размещаются в системном рабочем наборе. Он состоит из 4 компонентов:

  • подкачиваемый пул;
  • поддерживающие подкачку код и данные в исполнительном сегменте ядра;
  • поддерживающие подкачку код и данные в драйверах режима ядра, Win32K.Sys, графических драйверах и т. д.;
  • глобальный кэш данных файловой системы.

Чтобы подсчитать физический (резидентный) размер этих компонентов с помощью системной утилиты PerfMon, следует выяснить значения следующих показателей:

  • Память | число подкачанных в пул резидентных байтов
  • Память | число резидентных байтов системного кода
  • Память | число резидентных байтов системных драйверов
  • Память | число резидентных байтов системного кэша.

Показатель счетчика байтов в памяти | кэше представляет собой сумму показателей этих четырех "резидентных" (физических) счетчиков.

Управление физической памятью.Система хранит не назначенные физические страницы в одном из нескольких списков:

  • Список свободных страниц
  • Список измененных страниц
  • Список резервных страниц
  • Список нулевых страниц
  • Список плохих страниц — страницы, не прошедшие тест памяти при загрузке системы.

Списки реализованы как записи в базе данных PFN. Они обслуживаются как списки FIFO, или очереди.

Динамика подкачки.Новые страницы распределяются по рабочим наборам из начала списка свободных или нулевых страниц. Страницы, исключенные из рабочего набора в ходе операции замены, помещаются в конец одного из следующих списков:

  • Список измененных страниц (если они были изменены в рабочем наборе)
  • Список резервных страниц (если изменения не вносились).

Решение принимается на основе значении бита D (dirty = изменена) в записи таблицы страницы. Пока физическая страница находится в одном из этих списков, между ней и процессом по-прежнему поддерживается связь.

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

< Лекция 27 || Лекция 28: 1234 || Лекция 29 >
Гульжан Мурсакимова
Гульжан Мурсакимова
Василий Четвертаков
Василий Четвертаков