Процессы в системе Unix. Создание дочерних процессов. Примеры

Единственными активными сущностями в системе Unix являются процессы.Unix представляет собой многозадачную систему, так что несколько независимых процессов могут работать одновременно. У каждого пользователя системы может быть одновременно несколько активных процессов, также существует множество фоновых процессов (демонов). Они запускаются автоматически при загрузке системы. Типичным демоном является cron daemon, предназначенный для планирования и запуска процессов. Системный вызов fork создает точную копию исходного процесса, называемого родительским процессом. Новый процесс называется дочерним. У процессов собственные образы памяти. Если родительский процесс в последствие изменит какие–то свои переменные, то эти изменения останутся невидимыми для дочернего процесса, и наоборот. Открытые файлы используются родительским и дочерним процессами совместно.

Создание процесса в системе Unix:

pid = fork ();

/* если fork завершился успешно, pid > 0 в родит. процессе */

if (pid < 0) {

handle_error ();

/* fork потерпел неудачу (например, память переполнена)*/

} else if (pid > 0) {

/* здесь располагается родительская программа */

} else {

/* здесь располагается дочерняя программа */

}

Процессы взаимодействуют с помощью каналов. Синхронизация процессов достигается путем блокировки процесса при попытке прочитать данные из пустого канала. Например, когда оболочка выполняет строку sort < f | head она создаст два процесса, sort и head, и устанавливает между ними канал. Если канал переполняется, система приостанавливает работу sort, пока head не удалит хоть сколько-нибудь данных. Процессы могут взаимодействовать также при помощи программных прерываний посылкой сигналов.

Для управления процессами используются системные вызовы. Например, pid = fork () (создать дочерний процесс), exit (status) (завершить выполнение процесса и вернуть статус), s = pause () (приостановить выполнение процесса до след. сигнала), s = kill (pid, sig) (послать сигнал процессу) и др.

Стандартом POSIX предусматривается реализация потоков в пространстве пользователя и ядра ОС. Существуют наиболее часто применяемые вызовы управления потоками, такие как pthread_create (создать поток в адр. простр. вызывающего процесса), pthread_exit (завершить поток), pthread_ cond_init(создать условную переменную), pthread_ cond_ destroy (уничтожить условную переменную), pthread_mutex_init (создать новый мьютекс) и др.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: