35484

Процесcы в Windows

Доклад

Информатика, кибернетика и программирование

Потоки Процессы инертны. Отвечают же за исполнение кода содержащегося в адресном пространстве процесса потоки. Поток thread некая сущность внутри процесса получающая процессорное время для выполнения. В каждом процессе есть минимум один поток.

Русский

2013-09-15

143.5 KB

0 чел.

Процесcы в Windows

Процессы

Процессом обычно называют экземпляр выполняемой программы.

Процесс в 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 Win32PrioritySeparation.

Всякий раз, когда возникает прерывание от таймера, из кванта потока вычитается 3, и так до тех пор, пока он не достигнет нуля. Частота срабатывания таймера зависит от аппаратной платформы. Например, для большинства однопроцессорных x86 систем он составляет 10мс, а на большинстве многопроцессорных x86 систем - 15мс.

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

Планирование в Windows осуществляется на уровне потоков, а не процессов. Это кажется понятным, так как сами процессы не выполняются, а лишь предоставляют ресурсы и контекст для выполнения потоков. Поэтому при планировании потоков, система не обращает внимания на то, какому процессу они принадлежат. Например, если процесс А имеет 10 готовых к выполнению потоков, а процесс Б - два, и все 12 потоков имеют одинаковый приоритет, каждый из потоков получит 1/12 процессорного времени.

Приоритеты

В Windows существует 32 уровня приоритета, от 0 до 31. Они группируются так: 31 - 16 уровни реального времени; 15 - 1 динамические уровни; 0 - системный уровень, зарезервированный для потока обнуления страниц (zero-page thread).

Привязка к процессорам

Если операционная система выполняется на машине, где установлено более одного процессора, то по умолчанию, поток выполняется на любом доступном процессоре. Однако в некоторых случаях, набор процессоров, на которых поток может работать, может быть ограничен. Это явление называется привязкой к процессорам (processor affinity). Можно изменить привязку к процессорам программно, через Win32-функции планирования.

Память

Каждому процессу в Win32 доступно линейное 4-гигабайтное (2^32 = 4 294 967 296) виртуальное адресное пространство. Обычно верхняя половина этого пространства резервируется за операционной системой, а вторая половина доступна процессу.

Виртуальное адресное пространство процесса доступно всем потокам этого процесса. Иными словами, все потоки одного процесса выполняются в едином адресном пространстве.

С другой стороны, механизм виртуальной памяти позволяет изолировать процессы друг от друга. Потоки одного процесса не могут ссылаться на адресное пространство другого процесса.

Виртуальная память может вовсе не соответствовать структуре физической памяти. Диспетчер памяти транслирует виртуальные адреса на физические, по которым реально хранятся данные. Поскольку далеко не всякий компьютер в состоянии выделить по 4 Гбайт физической памяти на каждый процесс, используется механизм подкачки (swapping). Когда оперативной памяти не хватает, операционная система перемещает часть содержимого памяти на диск, в файл (swap file или page file), освобождая, таким образом, физическую память для других процессов. Когда поток обращается к странице виртуальной памяти, записанной на диск, диспетчер виртуальной памяти загружает эту информацию с диска обратно в память.

Процессы в Linux

В операционной системе Linux процесс, или задание, представляется структурой данных taskstruct.

В этой структуре данных информация разбита на следующие категории.

  •  Состояние. Состояние выполнения процесса (выполняющийся, готовый к выполнению, приостановленный, остановленный, зомби).
  •  Информация по планированию. Информация, которая нужна операционной системе Linux для планирования процессов. Процесс может быть обычным или выполняющимся в реальном времени; кроме того, он обладает некоторым приоритетом. Процессы, выполняющиеся в реальном времени, планируются до обычных процессов; в каждой из категорий можно использовать относительные приоритеты. Счетчик ведет отсчет времени, отведенного процессу.
  •  Идентификаторы. Каждый процесс обладает своим собственным идентификатором, а также идентификаторами пользователя и группы. Идентификатор группы используется для того, чтобы назначить группе пользователя права доступа к ресурсам.
  •  Обмен информацией между процессами. В операционной системе Linux используется такой же механизм межпроцессного взаимодействия, как и в операционной системе UNIX SVR4, описанной в главе 6, "Взаимоблокировка и голодание".
  •  Связи. Каждый процесс содержит в себе связи с параллельными ему процессами, с родственными ему процессами (с которыми он имеет общий родительский процесс) и связи со всеми своими дочерними процессами.
  •  Время и таймеры. Сюда входит время создания процесса, а также количество процессорного времени, затраченного на данный процесс. С процессом также могут быть связаны интервальные таймеры (один или несколько). Интервальный таймер задается в процессе с помощью системного вызова; после истечения периода таймера процессу отправляется соответствующий сигнал. Таймер может быть создан для одноразового или периодического использования.
  •  Файловая система. Содержит в себе указатели на все файлы, открытые данным процессом.
  •  Виртуальная память. Определяет отведенную данному процессу виртуальную память.

На рис. показаны состояния выполнения процесса.

  •  Выполняющийся. Это состояние отвечает на самом деле двум состояниям: текущий процесс либо выполняется, либо готов к выполнению.
  •  Прерываемый. Это состояние блокировки, в котором процесс ожидает наступления события, например, завершения операции ввода-вывода, освобождения ресурса или сигнала от другого процесса.
  •  Непрерываемый. Это состояние блокировки другого рода. Его отличие от предыдущего состоит в том, что в непрерываемом состоянии процесс непосредственно ожидает выполнения какого-то аппаратного условия, поэтому он не воспринимает никаких сигналов.
  •  Остановленный. Процесс был остановлен и может быть продолжен только при соответствующем воздействии другого процесса. Например, процесс, который находится в состоянии отладки, может перейти в состояние остановки.
  •  Зомби. Процесс был прекращен, но по какой-то причине его структура остается в таблице процессов.

