Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Desktop / For_exams / Smirnov / 1 - копия (20)

.txt
Скачиваний:
34
Добавлен:
27.03.2015
Размер:
12.53 Кб
Скачать
21. Процессы
Ключевым понятием во всех операционных системах является процесс. Процессом,
по существу, является программа во время её выполнения. С каждым процессом
связано его адресное пространство — список адресов ячеек памяти от нуля и до
некоторого максимума, откуда процесс может считывать и куда записывает данные.
Адресное пространство содержит выполняемую программу, данные этой
программы и ее стек. Кроме этого, с каждым процессом связан набор ресурсов, который
обычно включает регистры (в том числе счетчик команд и указатель стека), список
открытых файлов, необработанные предупреждения, список связанных процессов
и всю остальную информацию, необходимую в процессе работы программы. Таким
образом, процесс — это контейнер, в котором содержится вся информация,
необходимая для работы программы.
Пользователь может запустить
программу редактирования видео и задать ей конвертирование одночасового
видеофайла в какой-нибудь определенный формат (что займет несколько часов работы),
а затем переключиться на блуждания по Интернету. При этом может заработать
фоновый процесс, который периодически «просыпается» для проверки входящей
электронной почты. И у нас уже будет (как минимум) три активных процесса:
видеоредактор, веб-браузер и программа получения (клиент) электронной почты.
Периодически операционная система будет принимать решения остановить работу
одного процесса и запустить выполнение другого, например, потому, что первый
исчерпал свою долю процессорного времени в предыдущую секунду или две.
Если процесс приостанавливается таким образом, позже он должен
возобновиться именно в том состоянии, в котором был остановлен. Это означает, что на
период приостановки вся информация о процессе должна быть явным образом где-то
сохранена. Например, у процесса могут быть одновременно открыты для чтения
несколько файлов. С каждым из этих файлов связан указатель на текущую позицию
(то есть номер байта или записи, которая должна быть считана следующей). Когда
процесс приостанавливается, все эти указатели должны быть сохранены, чтобы
вызов read, выполняемый после возобновления процесса, приводил к чтению нужных
данных. Во многих операционных системах вся информация о каждом процессе,
за исключением содержимого его собственного адресного пространства, хранится
в таблице операционной системы, которая называется таблицей процессов и
представляет собой массив (или связанный список) структур, по одной на каждый из
существующих на данный момент процессов.
Таким образом, процесс (в том числе и приостановленный) состоит из
собственного адресного пространства, которое обычно называют образом памяти, и записи
в таблице процессов, с содержимым его регистров, а также другой информацией,
необходимой для последующего возобновления процесса.
Главными системными вызовами, используемыми при управлении процессами,
являются вызовы, связанные с созданием и завершением процессов. Рассмотрим
простой пример. Процесс, называемый интерпретатором команд, или оболочкой,
считывает команды с терминала. Пользователь только что набрал команду,
требующую компиляции программы. Теперь оболочка должна создать новый процесс,
запускающий компилятор. Когда этот процесс завершит компиляцию, он произведет
системный вызов для завершения собственного существования.
Если процесс способен создавать несколько других процессов (называющихся
дочерними процессами), а эти процессы в свою очередь могут создавать
собственные дочерние процессы, то перед нами предстает дерево процессов, подобное
изображенному на рис. 1.13. Связанные процессы, совместно работающие над
выполнением какой-нибудь задачи, зачастую нуждаются в обмене данными друг
с другом и в синхронизации своих действий.
Другие системные вызовы, предназначенные для управления процессом,
позволяют запросить выделение дополнительной памяти (или освобождение не-
задействованной), организовать ожидание завершения дочернего процесса или
загрузку какой-нибудь другой программы поверх своей.
Временами возникает потребность в передаче информации запущенному
процессу, который не находится в состоянии ожидания этой информации. Можно
привести в пример процесс, который обменивается информацией с другим
процессом, запущенным на другом компьютере, и посылает удаленному процессу
сообщение по сети. Чтобы обезопаситься от возможной утраты сообщения или
ответа на него, отправитель может запросить свою собственную операционную
систему уведомить его по истечении определенного интервала времени, чтобы
он мог повторно отправить сообщение, если ранее не получит подтверждения его
1.5. Понятия операционной системы 65
получения. После установки такого таймера программа может продолжить
выполнение другой работы.
Когда истечет заданный интервал времени, операционная система посылает
процессу сигнал тревоги. Этот сигнал заставляет процесс приостановить
выполняемую работу, сохранить в стеке состояние своих регистров и запустить
специальную процедуру обработки сигнала тревоги, для того чтобы, к примеру, заново
передать предположительно утраченное сообщение. Когда обработчик сигнала
завершит свою работу, запущенный процесс возобновится в том самом состоянии,
которое было до поступления сигнала. Сигналы являются программными
аналогами аппаратных прерываний. Они могут генерироваться в различных ситуациях,
а не только по истечении времени, установленного в таймере. Многие аппаратные
прерывания (например, выполнение недопустимой команды или обращение по
неверному адресу) также преобразуются в сигналы процессу, при выполнении
которого произошла ошибка.
Каждому пользователю, которому разрешено работать с системой, системным
администратором присваивается идентификатор пользователя — UID (User IDen-
tification). Каждый запущенный процесс имеет UID того пользователя, который его
запустил. Дочерние процессы имеют такой же UID, что и у родительского процесса.
Пользователи могут входить в какую-нибудь группу, каждая из которых имеет
собственный идентификатор группы — GID (Group IDentification).
Пользователь с особым значением UID, называемый в UNIX
«суперпользователем» (superuser), имеет особые полномочия, позволяющие пренебрегать многими
правилами защиты. В крупных компьютерных системах только системный
администратор знает пароль, необходимый для получения прав суперпользователя,
но многие обычные пользователи (особенно студенты) прикладывают немалые
усилия, пытаясь отыскать бреши в системе, которые позволили бы им стать
суперпользователем без пароля.1
Создать процесс - это прежде всего означает создать описатель процесса, в качестве которого выступает одна или несколько информационных структур, содержащих все сведения о процессе,, необходимые операционной системе для управления им. В число таких сведений могут входить, например, идентификатор процесса, данные о расположении в памяти исполняемого модуля, степень привилегированности процесса (приоритет и права доступа) и т. п. Примерами описателей процесса являются блок управления задачей (ТСВ - TaskControlBlock) в OS/360, управляющий блок процесса (РСВ - ProcessControlBlock) в OS/2, дескриптор процесса в UNIX, объект-процесс (object-process) в Windows NT.
Создание описателя процесса - это появление в системе еще одного претендента на вычислительные ресурсы. Начиная с этого момента при распределении ресурсов ОС должна принимать во внимание потребности нового процесса.
Создание процесса включает загрузку кодов и данных исполняемой программы данного процесса с диска в оперативную память. Для этого ОС должна обнаружить местоположение такой программы на диске, перераспределить оперативную память и выделить память исполняемой программе нового процесса. Затем необходимо считать программу в выделенные для нее участки памяти и, возможно, изменить параметры программы в зависимости от размещения в памяти. В системах с виртуальной памятью в начальный момент может загружаться только часть кодов и данных процесса, с тем чтобы «подкачивать» остальные по мере необходимости. Существуют системы, в которых на этапе создания процесса не требуется непременно загружать коды и данные в оперативную память, вместо этого исполняемый модуль копируется из того каталога файловой системы, в котором он изначально находился, в область подкачки - специальную область диска, отведенную для хранения кодов и данных процессов. При выполнении всех этих действий подсистема управления процессами тесно взаимодействует с подсистемой управления памятью и файловой системой.
В многопоточной системе при создании процесса ОС создает для каждого процесса как минимум один поток выполнения. При создании потока так же, как и при создании процесса, операционная система генерирует специальную информационную структуру - описатель потока, который содержит идентификатор потока, данные о правах доступа и приоритете, о состоянии потока и другую информацию. В исходном состоянии поток (или процесс, если речь идет о системе, в которой понятие «поток» не определяется) находится в приостановленном состоянии. Момент выборки потока на выполнение осуществляется в соответствии с принятым в данной системе правилом предоставления процессорного времени и с учетом всех существующих в данный момент потоков и процессов. В случае если коды и данные процесса находятся в области подкачки, необходимым условием активизации потока процесса является также наличие места в оперативной памяти для загрузки его исполняемого модуля.
Во многих системах поток может обратиться к ОС с запросом на создание так называемых потоков-потомков. В разных ОС по-разному строятся отношения между потоками-потомками и их родителями. Например, в одних ОС выполнение родительского потока синхронизируется с его потомками, в частности после завершения родительского потока ОС может снимать с выполнения всех его потомков. В других системах потоки-потомки могут выполняться асинхронно по отношению к родительскому потоку. Потомки, как правило, наследуют многие свойства родительских потоков. Во многих системах порождение потомков является основным механизмом создания процессов и потоков.
Потоки создаются и выполняются в родительском адресном пространстве, то есть в адресном пространстве процесса, создавшего потоки, но каждому потоку даётся свой стек. Потоки могут обмениваться друг с другом информацией без ограничений.
Когда приложение запрашивает ресурс, операционная система проверяет, свободен ли запрашиваемый ресурс, и, если свободен, уменьшает счётчик доступа к ресурсу. Поскольку на счётчик семафора могут влиять несколько потоков, семафоры не передаются во владение какому-либо потоку. Следовательно, один поток может ждать семафор, а другой поток освободить семафор.
Для создания потока используется функция CreateThread. Синтаксис функции CreateThread:
HANDLE CreateThread(lpsa: LPSECURITY_ATTRIBUTES; cbStack: DWORD; lpStartAddr: LPTHREAD_START_ROUTINE; lpvThreadParam: LPVOID; fdwCreate: DWORD; lpIDThread: LPVOID);
Параметр lpsa - это указатель на структуру, задающую нестандартные дескрипторы защиты. Значение параметра lpsa NULL указывает на стандартные атрибуты защиты.
Параметр lpStartAddr указывает адрес функции потока, с которой должен будет начать работу создаваемый поток. Синтаксис функции должен иметь следующий вид:
DWORD ThreadFunc(lpvThreadParam: LPVOID) {

return(dwResult);
}
Параметр, получаемый данной функцией ThreadFunc, есть четвёртый параметр функции создания потокаlpvThreadParam. Через него можно передать некоторое 32-битное значение, или просто данные или указатель на структуру, содержащую расширенную информацию.
Параметр fdwCreate - дополнительные флаги управления потоком. Флаг - CREATE_SUSPENDED указывает системе создать поток и приостановить его выполнение. Возобновить выполнение потока может родительский поток вызовом функции ResumeThread(HANDLE), передав ей в качестве параметра описатель, возвращённый функцией создания потока. Вообще родительский поток может в любое время остановить поток вызовом функцииSuspendThread(HANDLE), и возвратить его к выполнению приведённой выше функциейResumeThread(HANDLE). В структуре управления потоком есть переменная SuspendCount, в которой запоминается количество вызовов SuspendThread, а вызов ResumeThread уменьшает эту переменную на единицу. Как только она примет нулевое значение поток возобновляет выполнение.
Последний параметр lpIDThread - адрес переменной типа двойного слова, в которую будет записан уникальный идентификатор потока.
Соседние файлы в папке Smirnov