Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Программы, процессы и потоки

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

Чтобы запустить программу, ядро сначала должно создать новый процесс – среду, в которой выполняется программа. Процесс состоит из трех сегментов: сегмента команд, сегмента пользовательских данных и сегмента системных данных. Программа используется для инициализации сегментов команд и пользовательских данных. После этой инициализации процесс начинает все сильнее отличаться от выполняемой в нем программы. Кроме того процесс может получать в свое распоряжение дополнительную память, открывать файлы и приобретать другие ресурсы, отсутствующие в программе.

Пока процесс выполняется, ядро следит за его потоками – отдельными путями выполнения команд, которые потенциально могут осуществлять чтение и запись одних и тех же данных процесса. Системные данные процесса включают такие атрибуты, как текущий каталог, дескрипторы открытых файлов, использованное время процессора и т.д. Процесс не может читать или изменять свои системные данные непосредственно, так как они находятся вне его адресного пространства. Вместо этого для чтения и изменения атрибутов используются различные системные вызовы.

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

    1. Сигналы

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

Примером сигнала, исходящего из ядра, может служить сигнал нарушения сегментации, отправляемый процессу, когда он пытается обратиться к памяти, расположенной вне его адресного пространства. В качестве примера сигнала, отправляемого процессом самому себе, можно привести сигнал, отправляемый функцией abort для завершения процесса с созданием дампа памяти. Примером сигнала, отправляемого одним процессом другому, является сигнал завершения, отправляемый одним из нескольких связанных процессов, когда он решает завершить целое семейство процессов. Наконец, примером пользовательского сигнала может служить сигнал прерывания, отправляемый всем созданным пользователем процессам при нажатии Ctrl –c.

Существует примерно 28 типов сигналов (оно колеблется в зависимости от версии Unix). Процесс может принять действие по умолчанию, которое обычно приводит к завершению процесса, он может проигнорировать сигнал или перехватить сигнал и выполнить функцию, называемую обработчиком сигнала. Тип сигнала (например, SIGALRM) передается в обработчик как аргумент. Когда обработчик сигнала возвращает управление, выполнение процесса возобновляется с точки прерывания.