Нить – это динамический объект, в процессе представленный одной точкой управления и выполняющий последовательность команд, отсчитываемую от этой точки (выполняемая параллельно в рамках процесса часть программы). Ресурсы, включающие адресное пространство, открытые файлы, полномочия, квоты и т.д., используются всеми нитями процесса совместно. Каждая нить, кроме того, обладает собственными объектами, такими как указатель команд, стек или контекст ресурсов. В традиционных системах UNIX процесс имеет единственную выполняющуюся нить. Многонитевые системы позволяют каждому процессу иметь более одной выполняющейся нити.
Типы нитей:
1) Нити ядране требуют связи с каким-либо прикладным процессом. Они создаются и уничтожаются ядром и внутри ядра по мере необходимости и отвечают за выполнение определенных функций. Такие нити используют совместно доступные области кода глобальные данные ядра, но обладают собственным стеком в ядре. Они могут независимо назначаться на выполнение и используют стандартные механизмы синхронизации ядра, такие как sleep или wakeup. Нити ядра применяются для выполнения таких операций, как асинхронный ввод-вывод, они также являются малозатратными при создании и использовании. Переключение контекста между нитями ядра происходит быстро, что исключает необходимость обновлять отображение памяти.
2) Легковесный процесс(или LWP, lightweight process)-это прикладная нить, поддерживаемая ядром. LWP - это абстракция высокого уровня, основанная на понятии нити ядра. Каждый процесс может иметь один или более LWP, любой из которых, поддерживается отдельной нитью ядра (Рисунок 3.6 - Легковесные процессы). Легковесные процессы планируются на выполнение независимо от процесса, но совместно разделяют адресное пространство и другие ресурсы процесса. Многонитевые процессы применяются в тех случаях, когда каждая нить является полностью независимой и редко взаимодействует с другими нитями. Если доступ к каким-либо данным производится одновременно несколькими LWP, необходимо обеспечить синхронизацию доступа. Для этого ядро системы предоставляет средства блокировки. Такими средствами являются взаимные исключения семафоры и условные переменные.
Рисунок 3.6 - Легковесные процессы
Многие операции над легковесными процессами, например создание, уничтожение и синхронизация, требует применения системных вызовов. Но системные вызовы являются затратными операциями. Т. к. каждый вызов требует двух переключений режима:
- сначала из режима задачи в режим ядра;
- и обратное переключение после завершения работы функции.
Когда легковесным процессам необходимо часто пользоваться разделяемыми данными, то затраты на синхронизацию могут свести на нет увеличение производительности от их применения.
Таким образом, что хотя ядро системы предоставляет механизмы создания, синхронизации и обработки легковесных процессов, но за их правильное применение отвечает программист.
3) Прикладные нити. Существует возможности поддержки нитей полностью на прикладном уровне, при этом ядру об их существовании ничего не известно.
Библиотеки C-threads системы Mach и pthreds стандарта POSIX содержат все необходимые функции для создания, синхронизации, планирования и обработки нитей без какой-либо специальной помощи ядра. Вследствие этого функционирование таких нитей является необычайно быстрым.
Прикладной контекст нити может сохраняться и восстанавливаться без вмешательства ядра. Каждая прикладная нить обладает собственным стеком в адресном пространстве процесса, областью для хранения контекста регистров прикладного уровня и другой важной информации, такой как маски сигналов. Библиотека планирует выполнение и переключает контекст между прикладными нитями, сохраняя стек и состояние регистров следующей по расписанию нити. Прикладные нити не являются по настоящему планируемыми задачами, так как ядро ничего о них не знает.
Рисунок 3.7 - Применение пользовательских нитей: а – прикладные нити обычных процессов; б – мультиплексирование прикладных нитей.
Ядро просто планирует выполнение процесса (или LWP). Если процесс или LWP вытеснен кем-то, такой же участи и все его нити. Если процесс обладает всего одним LWP (или если прикладные нити реализованы на однонитевой системе), будут заблокированы все его нити.
Нитевая библиотека также включает в себя объекты синхронизации, обеспечивающие защиту совместно используемых структур данных.
Планирование
Задачи планировщика
UNIX&LINUX является системой разделения времени, это означает, что каждому процессу вычислительные ресурсы выделяются на ограниченный промежуток времени, после чего они предоставляются другому процессу и т.д. Максимальный временной интервал, на который процесс может захватить процессор, называется квантом времени (time quantum time или slice). Таким образом, создается иллюзия, что процессы выполняются одновременно, хотя в действительности в каждый момент времени выполняется только один процесс (на однопроцессорной машине).
Центральный процессор является общим ресурсом, разделяемым между всеми процессами системы. Планировщик является компонентом ОС, определяющим, какой из процессов должен выполняться в данный момент времени и как долго он может занимать процессор.
Планировщик должен наиболее оптимально распределять процессорное время между всеми процессами системы. А также, учитывая загруженность системы, обеспечивать приемлемую производительность каждому приложению при общей загруженности системы в рамках нормы.
Приложения можно условно разбить на несколько классов, в зависимости от их требований к планированию и к производительности работы:
Интерактивные приложения. Приложения типа командных интерпретаторов, редакторов и программ с графическим пользовательским интерфейсом, постоянно взаимодействующих с пользователем. Большую часть времени такие приложения находятся в ожидании действий пользователя, таких как ввод с клавиатуры или манипуляции мышью. После получения ввода приложение должно быстро его обработать, иначе пользователь будет скучать;
Пакетные приложения. К ним относятся такие, как сборка программ или вычисления, т. е. программы, не требующие взаимодействия с пользователем и часто выполняющиеся в фоновом режиме. Для таких задач эффективность планирования определяется временем завершения их работы при функционировании других процессов, сравниваемое со временем их выполнения если бы они были единственной задачей в системе;
Приложения реального времени.Это класс задач, для которых время является критическим. Обычно все они требуют гарантированного времени реакции.
На рабочей станции одновременно могут выполняться сразу несколько типов приложений. А планировщик должен оптимально удовлетворить требования каждого из них.
Цель алгоритма планирования состоит в том, чтобы обеспечить соответствие качество обслуживания приоритету, т.е. чем выше приоритет, тем меньше должно быть время отклика (реакция ОС) и тем большая доля процессорного времени достанется процессу.