Процессы Процессом обычно называют экземпляр выполняемой программы.
Хотя на первый взгляд кажется что программа и процесс понятия практически одинаковые, они фундаментально отличаются друг от друга.
Программа представляет собой статический набор команд, а процесс это набор ресурсов и данных, использующихся при выполнении
программы.
Процесс в Windows состоит из следующих компонентов:
- Структура данных, содержащая всю информацию о процессе, в том числе список открытых дескрипторов различных системных ресурсов,
уникальный идентификатор процесса, различную статистическую информацию и т.д.;
- Адресное пространство – диапазон адресов виртуальной памяти, которым может пользоваться процесс;
- Исполняемая программа и данные, проецируемые на виртуальное адресное пространство процесса.
Потоки
Процессы инертны. Отвечают же за исполнение кода, содержащегося в адресном пространстве процесса, потоки. Поток (thread) – некая
сущность внутри процесса, получающая процессорное время для выполнения. В каждом процессе есть минимум один поток. Этот первичный
поток создается системой автоматически при создании процесса. Далее этот поток может породить другие потоки, те в свою очередь новые
и т.д. Таким образом, один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном
пространстве процесса. Каждый поток имеет:
- Уникальный идентификатор потока;
- Содержимое набора регистров процессора, отражающих состояние процессора;
- Два стека, один из которых используется потоком при выполнении в режиме ядра, а другой – в пользовательском режиме;
- Закрытую область памяти, называемую локальной памятью потока (thread local storage, TLS) и используемую подсистемами, run-time
библиотеками и DLL.
Планирование потоков Чтобы все потоки работали, операционная система отводит каждому из них определенное процессорное время. Тем самым создается иллюзия одновременного выполнения потоков (разумеется,
для многопроцессорных компьютеров возможен истинный параллелизм). В 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 осуществляется на уровне потоков, а не процессов. Это кажется понятным, так как сами процессы не
выполняются, а лишь предоставляют ресурсы и контекст для выполнения потоков. Поэтому при планировании потоков, система не обращает
внимания на то, какому процессу они принадлежат. Например, если процесс А имеет 10 готовых к выполнению потоков, а процесс Б – два, и все 12 потоков имеют одинаковый приоритет, каждый из потоков получит 1/12 процессорного времени.
Приоритеты
В Windows существует 32 уровня приоритета, от 0 до 31. Они группируются так: 31 – 16 уровни реального времени; 15 – 1 динамические
уровни; 0 – системный уровень, зарезервированный для потока обнуления страниц (zero-page thread).
При создании процесса, ему назначается один из шести классов приоритетов:
Real time class,
High class,
Above normal class,
Normal class,
Below normal class,
и Idle class.
В Windows NT/2000/XP можно посмотреть приоритет процесса в Task Manager.