Реализация потоков в ядре, в пространстве пользователя, смешанная реализация. Преимущества и недостатки разных способов реализации потоков

1) Единственными активными сущностями в системе 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 (создать новый мьютекс) и др.

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

2)

· Поток в пространстве пользователя. Каждый процесс имеет таблицу потоков, аналогичную таблице процессов ядра.

Достоинства и недостатки этого типа следующие:

Достоинства

1. возможность реализации на ядре не поддерживающем многопоточность

2. Более быстрое переключение, создание и завершение потоков

3. процесс может иметь собственный алгоритм планирования.

Недостатки

1. Отсутствие прерывания по таймеру внутри одного процесса

2. При использовании блокирующего системного запроса все остальные потоки блокируются.

3. Сложность реализации

· Поток в пространстве ядра. Наряду с таблицей процессов в пространстве ядра имеется таблица потоков.

Достоинства и недостатки этого типа следующие:

Достоинства

1. Не нужны новые не блокирующие системные запросы

2. Если поток вызвал ошибку из-за отсутствия страницы, ядро запускает один из готовых потоков, пока требуемая страница считывается с диска.

Недостаток

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

· Смешанная реализация. Потоки работают в режиме пользователя, но при системных вызовах переключаются в режим ядра.

Переключение в режим ядра и обратно является ресурсоемкой операцией и отрицательно сказывается на производительности системы. Поэтому было введено понятие волокна — облегченного потока, выполняемого исключительно в режиме пользователя. У каждого потока может быть несколько волокон. Подобный тип многопоточности реализован в ОС Windows.


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



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