<< Пред.           стр. 6 (из 8)           След. >>

Список литературы по разделу

 8.2.2. Межпроцессное взаимодействие
 
  Для общения друг с другом потоки могут использовать широкий спектр возмож­ностей, включая каналы, именованные каналы, почтовые ящики, вызов удаленной процедуры и совместно используемые файлы. Каналы могут работать в одном из двух режимов, выбираемом при создании канала: байтовом и режиме сообщений. Байтовые каналы работают так же, как и в системе UNIX. Каналы сообщений в чем-то похожи на байтовые каналы, но сохраняют границы между сообщениями, так что четыре записи по 128 байт будут читаться с другой стороны канала как четыре сообщения по 128 байт, а не как одно 512-байтовое сообщение, как это может слу­читься с байтовыми каналами. Также имеются именованные каналы, для которых существуют те же два режима. Именованные каналы, в отличие от обычных кана­лов, могут использоваться по сети.
  Почтовые ящики представляют собой особенность системы Windows 2000, которой нет в UNIX. В некоторых аспектах они подобны каналам, но не во всем. Во-первых, почтовые ящики являются однонаправленными, тогда как кана­лы могут работать в обоих направлениях. Они также могут использоваться по сети, но не предоставляют гарантированной доставки. Наконец, они позволяют отправляющему процессу использовать широковещание для рассылки сообщения не одному, а сразу многим получателям.
  Сокеты подобны каналам с тем отличием, что они при нормальном использо­вании соединяют процессы на разных машинах. Например, один процесс пишет в сокет, а другой процесс на удаленной машине читает из него. Сокеты также могут использоваться для соединения процессов на одной машине, но поскольку их ис­пользование влечет за собой большие накладные расходы, чем использование ка­налов, то, как правило, они применяются в контексте сети.
  Вызов удаленной процедуры представляет собой тот способ, которым процесс А просит процесс В вызвать процедуру в адресном пространстве процесса В от име­ни процесса А и вернуть результат процессу А. Существуют различные ограниче­ния на параметры. Например, нет смысла передавать указатель другому процессу.
  Наконец, процессы могут совместно использовать память для одновременного отображения одного и того же файла. Все, что один процесс будет писать в этот файл, будет появляться в адресном пространстве других процессов. С помощью такого механизма можно легко реализовать общий буфер, применяемый в задаче производителя и потребителя.
  Помимо многочисленных механизмов межпроцессного взаимодействия, опера­ционная система Windows 2000 также предоставляет множество механизмов син­хронизации, включая семафоры, мьютексы, критические области и события. Все эти механизмы работают с потоками, а не процессами, так что когда поток блоки­руется на семафоре, другие потоки этого процесса (если такие есть) не затрагива­ются и могут продолжать работу.
  Семафор создается при помощи API-функции CreateSemaphore, которая может задать для него начальное значение, а также установить максимальное значение. Семафоры представляют собой объекты в ядре и, таким образом, обладают деск­рипторами или дескрипторами защиты. Копия дескриптора может быть получена с помощью функции DuplicateHandle и передана другому процессу, в результате чего несколько процессов могут синхронизироваться, используя один семафор.
  Мьютексы также представляют собой объекты ядра, используемые для синх­ронизации, но они проще семафоров, так как не содержат счетчиков. По существу, они являются блокировками, для работы с которыми используются функции API WaitForSingleObject и ReleaseMutex. Как и дескрипторы семафоров, дескрипторы мьютексов можно скопировать и передать другому процессу, так что потоки раз­личных процессов смогут иметь доступ к одному и тому же мьютексу.
  Третий механизм синхронизации основан на критических секциях (или критических областях). Критические секции подобны мьютексам, но отличаются тем, что они связаны с адресным про­странством создавшего их потока. Поскольку критические секции не являются объектами ядра, у них нет дескрипторов или дескрипторов защиты и они не могут передаваться от одного процесса другому. Блокирование и разблокирование выполняется функциями EnterCrlt leal Section и LeaveCritical Sect Ion соответствен­но. Поскольку эти функции API в основном выполняются в пространстве пользо­вателя и обращаются к системным вызовам в ядро, только когда требуется блоки­рование потока, они работают быстрее, чем мьютексы.
  В последнем механизме синхронизации используются объекты ядра, называе­мые событиями, которые бывают двух видов: сбрасываемые вручную и сбрасыва­емые автоматически. Каждое событие может находиться в одном из двух состоя­ний: установленном и сброшенном. Поток может ждать какого-либо события с помощью функции WaitForSingleObject. Если другой поток вызывает событие при помощи функции SetEvent, результат зависит от типа события. Если событие яв­ляется сбрасываемым вручную, то все ждущие его потоки отпускаются, а событие остается в установленном состоянии, пока его кто-либо не сбросит при помощи функции ResetEvent. В случае сбрасываемого автоматически события отпускается только один ожидающий его поток, а событие тут же сбрасывается. Кроме функ­ции SetEvent существует также функция PulseEvent, отличающаяся от первой функ­ции тем, что если этого события никто не ждет, событие все равно само сбрасыва­ется и, таким образом, пропадает впустую. При использовании функции SetEvent событие, которого никто не ждет, напротив, остается в установленном состоянии, так что как только какой-либо поток обратится к функции WaitForSingleObject, он будет тут же отпущен, после чего событие сбросится.
  События, мьютексы и семафоры могут иметь имена и храниться в файловой системе, подобно именованным каналам. Несколько процессов могут синхрони­зироваться друг с другом, открывая одно и то же событие, мьютекс или семафор, что проще, чем создание такого объекта одним процессом и передача другим про­цессам дубликата дескриптора, хотя такой способ, конечно, также возможен.
  Интерфейс Win32 API содержит около 100 вызовов, работающих с процесса­ми, потоками и волокнами. Значительное количество этих вызовов в той или иной мере имеет отношение к межпроцессному взаимодействию.
 8.2.3. Реализация процессов и потоков
 
  Процессы и потоки имеют большее значение и являются более сложными, чем за­дания и волокна. Процесс со­здается другим процессом при помощи вызова интерфейса Win32 CreateProcess. Этот вызов обращается (в режиме пользователя) к процедуре в динамической биб­лиотеке kernel32.dll, которая в несколько этапов создает процесс, используя при этом множество системных вызовов и других действий.
  Создание потока также состоит из нескольких этапов. Сначала работающий процесс обращается к функции CreateThread, которая вызывает процедуру внутри kernel32.dll. Эта процедура вы­деляет в вызывающем процессе память для стека режима пользователя, а затем обращается к системному вызову NtCreateThread, чтобы создать объект потока для исполняющей системы, проинициализировать его, а также создать и проинициализировать блок управления потоком. Затем поток начинает работу с собственной инициализации.
  Когда создается процесс или поток, исходному процессу возвращается дескрип­тор, который можно использовать для запуска, остановки, уничтожения и провер­ки созданного процесса или потока. Владелец дескриптора может передать его дру­гому процессу защищенным способом. Эта техника применяется, чтобы отладчики могли иметь полный контроль над управляемыми ими процессами.
  В операционной системе Windows 2000 нет центрального потока планирования. Вместо этого, когда какой-либо поток не может более выполняться, этот поток сам переходит в режим ядра и запускает планировщика, чтобы определить, на какой поток переключиться.
  Текущий поток выполняет программу планировщика при одном из следующих условий:
  1) поток блокируется на семафоре, мьютексе, событии, операции ввода-выво­да и т. д;
  2) поток сигнализирует каким-либо объектом (например, выполняет операцию up на семафоре);
  3) истекает квант времени работающего потока.
  В случае 1 поток уже работает в режиме ядра, чтобы выполнить операцию с объектом диспетчера или ввода-вывода. Возможно, он не может продолжать работу, поэтому он должен сохранить свой контекст, запустить программу плани­ровщика, чтобы выбрать своего преемника, и загрузить контекст этого потока, что­бы запустить его.
  В случае 2 поток также находится в ядре. Однако после сигнализирования объектом он, определенно, может продолжать работу, так как эта операция никог­да не приводит к блокированию. Тем не менее поток должен запустить процедуру планировщика, чтобы посмотреть, нет ли среди готовых к работе потока с более высоким приоритетом. Если такой поток есть, происходит переключение на этот поток, так как операционная система Windows 2000 является системой с при­оритетным прерыванием (то есть переключение потока может произойти в любой момент, а не только тогда, когда у текущего потока закончится выделенный ему квант времени).
  В случае 3 происходит эмулированное прерывание с передачей управления в ядро. При этом поток также запускает процедуру планировщика, чтобы опреде­лить, какой поток следует запустить после текущего потока. Если все остальные потоки в данный момент окажутся заблокированными, планировщик может про­должить выполнение текущего потока, выделив ему новый квант времени. В про­тивном случае происходит переключение потока.
  Планировщик также вызывается при еще двух условиях:
  1) завершается операция ввода-вывода;
  2) истекает ожидание таймера.
  В первом случае какой-нибудь поток, возможно, ожидал окончания этой опе­рации ввода-вывода и теперь может продолжить свою работу. Необходимо опре­делить, должен ли этот поток прервать выполнение текущего потока, так как по­токам не гарантируется минимальный рабочий интервал времени. Планировщик не запускается во время работы самой процедуры обработки прерываний (так как при этом прерывания могут оказаться запрещенными на слишком долгий срок). Вместо этого отложенный вызов процедуры устанавливается в очередь и вы­полняется немного позднее, после того как процедура обработки прерываний закончит свою работу. Во втором случае поток выполнил операцию down на сема­форе или блокировался на каком-либо другом объекте, но установленное время ожидания истекло. И в этом случае обработчик прерываний должен установить процедуру в очередь, чтобы она не была запущена во время работы обработчика преры­ваний. Если в результате тайм-аута поток оказался готовым к работе, будет запу­щен планировщик, и если ничего более важного в данный момент нет, будет вы­полнен отложенный вызов процедуры.
  Теперь рассмотрим сам алгоритм планирования. Интерфейс Win32 API содержит два вызова, предоставляющих процессам возможность влиять на пла­нирование потоками. Алгоритм планирования в значительной степени определяется этими вызовами.
  Во-первых, есть вызов SetPriorltyClass, устанавливающий класс приоритета всех потоков вызывающего процесса. К допустимым значениям при­оритета относятся: при­оритет реального времени, высокий при­оритет, при­оритет выше нормы, нормальный при­оритет, при­оритет ниже нормы и неработающий при­оритет.
  Во-вторых, имеется вызов SetThreadPrlorlty, устанавливающий относительный приоритет некоторого потока (возможно, но не обязательно, потока, обращающе­гося к этому вызову) по сравнению с другими потоками данного процесса. При­оритет может иметь следующие значения: критичный ко времени при­оритет, самый высокий при­оритет, при­оритет выше нормы, нормальный при­оритет, при­оритет ниже нормы, самый низкий при­оритет и неработающий при­оритет. Таким образом, шесть классов процессов и семь классов потоков могут образовать 42 ком­бинации. Эта информация поступает на вход алгоритма планирования.
  Планировщик работает следующим образом. В системе существует 32 уровня приоритета, пронумерованные от 0 до 31. 42 комбинации отображаются на эти 32 приоритета, определяя базовый приоритет потока. Кроме того, у каждого потока есть текущий приоритет, кото­рый может быть выше (но не ниже) базового приоритета.
  Чтобы использовать эти приоритеты для планирования, система содержит мас­сив из 32 элементов, соответствующих приоритетам от 0 до 31. Каждый элемент массива указывает на начало списка готовых пото­ков с соответствующим приоритетом. Базовый алгоритм планирования состоит из процедуры сканирования массива от приоритета 31 до приоритета 0. Как только найден непустой элемент, выбирается поток в начале очереди и запускается на один квант времени. Когда квант истекает, поток направляется в конец очереди своего приоритета, а следующим выбирается поток в начале очереди. Другими сло­вами, когда есть несколько готовых потоков с наивысшим уровнем приоритета, они запускаются поочередно, получая каждый по одному кванту времени. Если гото­вых потоков нет, запускается бездействующий поток.
  Следует отметить, что при планировании не учитывается, какому процессу принадлежит тот или иной поток. То есть планировщик не выбирает сначала про­цесс, а затем поток в этом процессе. Он смотрит только на потоки. Он даже не зна­ет, какой поток какому процессу принадлежит. На многопроцессорной системе каждый центральный процессор сам занимается планированием своих потоков при помощи массива приоритетов. Чтобы гарантировать, что в каждый момент времени лишь один центральный процессор работает с массивом, используется спин-блокировка.
  В системе Windows 2000 Professional длительность кванта по умолчанию равна 20 мс; на однопроцессорных серверах его значение равно 120 мс; на многопроцессорных системах используют­ся различные другие варианты в зависимости от частоты процессора. Более ко­роткий квант улучшает работу интерактивных процессов, тогда как более длин­ный квант снижает количество переключений контекста и тем самым увеличивает производительность. Значения по умолчанию при желании могут быть увеличены в 2, 4 или 6 раз.
  Последняя модификация алгоритма планирования заключается в том, что когда окно становится окном переднего плана, все его потоки получают более длительные кванты времени. Величина прибавки интервала времени хранится в системном реестре. Таким образом, поток получает больше процессорного вре­мени, и, соответственно, достигается лучшее обслуживание для окна, перемещен­ного на передний план.
 8.2.4. Загрузка Windows 2000
 
  Прежде чем операционная система Windows 2000 сможет начать работу, она долж­на загрузиться. Процесс загрузки создает начальные процессы. С точки зрения аппаратного обеспечения, процесс загрузки состоит из чтения первого сек­тора первого диска (главной загрузочной записи), после чего управление передается прочитанной програм­ме. Эта короткая программа на ассемблере считывает таблицу разделов, что­бы определить, в каком разделе содержится загружаемая операционная система. Найдя раздел с операционной системой, начальный загрузчик считывает первый сектор этого раздела, называемый загрузочным сектором, и передает управление ему. Программа, содержащаяся в загрузочном секторе, считывает корневой ката­лог своего дискового раздела, находит в нем файл ntldr. Если этот файл удается найти, он загружается в память и ему передается управление. Программа ntldr загружает операционную систему Windows 2000. Существует не­сколько версий загрузочного сектора в зависимости от формата раздела (FAT-16, FAT-32 или NTFS). При установке Windows 2000 на диск записываются соответ­ствующие версии главной загрузочной записи и загрузочного сектора.
  Затем программа ntldr считывает файл Boot.ini, представляющий собой един­ственный файл с информацией о конфигурации, не содержащейся в реестре. Он хранит в себе списки всех версий файлов hal.dll и ntoskernl.exe, которые могут быть загружены с данного раздела диска. В этом файле также содержатся такие пара­метры, как количество центральных процессоров и оперативной памяти, сколько памяти отводить процессу пользователя (2 или 3 Гбайт), а также на какой часто­те работают часы реального времени. Затем программа ntldr выбирает и загру­жает файлы hal.dll и ntoskernl.exe, а также файл bootvid.dll, представляющий собой видеодрайвер по умолчанию. Он обеспечивает вывод на дисплей во время процес­са загрузки. После этого программа ntldr считывает реестр, чтобы найти драйверы, необходимые для завершения загрузки (например, драйверы клавиатуры и мыши, а также десятки других драйверов, требуемых для управления различными микро­схемами на материнской плате). Наконец, загрузчик считывает все эти драйверы и передает управление программе ntoskernl.exe.
  После запуска операционная система выполняет некоторые общие процедуры инициализации, а затем вызывает компоненты исполняющей системы, чтобы те также выполнили собственную инициализацию. Например, менеджер объектов подготавливает свое пространство имен, чтобы другие компоненты могли обра­щаться к нему и добавлять свои объекты в пространство имен. Многие компонен­ты также выполняют определенные действия, относящиеся к их функциям. В частности, менеджер памяти настраивает начальные таблицы страниц, а менеджер plug-and-play определяет, какие устройства ввода-вывода присутствуют, и загружает их драйверы. Вся загрузка состоит из десятков этапов, в течение которых на экране отображается полоса прогресса, растущая по мере выполнения очередных этапов. Последний этап заключается в создании первого настоящего пользовательского процесса – сеансового менеджера smss.exe. Как только этот процесс начинает рабо­ту, загрузка считается законченной.
  Сеансовый менеджер представляет собой «родной» процесс операционной системы Windows 2000. Он обращается к истинным системным вызовам и не пользуется вызовами подсистемы окружения Win32, которая в тот момент еще даже не работает. Одной из его первоочередных обязанностей является запуск этой подсистемы (csrss.exe). Он также считывает с диска ульи реестра и узнает из них, что еще он должен сделать. Как правило, его работа заключается в помещении мно­жества объектов в пространство имен менеджера объектов, создании дополнитель­ных файлов подкачки и открытии нужных DLL. Завершив свою работу, сеансо­вый менеджер создает демон регистрации winlogon.exe.
  В этот момент операционная система загружена и работает. Теперь пора запус­тить служебные процессы (демоны в пространстве пользователя) и позволить пользователям регистрироваться в системе. Сначала winlogon.exe создает менед­жера аутентификации (lsass.exe), а затем запускает родительский процесс всех слу­жебных процессов (sennces.exe). Последний процесс по информации, хранящейся в реестре, определяет, какие демоны в пространстве пользователя нужно запустить и в каких файлах они находятся. После этого он приступает к их созданию. Как правило, уже после того, как первый пользова­тель зарегистрировался в системе, но еще до того, как он успел в ней что-либо сделать, в операционной системе Windows 2000 наблюдается высокая активность с большим количеством обращений к диску. Это программа services.exe создает системные службы. Кроме того, она загружает все оставшиеся (еще не загружен­ные) драйверы устройств.
  Программа winlogon.exe также отвечает за регистрацию всех пользователей в системе. После успешного входа пользователя в систему про­грамма winlogon.exe получает из реестра профиль пользователя и определяет по нему, какую оболочку запустить. Стан­дартный рабочий стол Windows представляет собой программу explorer.exe, у которой настроены некоторые параметры. При желании пользо­ватель может выбрать в качестве оболочки другую программу, для чего ему нужно просто отредактировать реестр. Отметим, что редактирование реестра требует особой внимательности и осторожности, а всего одна допущенная ошибка может сделать систему незагружаемой.
 
 8.3. Управление памятью в Windows 2000
 
 8.3.1. Основные понятия
 
  В операционной системе Windows 2000 у каждого пользовательского процесса есть собственное виртуальное адресное пространство. Виртуальные адреса 32-разряд­ные, поэтому у каждого процесса 4 Гбайт виртуального адресного пространства. Нижние 2 Гбайт за вычетом около 256 Мбайт доступны для программы и данных процесса; верхние 2 Гбайт защищенным образом отображаются на память ядра. Страницы виртуального адресного пространства имеют фиксированный размер (4 Кбайт на компьютере с процессором Pentium) и подгружаются по требованию. Нижние и верхние 64 Кбайт каждого виртуального адресного пространства в обычном состоянии не отображаются на физическую память. Это делается преднамеренно, что­бы облегчить перехват программных ошибок. Недействительные указатели часто имеют значение 0 или -1, и попытки их использования в системе Windows 2000 вызовут немедленное прерывание вместо чтения или, что еще хуже, записи слова по неверному адресу. Однако когда запускаются старые программы MS-DOS в ре­жиме эмуляции, нижние 64 Кбайт могут отображаться на физическую память.
  Начиная с адреса 64 К, могут располагаться приватные данные и программа пользователя. Они могут занимать почти 2 Гбайт. Последний фрагмент этих 2 Гбайт памяти содержит некоторые системные указатели и таймеры, используемые со­вместно всеми пользователями в режиме доступа «только чтение». Отображение этих данных в эту область памяти позволяет всем процессам получать к ним дос­туп без лишних системных вызовов.
  Верхние 2 Гбайт виртуального адресного пространства содержат операционную систему, включая код, данные и выгружаемый и невыгружаемый пулы (использу­емые для объектов и т. д.). Верхние 2 Гбайт используются совместно всеми про­цессами, кроме таблиц страниц, которые являются индивидуальными для каждо­го процесса. Верхние 2 Гбайт процессам в режиме пользователя запрещены для записи, а по большей части также запрещены и для чтения. Причина, по которой они размещаются здесь, заключается в том, что когда поток обращается к систем­ному вызову, он переключается в режим ядра, но остается все тем же потоком. Если сделать всю операционную систему и все ее структуры данных (как и весь пользо­вательский процесс) видимыми в адресном пространстве потока, когда он переклю­чается в режим ядра, то отпадает необходимость в изменении карты памяти или выгрузке кэша при входе в ядро. Все, что нужно сделать, – это переключиться на стек режима ядра. Платой за более быстрые системные вызовы при данном подходе является уменьшение приватного адресного пространства для каждого процес­са. Большим базам данных уже сейчас становится тесно в таких рамках, вот поче­му в версиях Windows 2000 Advanced server и Datacenter Server есть возможность использования 3 Гбайт для адресного пространства пользовательских процессов.
  Каждая виртуальная страница может находиться в одном из трех состояний: свободном, зарезервированном и фиксированном. Свободная страница не исполь­зуется в настоящий момент, и ссылка на нее вызывает страничное прерывание. Когда процесс запускается, все его страницы находятся в свободном состоянии, пока программа и исходные данные не будут отображены на их адресное простран­ство. Как только данные или программа отображаются на страницу, страница на­зывается фиксированной. Обращение к фиксированной странице преобразуется при помощи аппаратного обеспечения виртуальной памяти и завершается успехом, если эта страница находится в оперативной памяти. В противном случае происхо­дит страничное прерывание, операционная система находит требуемую страницу на диске и считывает ее в оперативную память.
  Виртуальная страница может также находиться в зарезервированном состоя­нии, в таком случае эта страница не может отображаться, пока резервирование не будет явно удалено. Например, когда создается новый поток, в виртуальном ад­ресном пространстве резервируется 1 Мбайт пространства для стека, но фиксиру­ется только одна страница. Такая техника означает, что стек может вырасти до 1 Мбайт без опасения, что какой-либо другой поток захватит часть необходимого непрерывного виртуального адресного пространства. Помимо состояния (свободная, зарезервированная или фиксированная), у страниц есть также и другие атрибуты, например страница может быть доступной для чтения, записи или исполнения.
  При выделении фиксированным страницам места резервного хранения исполь­зуется интересный компромисс. Простая стратегия в данном случае состояла бы в отведении для каждой фиксированной страницы одной страницы в файле подкач­ки во время фиксации страницы. Это означало бы, что всегда есть место, куда за­писать каждую фиксированную страницу, если потребуется удалить ее из памяти. Недостаток такой стратегии заключается в том, что при этом может потребовать­ся файл подкачки размером со всю виртуальную память всех процессов. На боль­шой системе, которой редко требуется выгрузка виртуальной памяти на диск, та­кой подход приведет к излишнему расходованию дискового пространства. Чтобы не тратить пространство на диске понапрасну, в Windows 2000 фиксиро­ванным страницам, у которых нет естественного места хранения на диске (напри­мер, страницам стека), не выделяются страницы на диске до тех пор, пока не настанет необходимость их выгрузки на диск. Такая схема усложняет систему, так как во время обработки страничного прерывания может понадобиться обращение к фай­лам, в которых хранится информация о соответствии страниц, а чтение этих файлов может вызвать дополнительные страничные прерывания. С другой стороны, для страниц, которые никогда не выгружаются, пространства на диске не требуется.
  Подобный выбор (усложнение системы или увеличение производительности и дополнительные функции), как правило, разрешается в пользу последнего, так как достоинства лучшей производительности и большего числа функций очевид­ны, тогда как недостатки усложнения системы (сложность поддержки и увеличе­ние частоты сбоев) бывает сложно учесть.
  У свободных и зарезервированных страниц никогда не бывает теневых страниц на диске и обращение к ним всегда приво­дит к страничным прерываниям. Теневые страницы на диске организованы в один или несколько файлов под­качки. Может быть организовано до 16 файлов подкачки, для повышения произ­водительности операций ввода-вывода они могут быть распределены по отдель­ным дискам, которых также может быть до 16. У каждого файла есть начальный размер и максимальный размер, до которого он может вырасти при необходимос­ти. Эти файлы могут сразу быть созданы максимального размера во время уста­новки системы, чтобы уменьшить вероятность их сильной фрагментации, но с по­мощью панели управления позднее можно создать новые файлы. Операционная система следит за тем, какие виртуальные страницы на какую часть файла подкач­ки отображаются. Страницы, содержащие исполняемый текст программ, не дуб­лируются в файлах подкачки. В файлах подкачки хранятся только изменяемые страницы.
  В Windows 2000, как и во многих версиях UNIX, файлы могут отображаться напрямую на области виртуального адресного пространства (то есть занимать мно­жество соседних страниц). После того, как файл отображен на адресное простран­ство, он может читаться и писаться при помощи обычных команд обращения к памяти. Отображаемые на память файлы реализуются тем же способом, что и фик­сированные страницы, но теневые страницы хранятся не в файле подкачки, а в файле пользователя. Поэтому при отображении файла на память версия файла, находящаяся в памяти, может отличаться от дисковой версии (вследствие записи в виртуальное адресное пространство). Однако когда отображение файла прекра­щается или файл принудительно выгружается на диск, дисковая версия снова при­водится в соответствие с последними изменениями файла в памяти.
  В Windows 2000 два и более процессов могут одновременно отображать на свои виртуальные адресные пространства, возможно, в различные адреса, одну и ту же часть одного и того же файла. Читая и записывая сло­ва памяти, процессы могут общаться друг с другом и передавать друг другу ин­формацию с очень большой скоростью, так как копирование при этом не требует­ся. У различных процессов могут быть различные права доступа. Поскольку все процессы, использующие отображаемый на память файл, совместно используют одни и те же страницы, изменения, произведенные одним процессом, немедленно становятся видимыми для всех остальных процессов, даже если файл на диске еще не был обновлен. Также предпринимаются меры, благодаря которым процесс, от­крывающий файл для нормального чтения, видит текущие страницы в ОЗУ, а не устаревшие страницы с диска.
  Следует отметить, что при совместном использовании двумя программами од­ного файла DLL может возникнуть проблема, если одна из программ изменит ста­тические данные файла. Если не предпринять специальных действий, то другой процесс увидит измененные данные, что, скорее всего, не соответствует намерени­ям этого процесса. Эта проблема решается таким способом: все отображаемые стра­ницы помечаются как доступные только для чтения, хотя в то же время некоторые из них тайно помечаются как в действительности доступные и для записи. Когда к такой странице происходит обращение операции записи, создается приват­ная копия этой страницы и отображается на память. Теперь в эту страницу мож­но писать, не опасаясь задеть других пользователей или оригинальную копию на диске. Такая техника называется копированием при записи.
 
 
 8.3.2. Реализация управления памятью
 
  В операционной системе Windows 2000 поддерживается подгружаемое по тре­бованию одинарное линейное 4-гигабайтное адресное пространство для каждого процесса. Сегментация в любой форме не поддерживается. Теоретически размер страниц может быть любой степенью двух, вплоть до 64 Кбайт. На компьютерах с процессором Pentium страницы имеют фиксированный размер в 4 Кбайт. На компьютерах с процессором Itanium они могут быть 8 или 16 Кбайт. Кроме того, сама операционная система может использовать страницы по 4 Мбайт, чтобы снизить размеры таблицы страниц.
  В отличие от планировщика, выбирающего отдельные потоки для запуска и не заботящегося о процессах, менеджер памяти занимается исключительно процесса­ми и не беспокоится о потоках, так как именно процессы, а не потоки вла­деют адресным пространством, которым занимается менеджер памяти. При выде­лении области виртуального адресного пространства менеджер памяти создает для нее описатель виртуаль­ной памяти VAD (Virtual Address Descriptor), в котором хранится информация о диапазоне отображаемых адресов, файле резервного хранения и смещении в файле для отображаемой части файла, а также режим доступа. Когда происходит обращение к первой странице, создается каталог таблиц страниц, а указатель на нее помещается в описатель виртуальной памяти. Адресное пространство полнос­тью описывается списком своих описателей виртуальной памяти. Такая схема по­зволяет поддерживать несплошные адресные пространства, так как неиспользуе­мые области между отображаемыми областями не потребляют ресурсов.
  В операционной системе Windows 2000 опережающая подкачка страниц не ис­пользуется ни в каком виде. Когда запускается процесс, в памяти не находится ни одной страницы процесса. При каждом страничном прерывании происходит пе­редача управления ядру. Ядро формирует машинно-независимый описатель, в который помещается инфор­мация о том, что случилось, и передает его части исполняющей системы, выпол­няющей функции менеджера памяти. Менеджер памяти проверяет полученный описатель на корректность. Если страница, вызвавшая прерывание, попадает в фик­сированную или зарезервированную область, он ищет адрес в списке описателей виртуальной памяти, находит (или создает) таблицу страниц и ищет в ней соот­ветствующий элемент. Элементы таблицы страниц различаются в разных архитектурах. У неотображаемых страниц также есть записи в таблице, но их формат несколько отличается. Например, если неотображаемая страница должна быть обнулена перед употреблением, этот факт отражается в таблице.
  Страничные прерывания подразделяются на пять категорий:
  1.Страница, к которой было обращение, не является фиксированной.
  2.Произошло нарушение защиты.
  3.Запись в совместно используемую страницу.
  4.Стеку требуется дополнительная память.
  5.Страница, к которой было обращение, является фиксированной, но в насто­ящий момент она не загружена в память.
  Первый и второй случаи представляют собой фатальные ошибки, которые не могут быть исправлены или проигнорированы. У третьего случая симптомы схо­жи со вторым (попытка записи в страницу, для которой разрешено только чтение), но лечение этого случая возможно. В этом случае страница копируется в новый физический страничный блок, после чего для копии разрешается чтение/запись. Таким образом, работает копирование при записи. Если совместно используемая страница помечена как доступная для записи во всех процессах, использующих ее, страничного прерывания при записи в такую страницу не возникает и копии при записи не возникает также. В четвертом случае требуется выделение нового стра­ничного блока и его отображение. Однако правила безопасности требуют, чтобы эта страница содержала только нули, что не позволяет новому процессу узнать, чем занимался предыдущий владелец страницы. Таким образом, нужно найти страни­цу, содержащую одни нули или, если это невозможно, нужно выделить другой страничный блок и обнулить его на месте. Наконец, пятый случай представляет собой нормальное страничное прерывание. Менеджер памяти находит страницу на диске и считывает ее в память.
  Отметим, что операционная система Windows 2000 не читает отдельные страницы прямо с дис­ка. Вместо этого считывается несколько последовательных страниц, как правило, от 1 до 8, чтобы минимизировать количество обращений к диску. Для страниц, со­держащих код программы, используются серии из большего числа страниц, чем при считывании страниц данных.
  Замена страниц происходит следующим образом. Система пытается поддерживать определенное количество свободных страниц в памяти, чтобы, когда произойдет страничное прерывание, свободная страница могла быть найдена немедленно, без необходимости сначала записать несколько других страниц на диск. В результате применения такой стратегии большинство страничных прерываний удовлетворя­ются при помощи всего одной дисковой операции (чтения страницы с диска), хотя иногда приходится выполнять две операции (запись на диск «грязной» страницы, после чего с диска читается требуемая страница). Конечно, страницы, пополняющие список свободных страниц, должны откуда-то поступать. Поэтому настоящая работа алгоритма замещения страниц характери­зуется тем, как эти страницы забираются у процессов и помещаются в список сво­бодных страниц.
  В системе подкачки активно использует­ся понятие рабочего набора. У каждого процесса (не у каждого потока) есть рабо­чий набор. Этот набор состоит из отображенных страниц, находящихся в памяти, при обращении к которым, следовательно, не происходит страничных прерываний. Размер и состав рабочего набора, естественно, меняются по мере работы процесса. Рабочий набор каждого процесса описывается двумя параметрами: минималь­ным и максимальным размерами. Эти размеры не являются жесткими границами. Процесс может иметь в памяти меньше страниц, чем значение нижней границы, или (при определенных обстоятельствах) больше установленного максимума. Вначале эти границы одинаковы для каждого процесса, но они могут меняться со временем. Начальное значение минимума по умолчанию находится в диапазоне от 20 до 50 страниц, а начальное значение максимума по умолчанию находится в диапазоне от 45 до 345 страниц, в зависимости от общего объема оперативной па­мяти. Значения по умолчанию могут быть изменены системным администратором.
  Если происходит страничное прерывание, а размер рабочего набора меньше минимального значения, то к рабочему набору добавляется страница. С другой стороны, если происходит страничное прерывание, а размер рабочего набора боль­ше максимального значения, то из рабочего набора (но не из памяти) изымается страница, чтобы выделить место для новой страницы. Этот алгоритм означает, что в операционной системе Windows 2000 используется локальный алгоритм, не по­зволяющий процессу получить слишком много памяти, что предотвращает при­чинение процессами ущерба друг другу. Однако система пытается настроить эти параметры. Например, если она замечает, что один процесс слишком активно за­нимается подкачкой (а остальные процессы нет), система может увеличить значе­ние максимального предела для рабочего набора. Таким образом, алгоритм пред­ставляет собой смесь локальных и глобальных решений. Тем не менее существует абсолютный предел размера рабочего набора: даже если в системе работает всего один процесс, он не может занять последние 512 страниц, чтобы оставить немного оперативной памяти для новых процессов.
  Раз в секунду выделенный демон-поток ядра, называемый менеджером балансового множества, проверяет, доста­точно ли в системе свободных страниц. Если свободных страниц меньше, чем нуж­но, он запускает менеджер рабочих наборов, который исследует рабочие наборы и освобождает дополнительные страницы. Менеджер рабочих наборов сначала определяет порядок, в котором нужно исследовать процессы. В первую очередь страницы отнимаются у больших процессов, которые бездействовали в течение долгого времени. В последнюю очередь рассматривается процесс переднего плана. Затем менеджер рабочих наборов начинает исследование процессов в выбран­ном порядке. Если рабочий набор процесса в настоящий момент оказывается мень­ше своего нижнего предела или с момента последней инспекции число странич­ных прерываний у этого процесса было выше определенного уровня, то страницы у него не отнимаются. В противном случае менеджер рабочих наборов отнимает у процесса одну или несколько страниц. Количество забираемых у процесса стра­ниц довольно сложным образом зависит от общего объема ОЗУ, а также от того, насколько много требуется памяти текущим процессам, и от того, как размер текущего рабоче­го набора соотносится с верхним и нижним пределами, и кроме того от других парамет­ров. Все страницы рассматриваются по очереди.
  На однопроцессорной машине если бит обращений к странице сброшен, то счетчик, связанный со страницей, увеличивается на единицу. Если этот бит уста­новлен в единицу, счетчик обнуляется. После сканирования из рабочего набора удаляются страницы с наибольшими значениями счетчика. Поток продолжает изу­чать процессы, пока он не высвободит достаточного количества страниц, после чего он останавливается. Если полный перебор всех процессов не привел к освобождению достаточного числа страниц, менеджер рабочих наборов начинает второй проход, на котором он уже при необходимости отнимает страницы у процессов, размер рабочего набора кото­рых меньше минимального.
  На многопроцессорной машине алгоритм, основанный на проверке бита обраще­ний, уже не работает, так как, хотя текущий центральный процессор не обращался в последнее время к данной странице, к ней могли обращаться другие централь­ные процессоры. Исследование же битов обращений всех центральных процессо­ров представляет собой слишком дорогое удовольствие. Поэтому бит обращений вообще не учитывается, а удаляются самые старые страницы.
  Следует отметить, что с точки зрения процедуры замены страниц операцион­ная система сама рассматривается как процесс. Она владеет страницами и у нее также есть рабочий набор. Этот рабочий набор тоже может быть уменьшен. Одна­ко некоторые части системы и невыгружаемый пул фиксированы в памяти и не могут выгружаться ни при каких обстоятельствах.
  Каждая страница памяти находится в одном или не­скольких рабочих наборах или в одном из пяти списков. В списке «чистых» (резервных) и в списке «грязных» (модифицированных) страниц учитываются страницы, которые недавно были удалены из рабочих набо­ров, но все еще находятся в памяти и все еще ассоциированы с процессами, ис­пользовавшими их. Различие между ними заключается в том, что у чистых стра­ниц есть копия на диске, тогда как у модифицированных страниц таких копий нет, и эти страницы еще предстоит сохранить. В список свободных страниц входят чи­стые страницы, уже не ассоциированные ни с какими процессами. В список обну­ленных страниц входят страницы, не ассоциированные ни с какими процессами и заполненные нулями. Пятый список состоит из физически дефектных страниц памяти. Это гарантирует, что эти страницы ни для чего не используются.
  Страницы перемещаются между рабочими наборами и различными списками менеджером рабочих наборов и другими потоками-демонами ядра. Рассмотрим эти переходы. Когда менеджер рабочих наборов удаляет страницу из рабочего набора, страница попадает на дно списка чистых страниц или списка модифицирован­ных страниц в зависимости от своего состояния. В обоих списках хранятся действительные страницы, поэтому если про­исходит страничное прерывание и требуется одна из этих страниц, она удаляется из списка и возвращается в свой рабочий набор без операции дискового ввода-вывода. Когда процесс завершает свою работу, то все его страницы, которые не используются другими процессами, попадают в список свободных страниц. Эти страницы уже не ассоциированы с каким-либо процессом и не могут возвра­щаться в рабочие наборы по страничному прерыванию. Другие переходы вызываются другими демонами. Один раз в 4 секунды запускается поток свопера в поисках процесса, все потоки которого бездействовали в течение опре­деленного интервала времени. Если ему удается найти такие процессы, он открепляет стеки этих процессов и перемещает страницы процессов в списки «чистых» и «грязных» страниц.
  Два других демона, демон записи отображенных страниц и демон записи моди­фицированных страниц, активизируются время от времени, чтобы проверить, доста­точно ли чистых страниц. Если количество чистых страниц ниже определенного уровня, они берут страницы из верхней части списка модифицированных страниц, записывают их на диск, а затем помещают их в список «чистых» страниц. Пер­вый демон занимается записью в отображаемые файлы, а второй пишет страницы в файлы подкачки. В результате их деятельности «грязные» страницы становятся «чистыми».
  Причина наличия двух демонов, занимающихся очисткой страниц, заключа­ется в том, что отображаемый на память файл может вырасти в результате записи в него. При этом росте потребуются новые свободные блоки диска. Отсутствие в памяти свободного места для записи в него страниц может привести к взаимо­блокировке. Второй поток может вывести ситуацию из тупика, записывая страни­цы в файл подкачки, который никогда не увеличивается в размерах.
  Если процесс освобождает страницу, эта страница более не связана с процессом и может быть помещена в список свобод­ных страниц, если только она не используется совместно другими процессами. Когда страничное прерывание требует страничный блок, чтобы поместить в него страницу, которая должна быть считана, этот блок по возможности берется из списка свободных страниц. Не имеет значения, что эта страница может все еще содержать конфиденциальную информацию, так как вся она будет тут же целиком перезаписана. При увеличении стека ситуация складывается иная. В этом случае требуется пустой страничный блок и правила безопасности требуют, чтобы страница содержала все нули. По этой причине другой демон ядра – поток обнуления страниц – работает с минимальным приоритетом, стирая содержимое страниц в списке свободных страниц и помещая их в список обнуленных стра­ниц. Когда центральный процессор простаивает и в списке свободных страниц есть страницы, поток обнуления страниц может обнулять их, так как обнуленная страница более полезна, чем просто свободная страница.
  Для отслеживания всех страниц и всех списков операционная система Win­dows 2000 содержит базу данных страничных блоков, состоящую из записей по числу страниц ОЗУ. Эта таблица проиндексирована по номеру физи­ческого страничного блока. Записи таблицы имеют фиксированную длину, но для различных типов записей используются различные форматы (например, для дей­ствительных записей и для недействительных). Действительные записи содержат информацию о состоянии страницы, а также счетчик, хранящий число ссылок на эту страницу в таблицах страниц. Этот счетчик позволяет системе определить, ког­да страница уже более не используется. Если страница находится в рабочем наборе, то в записи также указывается номер рабочего набора. Кроме того, в записи содер­жится указатель на таблицу страниц, в которой есть указатель на эту страницу (если такая таблица страниц есть). Страницы, используемые совместно, учитыва­ются особо. Также запись содержит ссылку на следующую страницу в списке (если такая есть) и различные другие поля и флаги, такие как «страница читается», «страница пишется» и т. д.
  Итак, управление памятью представляет собой очень сложную подсистему с большим количеством структур данных, алгоритмов и эвристических методов. Во многом она является саморегулируемой, но у нее есть также много механизмов, которые может использовать системный администратор, чтобы влиять на про­изводительность системы. Следует подчеркнуть, что управление памятью в реальных системах намного сложнее простого алгорит­ма подкачки, вроде алгоритма часов или алгоритма старения.
 
 8.4. Ввод-вывод в системе Windows 2000
 
 8.4.1. Основные понятия
 
  Менеджер ввода-вывода родственен менеджеру plug-and-play. Основная идея ме­ханизма plug-and-play заключается в настраиваемой шине. За многие годы было разработано множество шин, включая PC Card, PCI, USB, IEEE 1394 и SCSI, по­этому менеджер plug-and-play может послать каждому разъему запрос и попросить устройство назвать себя. Определив, что за устройство подключено к шине, менед­жер plug-and-play выделяет для него аппаратные ресурсы, такие как уровни пре­рываний, находит необходимые драйверы и загружает их в память. При загрузке каждого драйвера для него создается объект драйвера. Для некоторых шин, напри­мер SCSI, настройка происходит только во время загрузки операционной системы. Для других шин, таких как USB и IEEE 1394, она может производиться в любой момент, для чего требуется тесный контакт между менеджером plug-and-play, драй­вером шины (который и выполняет настройку) и менеджером ввода-вывода.
  Менеджер ввода-вывода также тесно связан с менеджером энергопотребления. Менеджер энергопотребления может перевести компьютер в одно из семи состо­яний, которые можно примерно описать следующим образом:
  1.Полностью действующий.
  2.Режим сниженного энергопотребления-1: мощность, потребляемая централь­ным процессором, снижается, ОЗУ и кэш работают, возможен мгновенный переход в режим полного действия.
  3.Режим сниженного энергопотребления-2: центральный процессор и ОЗУ работают; кэш центрального процессора отключен; возможно продолжение работы с текущего значения счетчика команд.
  4.Режим сниженного энергопотребления-3: центральный процессор и кэш отключены; ОЗУ работает; возможен перезапуск с фиксированного адреса.
  5.«Зимняя спячка»: центральный процессор, кэш и ОЗУ отключены; возмо­жен перезапуск из сохраненного на диске файла.
  6. Выключен: все выключено; требуется полная перезагрузка.
  Устройства ввода-вывода также могут находиться в различных состояниях. Включением и выключением этих устройств занимаются вместе менеджер энер­гопотребления и менеджер ввода-вывода. Обратите внимание, что состояния со 2 по 6 используются, только если центральный процессор бездействовал в течение определенного времени.
  Формально все файло­вые системы представляют собой драйверы ввода-вывода. Обращения к блокам диска от пользовательских процессов сначала посылаются менеджеру кэша. Если менеджер кэша не может удовлетворить запрос из кэша, он просит менеджер вво­да-вывода вызвать драйвер соответствующей файловой системы, чтобы тот полу­чил требуемый блок с диска.
  Windows 2000 поддерживает асинхрон­ный ввод-вывод. Поток может начать операцию ввода-вывода, а затем продол­жить выполнение параллельно с вводом-выводом. Такая возможность особенно важна для серверов. Существует множество способов, с помощью которых по­ток может определить, что операция ввода-вывода завершена. Один из способов состоит в создании в момент обращения к вызову ввода-вывода объекта события, а потом ожидания этого события. Другой способ заключается в указании очереди, в которую будет послано сообщение о завершении операции ввода-вывода. Третий способ заключается в предоставлении процедуры обратного вызова, к которой обращается система, когда операция ввода-вывода завершена.
 8.4.2. Реализация ввода-вывода в Windows 2000
 
  Основная функция менеджера ввода-вывода за­ключается в создании каркаса, в котором могут работать различные устройства вво­да-вывода. Структуру каркаса образуют набор независимых от устройств процедур для определенных аспектов ввода-вывода и набор загруженных драйве­ров для общения с устройствами.
  Чтобы гарантировать, что драйверы устройств хорошо работают с остальной час­тью системы Windows 2000, корпорация Microsoft определила для драйверов мо­дель Windows Driver Model, которой драйверы устройств должны соответство­вать. Более того, корпорация Microsoft также предоставляет набор инструментов, который должен помочь разработчикам драйверов в создании драйверов, соответ­ствующих модели Windows Driver Model. Согласующиеся с ней драйверы должны удовлетворять всем сле­дующим требованиям (а также некоторым другим):
  1. Обрабатывать входящие запросы ввода-вывода, поступающие в стандарт­ном формате.
  2. Основываться на объектах, как и остальная часть системы Windows 2000.
  3. Позволять динамическое добавление или удаление устройств plug-and-play.
  4. Допускать, когда это возможно, управление энергопотреблением.
  5. Допускать реконфигурацию в терминах использования ресурсов.
  6. Быть реентерабельными для возможности их использования на мультипро­цессорах.
  Запросы ввода-вывода передаются драйверам в виде стандартизированных пакетов, называемых IRP (Input/output Request Packet – пакет запроса ввода-вывода). Драйверы, согласующиеся с моделью Windows Driver Model, должны уметь обрабатывать пакеты IRP. Драйвер должен поддерживать работу с объекта­ми, то есть поддерживать определенный список методов, к которым может обра­щаться остальная система. Он также должен корректно работать с другими объек­тами операционной системы Windows 2000, доступ к которым осуществляется при помощи дескрипторов объектов.
  Драйверы, согласующиеся с моделью Windows Driver Model, должны полнос­тью поддерживать устройства plug-and-play. Это означает, что если устройство, управляемое драйвером, внезапно добавляется в систему или удаляется из систе­мы, драйвер должен быть готов к получению данной информации и корректной реакции на эту информацию, даже в том случае, если устройство удаляется в момент обращения к нему. Также драйверы должны поддерживать управление энергопот­реблением для тех устройств, для которых это возможно. Например, если система решает, что теперь пора перейти в режим низкого энергопотребления, все драйве­ры должны поддерживать этот режим, чтобы сберегать энергию. Они также долж­ны поддерживать обратный переход в режим нормального функционирования.
  Драйвер должен быть настраиваемым, что означает отсутствие каких бы то ни было встроенных предположений о линиях прерываний или портах ввода-выво­да, используемых определенным устройством. Драйверы устройств также должны работать на многороцессорных машинах, так как под­держка многопроцессорности была заложена в операционную систему Windows 2000 при разработке. Это требование означает, это во время обработки драйвером запро­са от одного центрального процессора может прийти запрос от другого центрально­го процессора. Второй центральный процессор может начать выполнение програм­мы драйвера одновременно с первым центральным процессором. Драйвер должен функционировать корректно, даже когда он вызывается одновременно двумя и более центральными процессорами. Это означает, что доступ ко всем чувствитель­ным структурам данных должен предоставляться только внутри критических об­ластей. Простое предположение, что других обращений к драйверу не будет, пока не завершится обработка текущего обращения к нему, недопустимо.
  В операционной системе UNIX обращение к драйверам производится по номеру главного устройства. В Windows 2000 применяется другая схема. Во время загруз­ки операционной системы или в тот момент, когда в систему добавляется новое устройство plug-and-play, поддерживающее установку системы без перезагрузки, операционная система Windows 2000 автоматически обнаруживает его и вызывает менеджер plug-and-play. Менеджер plug-and-play запрашивает у устройства назва­ние фирмы-производителя и номер модели устройства. Вооружившись данными сведениями, он ищет драйвер для данного устройства в определенном каталоге на жестком диске. Если этого драйвера нет, он отображает диалоговое окно, в котором пользователю предлагается вставить гибкий диск или CD-ROM с драйвером. Ког­да драйвер обнаружен, он загружается в память.
  Каждый драйвер должен поставлять набор процедур, которые могут быть вы­званы для получения требуемого обслуживания. Первая процедура, называемая DriverEntry, инициализирует драйвер. Она вызывается сразу после загрузки драйве­ра. Процедура может создавать таблицы и структуры данных, но не должна обращать­ся к самому устройству. Она также заполняет некоторые поля объекта драйвера, созданного менеджером ввода-вывода при загрузке драйвера. Поля в объекте драй­вера включают указатели на все остальные процедуры, предоставляемые драйвером.
  Кроме того, для каждого устройства, управляемого драйвером (например, для каждо­го диска IDE, управляемого драйвером диска IDE), создается объект устройства и инициализируется так, чтобы он указывал на объект драйвера. При наличии объекта устройства можно легко найти объект драйвера и, таким образом, обращаться к его методам.
  Вторая процедура драйвера называется AddDevice. Она вызывается менедже­ром plug-and-play всего один раз для каждого добавляемого устройства. После этого драйвер вызывается первым пакетом IRP, который устанавливает вектор прерываний и инициализирует аппаратуру. Кроме того, драйвер должен содержать процедуру обработки прерываний, различные процедуры, управляющие таймера­ми, путь быстрого ввода-вывода, управление DMA, позволять прервать исполня­ющийся текущий запрос и многое другое.
  В Windows 2000 драйвер должен сам выполнять всю работу. С другой сто­роны, в системе Windows 2000 могут существовать стеки драйверов. Это означает, что запрос может проходить через целую последовательность драйверов, каждый из которых выполняет свою часть работы. Стеки драйверов позволяют отделить управление шиной от управления соб­ственно устройством. Например, управление шиной PCI отличается большой сложностью, что вызвано большим количеством режимов и транзакций шины. Таким образом, отделение управления шиной от управления устройством, подключенным к данной шине, облегчает работу по созданию драйвера. Программисту, пишущему драйвер устройства, более не нужно изучать вопрос управления шиной. Он может просто использовать стандартный драйвер шины, находящийся в стеке драйверов. У драй­веров USB и SCSI есть части, специфичные для конкретных устройств, и общая часть, для которой используются отдельные драйверы.
  Кроме того, стеки драйверов позволяют добавлять в стек драйверы-фильтры. Фильтрующий драйвер выполняет некоторые преобразования проходящих через них данных. Например, фильтрующий драйвер может сжать данные по пути к дис­ку или зашифровать их по дороге в сеть. Помещение драйверного фильтра в стек драйверов означает, что ни прикладная программа, ни настоящий драйвер устрой­ства не должны знать о присутствии фильтрующего драйвера и что фильтрующий драйвер работает автоматически для всех данных, поступающих с устройства или на устройство.
 
 8.5. Файловые системы Windows 2000
 
 8.5.1. Файловые системы типа FAT
 
  Операционная система Windows 2000 кроме новой файловой системы NTFS, разработанной специально для Windows NT, поддерживает несколько устаревших файловых систем типа FAT операционной системы MS-DOS.
  Логический раздел, отформатированный под файловую систему FAT (File Allocation Table – таблица размещения файлов), состоит из следующих областей:
  1.Загрузочный сектор содержит программу начальной загрузки операционной системы. Вид этой программы зависит от типа операционной системы, которая будет загружаться из этого раздела.
  2. Основная копия FAТ содержит информацию о размещении файлов и катало­гов на диске.
  3. Резервная копия FAT.
  4. Корневой каталог занимает фиксированную область размером в 32 сектора (16 Кбайт), что позволяет хранить 512 записей о файлах и каталогах, так как каждая запись каталога состоит из 32 байт.
  5. Область данных предназначена для размещения всех файлов и всех каталогов, кроме корневого каталога.
  Файловая система FAT поддерживает всего два типа файлов: обычный файл и каталог. Файловая система распределяет память только из области данных, причем использует в качестве минимальной единицы дискового пространства кластер.
  Таблица FAT (как основная копия, так и резервная) состоит из массива индексных указателей, количество которых равно количеству кластеров области данных. Между кластерами и индексными указателями имеется взаимно однозначное соответствие – нулевой указатель соответствует нулевому кластеру и т.д.
  Индексный указатель может принимать следующие значения, характеризующие состояние связанного с ним кластера:
  – кластер свободен (не используется);
  – кластер используется файлом и не является последним кластером фййла (в этом случае индексный указатель содержит номер следующего файла);
 последний кластер файла;
 дефектный кластер;
 резервный кластер.
  Таблица FAT является общей для всех файлов раздела. В исходном состоянии (после форматирования) все кластеры раздела свободны и все индексные указатели (кроме тех, которые соответствуют резервным и дефектным блокам) принимают значение «кластер свободен». При размещении файла ОС просматривает FAT, начиная с начала, и ищет первый свободный индексный указатель. После его обнаружения в поле записи каталога «номер первого кластера» фиксируется номер этого указателя. В кластер с этим номером записываются данные файла, он становится первым кластером файла. Если файл умещается в одном кластере, то в указатель, соответствующий данному кластеру, заносится специальное значение «последний кластер файла». Если же размер файла больше одного кластера, то ОС продолжает просмотр FAT и ищет следующий указатель на свободный кластер. После его обнаружения в предыдущий указатель заносится номер этого кластера, который теперь становится следующим кластером файла. Процесс повторяется до тех пор, пока не будут размещены все данные файла. Таким образом создается связный список всех кластеров файла.
  В начальный период после форматирования файлы будут размещаться в последовательных кластерах области данных, однако после определенного количества удалений файлов кластеры одного файла окажутся в произвольных местах области данных, чередуясь с кластерами других файлов.
  Размер таблицы FAT и разрядность используемых в ней индексных указателей определяется количеством кластеров в области данных. Для уменьшения потерь из-за фрагментации желательно кластеры делать небольшими, а для сокращения объема адресной информации и повышения скорости обмена наоборот – чем больше, тем лучше. При форматировании диска под файловую систему FAT обычно выбирается компромиссное решение и размеры кластеров выбираются из диапазона от 1 до 128 секторов, или от 512 байт до 64 Кбайт.
  Очевидно, что разрядность индексного указателя должна быть такой, чтобы в нем можно было задать максимальный номер кластера для диска определенного объема. Существует несколько разновидностей FAT, отличающихся разрядностью индексных указателей, которая и используется в качестве условного обозначения: FAT12, FAT16 и FAT32. В файловой системе FAT16 используются 16-разрядные указатели, что позволяет поддерживать до 65 536 кластеров в области данных диска, а в FAT32 – 32-разрядные указатели для более чем 4 миллиардов кластеров.
  Таблица FAT при фиксированной разрядности индексных указателей имеет пе­ременный размер, зависящий от объема области данных диска. При удалении файла из файловой системы FAT в первый байт соответствующей записи каталога заносится специальный признак, свидетельствующий о том, что эта запись свободна, а во все индексные указатели файла заносится признак «кла­стер свободен». Остальные данные в записи каталога, в том числе номер первого кластера файла, остаются нетронутыми, что оставляет шансы для восстановле­ния ошибочно удаленного файла. освобождения записи. Очевидно, что надежно можно восстановить только файлы, которые были расположены в последовательных кластерах диска, так как при отсутствии связного списка выявить принадлежность произвольно расположенного кластера удаленному файлу невозможно (без анализа содержимого кластеров, выполняемого пользователем «вручную»).
  Резервная копия FAT всегда синхронизируется с основной копией при любых операциях с файлами, поэтому резервную копию нельзя использовать для oтмены ошибочных действий пользователя, выглядевших с точки зрения системы вполне корректными. Резервная копия может быть полезна только в том случае, когда секторы основной памяти окaзывaютcя физически поврежденными и не читаются.
  Используемый в FAT метод хранения адресной информации о файлах не отличается большой надежностью – при разрыве списка индексных указателей в одном месте, например из-за сбоя в работе программного кода ОС по причине внешних электромагнитных помех, теряется информация обо всех последующих кластерах файла.
  Файловые системы FAT12 и FAT16 оперировали с именами файлов, состоящими из 12 символов по схеме «8.3». В версии FAT16 операционной системы Win­dows NT был введен новый тип записи каталога – «длинное имя», что позволяет использовать имена длиной до 255 символов, причем каждый символ длинного имени хранится в двухбайтном формате. Имя по схеме «8.3», называемое теперь коротким, по-прежнему хранится в 12-байтовом поле имени файла в записи каталога, а длинное имя помещается порциями по 13 символов в одну или несколько записей, следующих непосредственно за основной записью каталога. Каждый символ кодируется двумя байтами, поэтому 13 символов занимают 26 байт, а оставшиеся 6 байт отведены под служебную информацию. Таким образом у файла имеется два имени – короткое для совместимости со старыми приложениями, не понимающими длинных имен, и длинное имя, удобное в использовании. Файловая система FAT32 также под­держивает короткие и длинные имена.
  Файловые системы FAT12 и FAT16 получили большое распространение благо­даря их применению в операционных системах MS-DOS и Windows 3.x – самых массовых операционных системах первого десятилетия эры персональных ком­пьютеров. По этой причине эти файловые системы поддерживаются сегодня и
 другими ОС, такими как UNIX, OS/2, Windows 95/98/ME и Windows NT/2000/XP. Однако из-за постоянно растущих объемов жестких дисков, а также возрастающих требований к надежности, эти файловые системы практически вытеснены вначале сиcтемой FAT32, впервые появившейся в Windows 95 OSR2, а затем и файловыми сиcтемами других типов.
 
 8.5.2. Файловая система типа NTFS
 
  Система NTFS (New Technology File System – файловая система новой технологии) представляет собой новую сложную файловую систему, разработанную специально для Windows NT и перене­сенную в Windows 2000. Эта фай­ловая система не является попыткой улучшить старую файловую систему MS-DOS.
  Длина имени файла в системе NTFS ограничена 255 символами, полная длина пути ограничивается 32 767 символами. Файл в системе NTFS – это не просто линейная последовательность байтов, как файлы в системах FAT-32 и UNIX. Вместо этого файл состоит из множества атрибутов, каждый из которых представляется в виде потока байтов. Большинство файлов имеет несколько коротких потоков, таких как имя файла и его 64-битовый идентификатор, плюс один длинный (неименованный) поток с данными. Однако у файла может быть и несколько длинных потоков данных. У каждого потока своя длина. Каждый поток может блокировать­ся независимо от остальных потоков. Максимальная длина потока составляет 16 экзабайт (2 в степени 64 байт). Для отслеживания местонахождения процесса в каждом потоке используются 64-разрядные файловые указатели.
  Вызовы функций Win32 API для управления файлами и каталогами в первом приближении подобны соответствующим им в UNIX, но у функций Win32 API больше параметров и другая модель безопасности. Процедура откры­тия файла возвращает дескриптор файла, который затем может использоваться для чтения этого файла или записи в файл. Для графических приложений заранее не определены указатели в файлах. Стандартные потоки ввода, вывода и сообщений об ошибках при необходимости должны открываться явно. Однако в консольном режиме они открываются заранее. Интерфейс Win32 также содержит ряд допол­нительных вызовов, отсутствующих в системе UNIX.
  Каждый том NTFS (то есть дисковый раздел) содержит файлы, каталоги, битовые массивы и другие структуры данных. Каждый том организован как линейная последовательность блоков (кластеров по терминологии Microsoft). Размер блока фиксирован для каждого тома и варьируется в пределах от 512 байт до 64 Кбайт, в зависимости от размера тома. Для большинства дисков NTFS используются блоки размером в 4 Кбайт как компромисс между большими блоками (для эф­фективности операций чтения/записи) и маленькими блоками (для уменьшения потерь дискового пространства на внутреннюю фрагментацию). Обращение к бло­кам осуществляется по их смещению от начала тома, для которого используются 64-разрядные числа.
  Главной структурой данных в каждом томе является главная файловая табли­ца MFT (Master File Table), представляющая собой линейную последовательность записей фиксированного (1 Кбайт) размера. Каждая запись MFT описывает один файл или один каталог. В ней содержатся атрибуты файла, такие как его имя и временные штампы, а также список дисковых адресов, указывающих на располо­жение блоков файла. Если файл очень большой, то иногда бывает необходимо ис­пользовать две и более записей главной файловой таблицы, чтобы вместить спи­сок всех блоков файла. В этом случае первая запись MFT, называемая базовой записью, указывает на другие записи MFT.
  Сама главная файловая таблица представляет собой файл и, как и любой файл, может располагаться в любом месте тома, тем самым устраняется проблема дефект­ных секторов на первой дорожке дискового раздела. Кроме того, этот файл может при необходимости возрастать до максимального размера в 248 записей.
  Главная файловая таблица имеет следующую структуру.
  Каждая запись MFT состоит из последовательности пар (заголовок атрибута, значение). Каждый атрибут начинается с заголовка, идентифицирующего этот атрибут и сообщающе­го длину значения, так как некоторые атрибуты, например имя файла или данные, могут иметь переменную длину. Если значение атрибута достаточно короткое, что­бы поместиться в запись MFT, оно помещается туда. Если же это значение слиш­ком длинное, оно располагается в другом месте диска, а в запись MFT помещается указатель на него. Первые 16 записей MFT зарезервированы для файлов метаданных NTFS. Каждая запись описывает нормальный файл, у которого есть атрибуты и блоки данных, как у любого файла. У каждого такого файла есть имя, начинающееся с символа доллара, указывающего на то, что это файл мета­данных. Первая запись описывает сам файл MFT. В частности, она содержит ин­формацию о расположении блоков файла MFT, что позволяет системе найти файл MFT. Очевидно, чтобы найти всю остальную информацию о файловой системе, у операционной системы Windows 2000 должен быть некий способ нахождения первого блока файла MFT. Номер первого блока файла MFT содержится в загру­зочном блоке, куда он помещается при установке системы.
  Запись 1 представляет собой дубликат первой части файла MFT. Эта инфор­мация является настолько ценной, что наличие второй копии может быть необхо­димо на случай, если один из первых блоков главной файловой таблицы вдруг ста­нет дефектным. Запись 2 представляет собой журнал. Когда в файловой системе производятся структурные изменения, такие как добавление нового каталога или удаление существующего каталога, информация о предстоящей операции реги­стрируется в журнале. Таким образом, увеличивается вероятность корректного восстановления файловой системы в случае сбоя во время выполнения операции. Изменения атрибутов файлов также регистрируются здесь. В этом журнале не регистрируются только изменения данных пользователя. В записи 3 содержится информация о томе, например его размер, метка и версия.
  Как уже отмечалось, каждая запись MFT содержит последо-вательность пар (заголовок атрибута, значение). Файл $AttrDef является тем местом, в котором определяются атрибуты. Информация об этом файле хранится в записи 4 табли­цы MFT. В следующей записи содержатся данные о корневом каталоге, который сам представляет собой файл и может произвольно увеличиваться в размерах. Он описывается записью 5 главной файловой таблицы.
  Свободное место на диске учитывается с помощью битового массива. Битовый массив сам является файлом, и его атрибуты и дисковые адреса хранятся в запи­си 6 таблицы MFT. Следующая запись таблицы MFT указывает на файл начальной загрузки. Запись 8 используется для того, чтобы связать вместе все дефектные блоки и гарантировать, что они никогда не встретятся в файлах. Запись 9 содер­жит информацию о защите. Запись 10 используется для преобразования регистра. Наконец, запись 11 представляет собой каталог, содержащий раз­личные файлы для дисковых квот, идентификаторов объектов, точек повторного анализа и т. д. Последние четыре записи MFT зарезервированы на будущее.
  Каждая запись MFT состоит из заголовка записи, за которым следует после­довательность пар (заголовок атрибута, значение). Заголовок записи содержит: магическое число, используемое для проверки действительности записи; поряд­ковый номер, обновляемый каждый раз, когда запись используется для нового файла; счетчик обращений к файлу; действительное количество байт, использу­емых в записи; идентификатор (индекс, порядковый номер) базовой записи (используемый только для записей расширения), а также другие различные поля. Следом за заголовком записи располагается заголовок первого атрибута, за кото­рым идет значение первого атрибута, потом заголовок второго атрибута, значение второго атрибута и т. д.
  В файловой системе NTFS определено 13 атрибутов, которые могут появ­ляться в записях MFT. Все записи таблицы MFT состоят из последовательности заголовков атрибутов, каждый из которых иден­тифицирует следующий за ним атрибут, а также содержит длину и расположе­ние поля значения вместе с разнообразными флагами и прочей информацией. Как правило, значения атрибутов располагаются непосредственно за заголовками, но если длина значения слишком велика, чтобы поместиться в запись таблицы MFT, она может быть помещена в отдельный блок диска. Такой атрибут называ­ется нерезидентным атрибутом. Например, таким атрибутом является атрибут данных. Некоторые атрибуты, такие как атрибуты имени, могут повторяться, но все атрибуты должны располагаться в записи MFT в фиксированном поряд­ке. Длина заголовков резидентных атрибутов 24 байт, заголовки для нерезидент­ных атрибутов длиннее, так как они содержат информацию о месте расположения атрибута.
  Стандартное информационное поле содержит сведения о владельце файла, ин­формацию о защите, временные штампы (необходимые для стандарта POSIX), счет­чик жестких связей, бит «только чтение», архивный бит и т. д. Это поле имеет фик­сированную длину, и оно всегда присутствует.
  В операционной системе Windows NT 4.0 информация о защите файла могла содержать­ся в атрибуте файла, но в Windows 2000 эти данные хранятся в отдельном файле, что позволяет нескольким файлам совместно пользоваться общими описателями защиты. Список атрибутов нужен на случай, если атрибуты не помещаются в за­пись MFT. Каждая запись в списке содержит 48-разрядный индекс в таблице MFT, указывающий на запись расширения, а также 16-разрядный порядковый номер, позволяющий проверить соответствие записи расширения и базовой записи.
  Атрибут «идентификатор объекта» задает файлу уникальный номер. Иногда он используется внутри системы. Точка повторного анализа велит процедуре, анализирующей имя файла, выполнить специальные действия. Этот механизм применя­ется для монтирования устройств и символьных ссылок. Два следующих атрибу­та используются только для идентификации тома. Еще три атрибута используют­ся для реализации каталогов. Небольшие каталоги представляют собой простые списки файлов, но большие каталоги реализуются в виде деревьев. Поток дан­ных утилиты регистрации используется шифрующей файловой системой.
  Имя потока данных, если оно присутствует, располагается в заголов­ке атрибута данных. Следом за этим заголовком располагается либо список дисковых ад­ресов, определяющий положение файла на диске, либо сам файл (для небольших файлов длиной в несколько сотен байтов). Метод по­мещения самого содержимого файла в запись MFT называется непосредственным файлом.
  Для увеличения эффективности дисковые блоки файлам назначаются по воз­можности в виде серий последовательных блоков (сегментов файла). Например, если первый логический блок файла помещается в блоке 20 на диске, тогда систе­ма будет стараться выделить для второго блока этого файла блок 21, для третье­го – блок 22 и т. д. Один из способов выделения файлам таких серий блоков за­ключается в том, чтобы предоставлять файлам сразу по несколько блоков.
 
  Блоки в файле описываются последовательностью записей, каждая из которых описывает последовательность логически непрерывных блоков. Непрерывный файл описывается всего одной записью. К этой категории относятся файлы, за­писываемые за одну операцию от начала до конца. Файл с одной «дыркой» (на­пример файл, для которого определены только блоки с 0 по 49 и с 60 по 79), будет описываться двумя записями. Такой файл может быть создан, если сначала запи­сать в него первые 50 блоков, затем переместить указатель в файле на логический блок 60 и записать еще 20 блоков. Когда из такого файла читается «дырка», все отсутствующие байты оказываются нулями.
  Каждая запись начинается с заголовка, определяющего смещение первого бло­ка в файле. Затем располагается смещение первого блока, не покрываемого пер­вой записью. Следом за каждым заголовком располагаются пары, в которых содержатся дисковые адреса и длины серий блоков. Эти дисковые адреса представляют собой смещение блока от начала дискового раздела. Длина серии – это количество бло­ков в серии. В записи серии может содержаться любое необходимое количество пар.
  Для хранения больших фрагментированных файлов может быть использовано несколько записей таблицы MFT. Проблема может возникнуть, если потребуется так много записей MFT, что в базовой записи не поместятся все индексы MFT. Эта проблема решается следу­ющим образом: список записей MFT делается нерезидентным (то есть хранится отдельно на диске, а не в базовой записи MFT). В этом случае его размер уже ничем не ограничен.
  Запись MFT для небольшого каталога со­держит несколько каталоговых записей, каждая из которых описывает файл или каталог. Фиксированная часть содержит индекс записи MFT файла, длину имени файла, а также другие разнообразные поля и флаги. Поиск файла в каталоге по имени состоит в последовательном переборе всех имен файлов. Для больших каталогов используется другой формат. Вместо того чтобы линей­но перечислять файлы, используется дерево, обеспечивающее поиск в алфа­витном порядке и упрощающее добавление в каталог новых имен в соответству­ющие места.
  Помимо обычных файлов и каталогов, файловая система NTFS поддерживает жесткие связи, подобные используемым в UNIX, а также символьные ссылки при помощи механизма, называемого точками повторного анализа. Файл или каталог может быть помечен как точка повторного анализа, и с ним может быть ассоци­ирован блок данных. Когда во время анализа имени файла встречается такой файл или каталог, срабатывает обработка исключения и интерпретируется блок данных. Блок может выполнять различные действия, включая переадресацию поиска, ссы­лаясь на другую часть дерева каталогов или даже на другой дисковый раздел. Этот механизм используется для поддержки как символьных ссылок, так и монтиров­ки файловых систем.
  Файловая система NTFS поддерживает прозрачное сжатие файлов. Файл может быть создан в сжатом режиме. Это означает, что файловая система NTFS будет ав­томатически пытаться сжать блоки этого файла при записи их на диск и автомати­чески распаковывать их при чтении. Процессы, читающие этот файл или пишу­щие в него, не будут даже догадываться о том, что при этом происходит компрессия или декомпрессия данных.
  Сжатие данных файла происходит следующим образом. Когда файловая сис­тема NTFS записывает на диск файл, помеченный для сжатия, она изучает первые 16 логических блоков файла, независимо от того, сколько сегментов на диске они занимают. Затем к этим блокам применяется алгоритм сжатия. Если полученные на выходе блоки могут поместиться в 15 или менее блоков, то сжатые данные за­писываются на диск, предпочтительно в виде одного сегмента. Если получить вы­игрыш хотя бы в один блок не удается, то данные 16 блоков так и записываются в несжатом виде. Затем весь алгоритм повторяется для следующих 16 блоков и т. д.
  В операционной системе Windows 2000 предусмотрена возможность шифрования файлов. Чтобы использовать шифрование в операционной системе Windows 2000, нужно пометить каталог как зашифрованный, в результате чего будут зашифрованы все файлы в этом каталоге, а все новые файлы, перемещен­ные в этот каталог или созданные в нем, также будут зашифрованы. Само шифро­вание и дешифрование выполняется не файловой системой NTFS, а специальным драйвером EPS (Encrypting File System – шифрующая файловая система), разме­щающимся между NTFS и пользовательским процессом. Таким образом, приклад­ная программа не знает о шифровании, а сама файловая система NTFS только частично вовлечена в этот процесс.
 
 
 8.6. Безопасность в Windows 2000
 
 8.6.1. Основные понятия
 
  Операци­онная система Windows 2000 обладает рядом достаточно совершенных и эффективных свойств безопасности, включая следующие:
  1. Безопасная регистрация в системе с мерами предосторожности против по­пыток применения фальшивой программы регистрации.
  2. Дискреционное управление доступом.
  3. Управление привилегированным доступом.
  4. Защита адресного пространства для каждого процесса.
  5. Обнуление страниц перед выделением их процессу.
  6. Аудит безопасности.
  Безопасная регистрация означает, что системный администратор может потре­бовать ото всех пользователей наличия пароля для входа в систему. Дискреционное управление доступом позволяет владельцу файла или другого объекта указать, кто может пользоваться объектом и каким образом. Средства управления привилегированным доступом позволяют системному администрато­ру (суперпользователю) получать доступ к объекту, несмотря на установленные его владельцем разрешения доступа. Под защитой адресного пространства имеется в виду лишь то, что у каждого процесса есть собственное защищенное виртуаль­ное адресное пространство, недоступное для любого неавторизованного процесса. Следующий пункт означает, что при увеличении стека выделяемые для него стра­ницы заранее обнуляются, так что процесс не может обнаружить в них информа­ции, помещенной предыдущим владельцем страницы памяти (страницы подаются процессам из списка обнуленных страниц). Наконец, аудит безопасности следует понимать как регистрацию системой в журнале опре­деленных событий, относящихся к безопасности. Впоследствии этот журнал может просматривать системный администратор.
  У каждого пользователя (и группы) операционной системы Windows 2000 есть идентификатор безопасности SID (Security IDentifier), по которому операцион­ная система отличает его от других пользователей. Идентификаторы безопаснос­ти представляют собой двоичные числа с коротким заголовком, за которым следу­ет длинный случайный компонент. Каждый SID должен быть уникален в пределах всей планеты. Когда пользователь запускает процесс, этот процесс и его потоки работают под идентификатором пользователя. Большая часть системы безопасно­сти спроектирована так, чтобы гарантировать предоставление доступа к каждому объекту только потокам с авторизованными идентификаторами безопасности.
  У каждого процесса есть маркер доступа, в котором указывается SID и другие свойства. Как правило, он назначается при регистрации в системе процедурой winlogon. Заголовок маркера содержит некоторую админи­стративную информацию. По значению поля срока действия можно определить, когда маркер перестанет быть действительным. Поле Groups (группы) указывает группы, к которым принадлежит процесс. Это поле необходимо для соответствия требованиям стандарта POSIX. Поле Default DACL (Default Discretionary Access Control List – список разграничительного контроля доступа по умолчанию) представляет собой список управ­ления доступом, назначаемый объектам, созданным процессом, если не опреде­лены другие списки ACL. Идентификатор безопасности пользователя указывает пользователя, владеющего процессом. Ограниченные идентификаторы SID по­зволяют ненадежным процессам принимать участие в заданиях вместе с надеж­ными процессами, но с меньшими полномочиями и меньшими возможностями причинения ущерба.
  Наконец, перечисленные в маркере привилегии (если они перечислены) дают процессу особые полномочия, такие как право выключать компьютер или полу­чать доступ к файлам, к которым в противном случае в этом доступе процессу было бы отказано. Привилегии позволяют разбить полномочия системного админист­ратора на отдельные права, которые могут предоставляться процессам по отдель­ности. Таким образом, пользователю может быть предоставлена часть полномо­чий суперпользователя, но не все его полномочия. Итак, маркер доступа содержит информацию о том, кто владеет процессом и какие умолчания и полномочия ассо­циированы с ним.
  Когда пользователь регистрируется в системе, процесс winlogon назначает мар­кер доступа начальному процессу. Последующие процессы, как правило, наследу­ют этот маркер. Маркер доступа процесса изначально применяется ко всем пото­кам процесса. Однако поток во время исполнения может получить другой маркер доступа. В этом случае маркер доступа потока перекрывает маркер доступа про­цесса. В частности, клиентский поток может передать свой маркер доступа сервер­ному потоку, чтобы сервер мог получить доступ к защищенным файлам и другим объектам клиента. Такой механизм называется перевоплощением.
  Другим основным понятием является дескриптор защиты. У каждого объекта есть ассоциированный с ним дескриптор защиты, содержащий список пользова­телей и групп, имеющих доступ к данному объекту. Дескриптор защиты состоит из заголовка, за которым следует список DACL с одним или несколькими элемен­тами АСЕ (Access Control Entry – элемент списка контроля доступа ACL). Два основных типа элементов списка – это разрешение и запрет доступа. Разрешаю­щий элемент содержит SID пользователя или группы и битовый массив, опре­деляющий набор операций, которые процессы с данным идентификатором SID могут выполнять с определенным объектом. Запрещающий элемент работает ана­логично, но совпадение идентификаторов означает, что обращающийся процесс не может выполнять перечисленные операции.
  Кроме списка DACL у дескриптора защиты есть также список SACL (System Access Control List – системный список контроля доступа), который похож на DACL, только вместо пользователей и групп, имеющих доступ к объекту, в нем перечисляются операции с этим объектом, регистрируемые в специальном журна­ле. В операционной системе Windows 2000 также пре­доставляются дополнительные возможности аудита для регистрации доступа к объектам.
 8.6.2. Реализация защиты в Windows 2000
 
  Защита в автономной системе Windows 2000 реализуется при помощи нескольких компонентов. Регистрацией в системе управляет программа winlogon, а аутентификацией занимаются Isass и msgina.dll. Результатом успешной регистрации в системе является новая оболочка с ассоци­ированным с ней маркером доступа. Этот процесс использует в реестре ключи SECURITY и SAM. Первый ключ определяет общую политику безопасности, а вто­рой ключ содержит информацию о защите для индивидуальных пользователей.
  Как только пользователь регистрируется в системе, выполняется операция защиты при открытии объекта. Для каждого вызова ОрепХХХ требуется имя откры­ваемого объекта и набор прав доступа к нему. Во время обработки процедуры от­крытия объекта менеджер безопасности проверяет наличие у вызы­вающего процесса соответствующих прав доступа. Для этого он просматривает все маркеры доступа вызывающего процесса, а также список DACL, ассоциированный с объектом. Он просматривает по очереди элементы списка ACL. Как только он находит запись, соответствующую идентификатору SID вызывающего процесса или одной из его групп, поиск прав доступа считается законченным. Если вызыва­ющий процесс обладает необходимыми правами, объект открывается, в противном случае в открытии объекта отказывается.
  Помимо разрешающих записей, списки DACL могут также содержать запре­щающие записи. Поскольку менеджер безопасности прекращает поиск, наткнув­шись на первую запись с указанным идентификатором, запрещающие записи по­мещаются в начало списка DACL, чтобы пользователь, которому строго запрещен доступ к какому-либо объекту, не смог получить его как член какой-либо группы, которой этот доступ предоставлен.
  После того как объект открыт, дескриптор объекта возвращается вызываю­щему процессу. При последующих обращениях проверяется, входит ли данная операция в число операций, разрешенных в момент открытия объекта, что­бы, например, не допустить записи в файл, открытый для чтения.
 
 Резюме
 
  Структура операционной системы Windows 2000 включает в себя уровень аппа­ратных абстракций HAL, ядро, исполняющую систему и тонкий уровень систем­ных служб, перехватывающий входящие системные вызовы. Кроме того, опера­ционная система содержит множество драйверов устройств, включая файловую систему и интерфейс графических устройств GDI. Уровень HAL скрывает от верхних уровней определенные различия в аппаратуре. Ядро пытается скрыть от исполняющей системы остальные различия, чтобы сделать ее почти полностью машинно-независимой.
  В основе исполняющей системы лежат объекты памяти. Пользовательские процессы создают их и получают дескрипторы, позволяющие управлять этими объектами. Компоненты исполняющей системы также могут создавать объекты. Менеджер объектов управляет пространством имен, в которое могут добавляться объекты для возможности их поиска по имени.
  Операционная система Windows 2000 поддерживает процессы, задания, пото­ки и волокна. У процессов есть виртуальные адресные пространства, кроме того, процессы являются контейнерами ресурсов. Потоки представляют собой едини­цы исполнения и планируются операционной системой. Волокна являются уп­рощенными потоками, планируемыми полностью в пространстве пользователя. Задания представляют собой наборы процессов и используются для выделения квот ресурсов. При планировании используется приоритетный алгоритм, в кото­ром управление получает готовый поток с максимальным приоритетом.
  Операционной системой Windows 2000 поддерживается виртуальная память с подкачкой по требованию. Алгоритм подкачки основан на понятии рабочего набо­ра. Система управляет несколькими списками свободных страниц, так что когда происходит страничное прерывание, как правило, у системы уже есть доступная страница. Списки свободных страниц получают страницы, отнимаемые у рабочих наборов при помощи сложных алгоритмов, пытающихся изымать в первую оче­редь давно не использовавшиеся страницы.
  Ввод-вывод осуществляется драйверами устройств, согласующимися с моде­лью Windows Driver Model. При запуске каждого драйвера инициализируется объект драйвера, содержащий адреса процедур, к которым может обращаться опе­рационная система, чтобы добавить новое устройство или выполнить операцию ввода-вывода. Драйверы могут собираться в стеки или действовать как фильтры.
  В основе файловой системы NTFS лежит главная файловая таблица MFT, в ко­торой содержится по одной записи для каждого файла или каталога. У каждого файла есть множество атрибутов, которые могут храниться в записи таблицы MFT или вне таблицы – на диске. Среди прочих возможностей файловая система NTFS под­держивает сжатие и шифрование.
  Защита основывается на списках управления доступом ACL. У каждого про­цесса есть маркер управления доступом, идентифицирующий процесс, а также указывающий, какими особыми привилегиями он обладает. С каждым объектом ассоциирован дескриптор защиты. Дескриптор защиты указывает на список раз­граничительного управления доступом DACL, содержащий записи списка ACL, разрешающие или запрещающие доступ к этому объекту отдельным пользовате­лям или группам.
 Контрольные вопросы и задания
 
 1. Опишите структурное построение ОС Windows 2000.
 2. Каковы функции так называемого уровня аппаратных абстракций Windows 2000?
 3. Охарактеризуйте ядро ОС Windows 2000.
 4. Какие объекты носят наименование управляющих объектов?
 5. Перечислите объекты, которые относятся к типу объектов диспетчеризации.
 6. Представьте состав исполняющей системы Windows 2000.
 7. Какие функции выполняет менеджер объектов?
 8. Какова роль менеджера процессов?
 9. Для выполнения каких функций применяется интерфейс графических устройств GDI?
 10. Опишите реализацию объектов в Windows 2000.
 11. Какие компоненты системы Windows 2000 работают в режиме пользователя?
 12. Перечислите интерфейсы прикладного программирования API, поддерживаемые Windows 2000.
 13. Дайте определения понятиям «задание», «процесс», «поток», «волокно» в Windows 2000.
 14. Опишите способы межпроцессного взаимодействия в Windows 2000.
 15. Как осуществляется реализация процессов и потоков в Windows 2000?
 16. Перечислите этапы загрузки ОС Windows 2000.
 17. Что понимается под виртуальной страницей памяти и в каких состояниях она может находиться?
 18. Как реализуется управление памятью в ОС Windows 2000?
 19. Опишите реализацию ввода-вывода в ОС Windows 2000.
 20. Какие режимы поддерживает менеджер энергопотребления?
 21. Охарактеризуйте файловые системы типа FAT.
 22. Представьте особенности организации файловой системы NTFS и ее достоинства по сравнению с файловыми системами типа FAT.
 23. Какова структура главной файловой таблицы MFT в NTFS?
 24. Каким образом производится сжатие данных файла в NTFS?
 25. Перечислите и охарактеризуйте основные понятия системы безопасности Windows 2000.
 26. Опишите особенности реализации защиты в ОС Windows 2000.Заключение
 
  Основными функциями операционных систем являются функции управления процессами и ресурсами вычислительных машин и систем. Процессы и ресурсы – это ключевые понятия операционных систем. За время своего существования процессы могут неоднократно изменять свое состояние, проходя через стадии создания, готовности, выполнения, ожидания и завершения своей работы. Операционная система организует планирование выполнения процессов, обеспечивает процессы необходимыми системными ресурсами, поддерживает взаимодействие процессов и решает проблемы их синхронизации.
  При управлении таким важнейшим ресурсом, как память вычислительной машины, операционная система контролирует наличие свободной и занятой памяти, выделяет память для выполнения процессов и освобождает память после завершении процессов, реализует вытеснение процессов из оперативной памяти на дисковую память и возвращение их обратно в оперативную память, обеспечивает настройку адресов программы на конкретную область физической памяти.
  Управляя устройствами ввода-вывода, операционная система передает устройствам соответствующие команды, перехватывает прерывания, обрабатывает ошибки, обеспечивает интерфейс между устройствами ввода-вывода и остальной частью машины. Для освобождения процессора от операций последовательного вывода данных из оперативной памяти или последовательного ввода в нее используется механизм прямого доступа внешних устройств к памяти.
  Возможность управления файлами со стороны операционной системы на логическом уровне структур данных и операций обеспечивают различные типы файловых систем. Файловая система представляет собой набор спецификаций и соответствующее им про­граммное обеспечение, которые отвечают за создание, уничтожение, организацию, чтение, запись, модификацию и перемещение файловой информации, а также за управление доступом к файлам и за управление ресурсами, которые используют­ся файлами.
  В операционных системах для многопроцессорных вычислительных машин сложность планирования процессов существенно возрастает, так как требуется не только решение вопросов очередности запуска процессов на выполнение, но и выбор центрального процессора, на котором должен быть запущен тот или иной процесс.
  В многомашинных вычислительных системах механизмы организации межпроцессной взаимосвязи принципиально отличаются от организации такой взаимосвязи в автономных вычислительных машинах. Базой для взаимодействия процессов в автономных машинах служит общая разделяемая память. Многомашинные вычислительные системы по определению не имеют общей разделяемой памяти, и поэтому основой межпроцессной взаимосвязи в них служит обмен физическими сообщениями посредством коммуникационной среды.
  Операционные системы многомашинных вычислительных систем распределенного типа – вычислительных сетей – обычно называют сетевыми. Фундаментальным понятием сетевых операционных систем, позволяющим определить и реализовать взаимодействие удаленных процессов, является понятие сетевого протокола.
  Наиболее совершенным и перспективным классом операционных систем являются так называемые распределенные операционные системы. Распределенная система создает для пользователя полную иллюзию того, что он работает в обычной автономной системе. Эффективным способом построения распределенных операционных систем является установка специального промежуточного уровня программного обеспечения поверх сетевой операционной сис­темы, который предоставляет приложениям определенную однородность взаимодействия. Среди различных типов про­межуточного программного обеспечения следует выделить документное, файловое, объектное и координационное.
  Основными принципами построения современных операционных систем являются принципы модульности, генерируемости, функциональной избыточности, виртуализации, совместимости с другими системами, открытости, легкой наращиваемости, мобильности, обеспечения надежной безопасности. Операционные системы прошли длительный путь развития и совершенствования своей архитектуры от монолитных систем до хорошо структурированных модульных систем, способных к развитию, расширению и легкому переносу на новые платформы. При модульном построении в системе выделяется некоторая часть важных программных модулей, которые для более эффективной организации вычис­лительного процесса должны постоянно находиться в оперативной памяти. Эту группу модулей называют ядром операционной системы. Другие системные программные модули (транзитные или диск-резидентные) загружаются в оперативную память только при необходимости, а в случае отсутствия свободного пространства могут быть замещены другими транзитными модулями. Для использования прикладными программами системных ресурсов операционной системы и реализуемых ею функций пред­назначен интерфейс прикладного программирования, который может быть реализован как на уровне операционной системы, так и на уровне системы программирования или на уровне внешней библиотеки процедур и функций.
  Прообразом современных операционных систем являются разработанные в середине 1950-х годов системы пакетной обработки, которые были первыми системными программами, предназначенными для управления вычислительным процессом. Следующим этапом эволюции операционных систем стала разработка в 1960-х годах универсальных систем, которые были способны работать на разных типах вычислительных машин, имеющих различный набор периферийных устройств и используемых в разных областях человеческой деятельности. Существенным достижением систем этого периода явилась реализация многозадачного режима и спулинга.
  Важнейшей вехой в истории и современном состоянии операциионных систем является семейство многопользовательских многозадачных систем UNIX. UNIX получила несколько ветвей развития исходной архитектуры. Двумя главными из таких ветвей стали System V (корпорации AT&T) и BSD (Калифорний­ского университета в Беркли). Впоследствии на основе обеих этих ветвей был создан ряд новых версий ОС UNIX. Третья самостоятельная ветвь развития UNIX начиналась с относительно простой «учебной» системы MINIX, за которой в 1991 году последовала зна­чительно более мощная многоза­дачная многопользовательская ОС LINUX. Операционные системы типа UNIX широко используется на вычислительных маши­нах различных классов от ноутбуков до суперкомпьютеров.
  Для персональных компьютеров клона IBM PC были разработаны однопользовательские однозадачные операционные системы типа MS-DOS корпорации Microsoft и их аналоги других корпораций. Управление компьютером в среде MS-DOS осуществлялось в режиме командной строки. Для того, чтобы сделать общение с компьютером более простым, были предложены так называемые программы-оболочки, представляющие собой программные надстройки операционной системы, позволяющие пользователю осуществлять действия по управлению ресурсами компьютера в рамках более развитого и удобного, чем командная строка, псевдографического интерфейса. Следующим историческим шагом в развитии оболочек операционных систем стало появление в 1986 г. графической многооконной операционной оболочки Windows от корпорации Microsoft, которая работала на базе MS-DOS, а основой пользовательского интерфейса Windows послужил так называемый графический интерфейс пользователя GUI, представляющий собой иерархически организованную систему окон и других графических объектов. Дальнейшим развитием семейства Microsoft Windows стала разработка полноценных операционных систем Windows 95 (Windows 4.0) и Windows NT, положившим начало двух ветвей ОС от Microsoft: Windows 95/98/ME и Windows NT/2000/XP/2003.
  Линия систем «новой технологии» Windows NT принципиально отличается от линии Windows 9.х. В качестве фундаментальных компонентов в состав семейства Windows NT входят развитый сетевой сервис, поддержка работы высокопроизводительных многопроцессорных вычислительных комплексов, средства обеспечения эффективной безопасности. На смену версии Windows NT 4.0. в 2000 году пришла существенно усовершенствованная и усиленная ОС Windows 2000 Professional. Серверной версией Windows 2000 Professional является система Windows 2000 Server, включающаяет множество дополнительных специальных функций. В конце 2001 г. корпорация Microsoft выпустила новую версию – Windows XP, продолжившую линию Win­dows NT. Новая серверная версия Windows Server 2003 обладает рядом преимуществ по сравнению с Windows 2000 Server.
  Значительную роль в развитии ОС играет фирма Novell со своим сетевым операционными системами семейства NetWare. Историческое значение имеет система OS/2 корпорации IBM, которая появилась на рынке раньше Windows 95 и была первой 32-х разрядной операционной системой для персональных компьютеров.
  Следует отметить также некоторые специализированные системы, например, предназначенные исключительно для выполнения коммуникационных задач или ориентированные на определенную аппаратную платформу компьютеров.
  Любая из современных операционных систем имеет свои особенности построения и практической реализации, применяет те или иные способы и механизмы управления процессами и ресурсами, использует различные по степени универсальности и совместимости прикладные интерфейсы, обладает разным уровнем функциональности и может позиционироваться для определенных сфер применения. Для каждой из систем можно указать ее преимущества и недостатки, сильные и слабые стороны. Естественно, что предприятию или отдельному пользователю хотелось бы работать с оптимальной операционной системой, удовлетворяющей комплексу наиболее важных требований. «Идеальная» операционная система скорее всего должна иметь такую же степень интеграции и такую же поддержку, как Microsoft Windows 2000/XP/Server 2003, такую же превосходную отказоустойчивость, как Solaris 8 компании Sun Microsystems, такую же службу справочника, какой снабжена Novell NetWare 5.1, а также универсальность и гибкость, свойственные системе Linux.
  Подобно другим программным продуктам информационных технологий, операционные системы постоянно совершенствуются. Основное внимание при разработке новых версий операционных систем уделяется базовым службам (файловые службы, службы печати, защиты, аутентификации, службы справочника), средствам управления, масштабируемости, применимости, надежности, службам Интернет, интрасетей и электронной коммерции. Та компания, которая в своей версии операционной системы лучше других обеспечивает эти качества, становится лидером продаж на рынке. Конкурентная борьба, как хорошо известно, является лучшим двигателем прогресса, в том числе и в области операционных систем.
  Каждая из компаний – игроков на рынке операционных систем – имеет собственные планы дальнейшего развития своих продуктов.
  Например, в ближайших (на момент подготовки данного учебного пособия) планах корпорации Microsoft выпуск новых версий Windows XP. К ним относятся Windows XP Media Center Edition (MCE) 2004, включающая несколько новых специализированных модулей и призванная превратить персональный компьютер в полнофункциональный развлекательный центр, а также Windows XP 64-bit Edition, являющаяся модификацией XP для компьютеров с 64-разрядными процессорами. Microsoft ведет разработку операционной системы нового поколения, именуемой как Windows Longhorn. По заявлениям Microsoft эта система станет революционной версией, основанной на внедрении новых технологий. Планируется выпуск ее 32- и 64-разрядных модификаций.
  Можно надеяться, что не остановятся на достигнутом и другие компании – разработчики операционных систем, поэтому пользователей ждут еще более совершенные, функциональные, производительные и комфортные среды взаимодействия с вычислительной техникой.
 Библиографический список
 
  1. Андреев А. Г. и др. Microsoft Windows 2000 Server и Professio-nal / Под общ. ред. А.Н. Чекмарева и Д.Б. Вишнякова. – СПб.: БХВ – Петербург, 2001. – 1056 с.: ил.
  2. Андреев А. Г. и др. Microsoft Windows XP. Руководство администратора/ Под общ. ред. А. Н. Чекмарева. – СПб.: БХВ – Петербург, 2003. – 848 с.: ил.
  3. Бэкон Д., Харрис Т. Операционные системы. – СПб.: Питер, 2004. – 800 с.: ил.
  4. Вишневский А. В. Windows Server 2003. Для профессионалов. – СПб.: Питер, 2004. – 767 с.: ил.
  5. Гордеев А.В. Операционные системы. – СПб.: Питер, 2005. – 418 с.: ил.
  6. Гордеев А. В., Молчанов А. Ю. Системное программное обеспечение. – СПб.: Питер, 2001. – 736 с.: ил.
  7. Назаров С. В. Администрирование локальных сетей Windows NT/2000/NET: Учеб. пособие. – М.: Финансы и статистика, 2003. – 478 с.: ил.
  8. Новиков Ю., Черепанов А. Персональные компьютеры: аппаратура, системы, Интернет: Учебный курс. – СПб.: Питер, 2001.– 464 с.: ил.
  9. Олаф Кирх. Linux: Руководство администратора сети. – СПб.: Питер, 2000. – 242 с.: ил.
  10. Олифер В.Г., Олифер Н. А. Сетевые операционные системы. – СПб.: Питер, 2001. – 544 с.: ил.
  11. Основы операционных систем: Курс лекций. / В. Е. Карпов, К. А. Коньков. – М.: ИНТУИТ.РУ «Интернет-Университет Информационных Технологий», 2004. – 632 с.: ил.
  12. Партыка Т. Л., Попов И. И. Операционные системы, среды и оболочки. – М.: ФОРУМ – ИНФРА-М, 2005. – 400 с.: ил.
  13. Таненбаум Э. Современные операционные системы. – СПб.: Питер, 2004. – 1040 с.: ил.
  14. Таненбаум Э., М. ван Стеен. Распределенные системы. Принципы и парадигмы. – СПб.: Питер, 2003. – 877 с.: ил.
  15. Ханикат Дж. Знакомство с Microsoft Windows Server 2003: Пер. с англ. – М.: Издательско-торговый дом «Русская Редакция», 2003. – 464 с.: ил.
  16. Чекмарев А. Н., Вишневский А. В., Кокорева О. И. Microsoft Windows Server 2003. – СПб.: БХВ – Петербург, 2003. – 1184 с.: ил.
  17. Microsoft Windows 2000 Server:Учебный курс MCSA/MCSE: Пер. с англ. – М.: Издательско-торговый дом «Русская Редакция», 2002. – 912 с.: ил.
  18. Microsoft Windows XP Professional: Учебный курс MCSA/MCSE: Пер. с англ. – М.: Издательско-торговый дом «Русская Редакция», 2002. – 1008 с.: ил.
 Словарь терминов и определений
 
  Виртуальная память
 совокупность программно-аппарат-ных средств, позволяющих пользователям писать программы, которые для своей реализации требуют объемы памяти, превосходящие реально существующие объемы оперативной памяти вычислительной машины.
 
  Гонка
 ситуация, когда два или более процессов обрабатывают разделяемые данные, и конечный результат зависит от соотношения скоростей выполнения процессов.
 

<< Пред.           стр. 6 (из 8)           След. >>

Список литературы по разделу