Объектно-ориентированный подход Windows 2000.
В Windows 2000 любой ресурс системы, который одновременно может быть использован более чем одним процессом, включая файлы, совместно используемую память и физические устройства, реализован в виде объекта и управляется рядом функций. Такой подход сокращает число изменений, которые необходимо внести в операционную систему в процессе ее эксплуатации. Если, скажем, изменилось что-то в аппаратуре, то все, что необходимо сделать - заменить соответствующий объект. Аналогично, если требуется поддержка новых ресурсов, то надо добавить только новый объект, не изменяя при этом остального кода операционной системы.
Наиболее фундаментальное отличие между объектом и обыкновенной структурой данных заключается в том, что внутренняя структура данных объекта скрыта от наблюдения. Вы должны вызвать объектную функцию для того, чтобы получить данные из объекта или поместить данные в объект. Вы не можете непосредственно изменять данные, находящиеся внутри объекта. Это отделяет средства реализации объекта от кода, который только использует его, такая техника позволяет легко изменять в последствии реализацию объектов.
Группа разработчиков 2000 executive решила использовать объекты для представления системных ресурсов, потому что объекты обеспечивают централизованные средства для выполнения трех важных ( и часто утомительных) задач ОС:
· Поддержка воспринимаемых человеком имен системных ресурсов;
· Разделение ресурсов и данных между процессами;
· Защита ресурсов от несанкционированного доступа.
Не все структуры данных в 2000 executive являются объектами. Объектами сделаны только такие данные, которые нужно разделять, защищать, именовать или делать видимыми для программ пользовательского режима ( с помощью системных функций). Структуры, которые используются только одним компонентом executive для выполнения внутренних функций, не являются объектами.
Несмотря на всестороннее использование объектов для представления разделяемых ресурсов, Windows 2000 не является объектно-ориентированной системой в строгом смысле. Большая часть кода операционной системы написана на С с целью обеспечения переносимости. Несмотря на то, что С не поддерживает непосредственно объектно-ориенти-
рованные конструкции, такие как динамическое связывание типов данных, полиморфные функции или наследование классов, эти инструментальные средства были использованы из-за их широкой распространенности.
Менеджер объектов - это компонента 2000 executive, которая ответственна за создание, удаление, защиту и слежение за NT-объектами. Менеджер объектов централизует операции управления ресурсами, которые в противном случае будут разбросаны по всей ОС.
Менеджер объектов выполняет следующие функции:
· Выделяет память для объекта.
· Присоединяет к объекту так называемый дескриптор безопасности, который определяет, кому разрешено использовать объект, и что они могут с ним делать.
· Создает и манипулирует структурой каталога объектов, в котором хранятся имена объектов.
· Создает описатель объекта и возвращает его вызывающему процессу.
Процессы пользовательского режима, включая подсистемы окружения, должны иметь описатель объекта перед тем, как их нити смогут использовать этот объект. Использование описателей для работы с системными ресурсами не является новой идеей. Например, библиотеки С и Паскаля (а также других языков) возвращают описатели для открытых файлов. Аналогично приложения Win32 используют различные типы описателей для управления окнами, курсором мыши, иконками. В обоих случаях описатели служат косвенными указателями на системные ресурсы; эта косвенность предохраняет прикладные программы от рутинной работы непосредственно с системными структурами данных.
Каждый NT-объект является объектом определенного типа. Тип определяет данные, которые хранит объект, и "родные" системные функции, которые могут к нему применяться. Для того, чтобы управлять различными объектами единообразно, менеджер объектов требует, чтобы каждый объект содержал несколько полей стандартной информации в определенном месте объекта. До тех пор, пока эти данные имеются, менеджер объектов не заботится о том, что еще хранится в объекте. Каждый объект состоит из двух частей - заголовка объекта и тела объекта, которые содержат стандартные и переменные данные объекта соответственно. Менеджер объектов работает с заголовком объекта, а другие компоненты executive работают с телами объектов тех типов, которые они сами создают. Заголовок объекта используется менеджером без учета типа объекта. В заголовке объекта любого типа содержится имя, каталог, дескриптор безопасности, квоты на использование ресурсов, счетчик открытых описателей, база данных открытых описателей, признак постоянный/временный, режим пользователя/ядра, указатель на тип объекта.
Кроме заголовка объекта, каждый объект имеет тело объекта, формат и содержание которого уникально определяется типом этого объекта; у всех объектов одного и того же типа одинаковый формат тела. При создании объекта исполнительная часть может оперировать данными в телах всех объектов этого типа.
Алгоритм планирования процессов и потоков Windows 2000
В Windows 2000 реализована вытесняющая многозадачность, и разбиение процесса на потоки. Многозадачность реализована на уровне потоков. Используется механизм квантования и приоритетов. Чтобы все потоки работали, операционная система отводит каждому из них определенное процессорное время. Тем самым создается иллюзия одновременного выполнения потоков (разумеется, для многопроцессорных компьютеров возможен истинный параллелизм). В Windows реализована система вытесняющего планирования на основе приоритетов, в которой всегда выполняется поток с наибольшим приоритетом, готовый к выполнению. Выбранный для выполнения поток работает в течение некоторого периода, называемого квантом. Квант определяет, сколько времени будет выполняться поток, пока операционная система не прервет его. По окончании кванта операционная система проверяет, готов ли к выполнению другой поток с таким же (или большим) уровнем приоритета. Если таких потоков не оказалось, текущему потоку выделяется еще один квант. Однако поток может не полностью использовать свой квант. Как только другой поток с более высоким приоритетом готов к выполнению, текущий поток вытесняется, даже если его квант еще не истек.
Квант не измеряется, в каких бы то ни было единицах времени, а выражается целым числом. Для каждого потока хранится текущее значение его кванта. Когда потоку выделяется квант процессорного времени, это значит, что его квант устанавливается в начальное значение. Оно зависит от операционной системы. Например, для Win2000 Professional начальное значение кванта равно 6, а для Win2000 Server – 36.
Это значение можно изменить вызвав Control Panel - > System -> Advanced -> Performance options. Значение «Applications» – как для Win2000 Professional; «Background Services» – как для Win2000 Server. Или напрямую в ключе реестра HKLM\System\CurrentControlset\Control\PriorityControl\ Win32PrioritySeparation.
Всякий раз, когда возникает прерывание от таймера, из кванта потока вычитается 3, и так до тех пор, пока он не достигнет нуля. Частота срабатывания таймера зависит от аппаратной платформы. Например, для большинства однопроцессорных x86 систем он составляет 10мс, а на большинстве многопроцессорных x86 систем – 15мс.
В любом случае операционная система должна определить, какой поток выполнять следующим. Выбрав новый поток, операционная система переключает контекст. Эта операция заключается в сохранении параметров выполняемого потока (регистры процессора, указатели на стек ядра и пользовательский стек, указатель на адресное пространство, в котором выполняется поток и др.), и загрузке аналогичных параметров для другого потока, после чего начинается выполнение нового потока.
В качестве примера рассмотрим схему назначения приоритетов потокам, принятую в операционной системе Windows NT. В системе определено 32 уровня приоритетов и два класса потоков — потоки реального времени и потоки с переменными приоритетами. Диапазон от 1 до 15 включительно отведен для потоков с переменными приоритетами, а от 16 до 31 — для более критичных ко времени потоков реального времени (приоритет 0 зарезервирован для системных целей).
Уровень приоритета каждого потока состоит из трех составляющих:
- класс приоритета процесса (простаивающий, нормальный, высокий, реального времени);
- уровень приоритета потока внутри класса приоритета процесса (нижний, ниже нормального, нормальный, выше нормального, высший)
- динамически установленный уровень приоритета.
При создании процесса, ему назначается один из шести классов приоритетов:
Класс | Флаг в функции Create Process | Числовой уровень |
Realtime (реального времени) | REALTIME_PRIORITY_CLASS | |
High (высокий) | HIGH_PRIORITY_CLASS | |
Above normal* (выше нормального) | ABOVE_NORMAL_ PRIORITY_CLASS | |
Normal (нормальный) | NORMAL_PRIORITY_CLASS | 8 (7–9) |
Below normal* (Ниже нормального) | BELOW_NORMAL_ PRIORITY_CLASS | |
Idle (простаивающий) | IDLE_PRIORITY_CLASS |
* – Above normal и Below normal появились начиная с Win2000.
Уровень Idle назначается процессу, который ничего не должен делать в случае активности других процессов (например, хранитель экрана). Процессам, запускаемым пользователем, присваивается нормальный уровень. Пользователь может запустить несколько процессов. Тому процессу, с которым пользователь непосредственно работает (а это может быть только один процесс) уровень приоритета поднимается на две единицы (7+2 = 9). Это делает общение с прикладной программой более “комфортабельным”. Высокий класс приоритета назначается некоторым системным процессам, которые простаивают до возникновения определенных событий и, поэтому, не мешают остальным процессам. Только в особых случаях процесс может относиться к классу Realtime.
Класс приоритета процесса и уровень приоритета потока внутри класса определяют базовый уровень приоритета потока. Этот уровень может динамически изменяться системой, а именно, повышаться на 2 единицы в ответ на поступление сообщений в очередь потока с последующим понижением до базового уровня по истечении определенного промежутка времени. Это правило действует только для потоков до 15 уровня.
При создании процесса он в зависимости от класса получает по умолчанию базовый приоритет в верхней или нижней части диапазона. Базовый приоритет процесса в дальнейшем может быть повышен или понижен операционной системой. Первоначально поток получает значение базового приоритета из диапазона базового приоритета процесса, в котором он был создан. Пусть, например, значение базового приоритета некоторого процесса равно К. Тогда все потоки данного процесса получат базовые приоритеты из диапазона [К-2, К+2]. Отсюда видно, что, изменяя базовый приоритет процесса, ОС может влиять на базовые приоритеты его потоков.
В Windows NT с течением времени приоритет потока, относящегося к классу потоков с переменными приоритетами, может отклоняться от базового приоритета потока, причем эти изменения могут быть не связаны с изменениями базового приоритета процесса. ОС может повышать приоритет потока (который в этом случае называется динамическим) в тех случаях, когда поток не полностью использовал отведенный ему квант, или понижать приоритет, если квант был использован полностью. ОС наращивает приоритет дифференцированно в зависимости от того, какого типа событие не дало потоку полностью использовать квант. В частности, ОС повышает приоритет в большей степени потокам, которые ожидают ввода с клавиатуры (интерактивным приложениям) и в меньшей степени — потокам, выполняющим дисковые операции. Именно на основе динамических приоритетов осуществляется планирование потоков. Начальной точкой отсчета для динамического приоритета является значение базового приоритета потока. Значение динамического приоритета потока ограничено снизу его базовым приоритетом, верхней же границей является нижняя граница диапазона приоритетов реального времени.
Жизненный цикл потока начинается в тот момент, когда программа создает новый поток. Запрос передается исполнительной части, менеджер процессов выделяет память для объекта-потока и обращается к ядру, чтобы инициализировать объект-поток ядра. После инициализации поток проходит через следующие состояния:
1. Готовность(Ready). У потока есть все, но не хватает только процессора (пул потоков).
2. Первоочередная готовность (standby). Для каждого процессора системы выбирается один поток, которая будет выполняться следующим (самый первый поток в очереди). Когда условия позволяют, происходит переключение на контекст этого потока.
3. Выполнение (Running). Поток выполняется процессором и покинет это состояние либо, если она завершится, либо, если появилась более приоритетная поток или закончился квант времени, либо, если она ожидает какое-либо событие.
4. Ожидание (Waiting). Поток может оказаться в этом состоянии либо по своей инициативе, если он ожидает некоторый объект для того, чтобы синхронизировать свое выполнение, либо операционная система (например, подсистема ввода-вывода) может ожидать чего-то в интересах потока, либо подсистема окружения может заставлять поток приостановить себя.
5. Переходное состояние (Transition). Поток входит в переходное состояние, если он готов к выполнению, но страница, содержащая стек потока, выгружена из оперативной памяти на диск в файл подкачки.
6. Завершение(Terminate). Когда выполнение всех команд потока закончилось, он находится в состоянии завершения до тех пор, пока его не удалит менеджер объектов. Если в исполнительной части имеется указатель на этот же поток, то он может быть инициализирован и использован снова.
Дата добавления: 2018-11-25; просмотров: 354;