Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Unix.doc
Скачиваний:
4
Добавлен:
26.11.2019
Размер:
2.41 Mб
Скачать

Причины появления нитей

Многие программы выполняют отдельные независимые задачи. Например, сервер баз данных находится в режиме приема и обработки множества запросов. Но если поступающие запросы не требуется обрабатывать в определенном порядке, то их можно считать независимыми задачами, функционирующими параллельно. В традиционных системах UNIX такие программы используют несколько процессов, что приводит к возникновению следующих проблем:

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

  • каждый процесс находится в своем адресном пространстве, поэтому для взаимодействия между ними необходимо использовать специальные средства.

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

Рисунок 3.5 - Многонитевые процессы в многопроцессорной системе

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

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

  • Инструкции процесса;

  • Большую часть данных;

  • Открытые файлы (дескрипторы);

  • Обработчики сигналов и вообще настройки для работы с сигналами;

  • Текущий рабочий каталог;

  • Идентификаторы пользователя и группы.

  • Каждый поток имеет свой собственный:

  • Идентификатор потока;

  • Набор регистров, включая PC и указатель стека;

  • Стек (для локальных переменных и адресов возврата);

  • Errno

  • Маску сигналов;

  • Приоритет;

и т.д.

Типы нитей

Нить – это динамический объект, в процессе представленный одной точкой управления и выполняющий последовательность команд, отсчитываемую от этой точки (выполняемая параллельно в рамках процесса часть программы). Ресурсы, включающие адресное пространство, открытые файлы, полномочия, квоты и т.д., используются всеми нитями процесса совместно. Каждая нить, кроме того, обладает собственными объектами, такими как указатель команд, стек или контекст ресурсов. В традиционных системах UNIX процесс имеет единственную выполняющуюся нить. Многонитевые системы позволяют каждому процессу иметь более одной выполняющейся нити.

Типы нитей:

1) Нити ядра не требуют связи с каким-либо прикладным процессом. Они создаются и уничтожаются ядром и внутри ядра по мере необходимости и отвечают за выполнение определенных функций. Такие нити используют совместно доступные области кода глобальные данные ядра, но обладают собственным стеком в ядре. Они могут независимо назначаться на выполнение и используют стандартные механизмы синхронизации ядра, такие как sleep или wakeup. Нити ядра применяются для выполнения таких операций, как асинхронный ввод-вывод, они также являются малозатратными при создании и использовании. Переключение контекста между нитями ядра происходит быстро, что исключает необходимость обновлять отображение памяти.

2) Легковесный процесс (или LWP, lightweight process)-это прикладная нить, поддерживаемая ядром. LWP - это абстракция высокого уровня, основанная на понятии нити ядра. Каждый процесс может иметь один или более LWP, любой из которых, поддерживается отдельной нитью ядра (Рисунок 3.6 - Легковесные процессы). Легковесные процессы планируются на выполнение независимо от процесса, но совместно разделяют адресное пространство и другие ресурсы процесса. Многонитевые процессы применяются в тех случаях, когда каждая нить является полностью независимой и редко взаимодействует с другими нитями. Если доступ к каким-либо данным производится одновременно несколькими LWP, необходимо обеспечить синхронизацию доступа. Для этого ядро системы предоставляет средства блокировки. Такими средствами являются взаимные исключения семафоры и условные переменные.

Рисунок 3.6 - Легковесные процессы

Многие операции над легковесными процессами, например создание, уничтожение и синхронизация, требует применения системных вызовов. Но системные вызовы являются затратными операциями. Т. к. каждый вызов требует двух переключений режима:

  • сначала из режима задачи в режим ядра;

  • и обратное переключение после завершения работы функции.

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

Таким образом, что хотя ядро системы предоставляет механизмы создания, синхронизации и обработки легковесных процессов, но за их правильное применение отвечает программист.