Рис.. Модель процессов и потоков Linux

Потоки в Linux

В операционной системе Linux новый процесс создается путем копирования атрибутов текущего процесса. Новый процесс  может быть клонирован (cloned); при этом такие ресурсы, как файлы, обработчики сигналов и виртуальная память, используются совместно. Если два процесса пользуются одной и той же виртуальной памятью, они функционируют как потоки в рамках одного и того же процесса. Однако для потоков структуры данных отдельно не задаются. Таким образом, в операционной системе Linux потоки и процессы не различаются.

Типы объектов синхронизации

Список объектов синхронизации включает следующие типы объектов:

·         процессы;

·         нити;

·         события (в узком смысле);

·         мьютексы (двоичные семафоры);

·         семафоры (недвоичные);

·         таймеры;

·         уведомления об изменениях в каталоге;

·         консольный ввод.

Нити

Что такое нить?

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

Что такое mutex?

Для организации взаимоисключения стандарт POSIX предлагает использовать так называемый mutex /от mutual exclusion/. Mutex можно рассматривать как изначально открытую комнату. Первая нить которая зашла под mutex, то первый человек вошедший в комнату закрывает ее. Другие нити или другие люди не могут попасть в эту комнату пока эта нить, то есть человек не откроет комнату и не выйдет из нее. То есть мы имеем взаимное исключение при доступе к общему ресурсу в чистом виде. Или модель туалетной кабинки кому, что больше нравится.

Почему mutex?

Как показывает практика правильно использовать его проще, чем другие механизмы синхронизации. На основе mutex и еще одного механизма, про который мы поговорим позже, легко построить все остальные механизмы синхронизации. Кроме того, его легко и дешево реализовывать [однако о реализации мы поговорим позже и отдельно].

Рассмотрим еще раз как работает механизм mutex на следующем примере:

Взаимоисключения

Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Сигнальное состояние объекта (т.е. состояние "установлен") соответствует моменту времени, когда объект не принадлежит ни одному потоку и его можно "захватить". И наоборот, состояние "сброшен" (не сигнальное) соответствует моменту, когда какой-либо поток уже владеет этим объектом. Доступ к объекту разрешается, когда поток, владеющий объектом, освободит его.

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

События

Объекты-события используются для уведомления ожидающих потоков о наступлении какого-либо события. Различают два вида событий - с ручным и автоматическим сбросом. Ручной сброс осуществляется функцией ResetEvent. События с ручным сбросом используются для уведомления сразу нескольких потоков. При использовании события с автосбросом уведомление получит и продолжит свое выполнение только один ожидающий поток, остальные будут ожидать дальше.

Функция CreateEvent создает объект-событие, SetEvent - устанавливает событие в сигнальное состояние, ResetEvent-сбрасывает событие. Функция PulseEvent устанавливает событие, а после возобновления ожидающих это событие потоков (всех при ручном сбросе и только одного при автоматическом), сбрасывает его. Если ожидающих потоков нет, PulseEvent просто сбрасывает событие.

Семафоры

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

Критические секции

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


 

А также другие работы, которые могут Вас заинтересовать

80989. Використання текстових джерел у процесі навчання 35.4 KB
  У процесі вивчення шкільного курсу історії використовуються текстові джерела. Це Історичні джерела що опрацьовуються на уроках історії. можна поділити джерела у три великі групи: речові історичні джерела або археологічні пам’ятки; писемні історичні джерела або історичні документи; візуальні історичні джерела. Речові історичні джерела або археологічні пам’ятки – матеріальні рештки діяльності людини чи змінене людською працею із слідами діяльності людини природне середовище.
80990. Навчально-виховні завдання вивчення історії в сучасних умовах розвитку середньої освіти 35.57 KB
  Вивчення історії є одним із найважливіших чинників формування національної свідомості народу. Без знання минулого неможливо точне поняття про сучасне За останні роки сформувався новий образ учителя історії. На наш погляд сучасному вчителю історії мають бути притаманні такі риси: Державницька свідомість.
80992. Поняття та сутність методики навчання історії 31.29 KB
  Метод спосіб досягнення мети розв\'язання конкретного завдання Ефективність і якість навчання історії залежить від того наскільки вчитель володіє методами навчання і застосовує їх на практиці. Початкові елементи методики навчання історії зародилися з введенням викладання предмета як відповідь на практичні питання про цілі викладання про відбір історичного матеріалу якому навчали учнів і прийоми його розкриття. Методика історії як наука пройшла складний шлях розвитку.
80993. Методика роботи з історичним документом 33.52 KB
  Як відомо, до історичних джерел належить все створене людиною, а також предмети матеріальної культури, звичаї, обряди, памятки писемності. У широкому сенсі памятки писемності в методиці називають документами.
80994. Загальна характеристика шкільної програми з історії. Принципи їх побудови 38.33 KB
  Типи навчальних програм: Навчальні програми можуть бути типовими робочі і авторськими. Типові державні навчальні програми з історії розробляються на основі державного освітнього стандарту. Тому виникає необхідність періодично оновлювати навчальні програми у відповідності з розвитком педагогічної науки і практики.
80995. Проблема інтерпретації навчальних текстів на уроках історії. Інтерпретація (лат. interpretatio) — розяснення, тлумачення — відносно історичних текстів та ін.. (наукових та літературних текстів) 34.86 KB
  Щоб запобігти некритичному сприйняттю учнями історичної інформації, недостатньо тільки навчити їх досліджувати джерела. Важливим є також розвиток вмінь аналізувати та критично оцінювати інтерпретацію минулого, що міститься в будь-якому джерелі