Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 42
Текст из файла (страница 42)
В этом разделе мы подробно рассмотрим роль потоков выполненияв распределенных системах и объясним, почему они так важны. Дополнительнуюинформацию о потоках выполнения и о том, как они используются для построения приложений, можно найти в [263, 439].3.1.1.
Знакомство с потоками выполненияДля понимания роли потоков выполнения в распределенных системах важно понять, что такое процесс и как соотносятся между собой процессы и потоки выполнения. Для выполненрш программ операционная система создает нескольковиртуальных процессоров, по одному для каждой программы.
Чтобы отслеживать эти виртуальные процессоры, операционная система поддерживает таблицупроцессов {process table), содержащую записи для сохранения значений регистровпроцессора, карт памяти, открытых файлов, учетных записях пользователей, привилегиях и т. п. Процесс {process) часто определяют как выполняемую программу,то есть программу, которая в настоящее время выполняется на одном из виртуальных процессоров операционной системы. Следует отметить, что операционная система уделяет огромное внимание гарантиям того, чтобы эти независимыепроцессы по злому умыслу или ненамеренно не нарушили правильную работудругих процессов.
Другими словами, тот факт, что множество процессов совместно используют один и тот же процессор и другие аппаратные ресурсы, прозрачен.Обычно для того, чтобы подобным образом отделять процессы друг от друга, операционной системе требуется аппаратная поддержка.Прозрачность параллельной работы обходится довольно дорого. Так, например, каждый раз при создании процесса операционная система должна создавать166Глава 3. Процессыабсолютно независимое адресное пространство. Выделение памяти требует инициализации сегмента памяти, например, путем обнуления сегмента данных, копирования соответствующей программы в сегмент кода и помещения в стек временных данных.
Переключение процессора между двумя процессами — такжедовольно дорогостоящая операция. Кроме сохранения контекста процессора (в который входят значения регистров, счетчик программы, указатель на стек и т. п.)операционная система должна также изменить регистры блока управленияпамятью (Memory Management Unit, MMU) и объявить некорректным содержимое кэша трансляции адресов, например ассоциативного буфера страниц (Translation Lookaside Buffer, TLB). Кроме того, если операционная система поддерживаетбольше процессов, чем может одновременно поместиться в оперативной памяти, перед действительным переключением с одного процесса на другой можетпотребоваться подкачка {swapping) процессов между оперативной памятью идиском.Поток выполнения очень похож на процесс, в том смысле, что он также может рассматриваться как программа, выполняемая на виртуальном процессоре.Однако в отличие от процесса не следует пытаться достичь высокой степенипрозрачности параллельного выполнения потоков, поскольку это приводит к падению производительности.
Тем не менее система потоков выполнения обычнообеспечивает лишь тот минимум информации, который позволяет совместно использовать процессор для различных потоков выполнения. В частности, контекст потока выполпепия {thread context) нередко содержит просто контекстпроцессора и некоторую другую информацию, необходимую для управления потоком выполнения. Так, например, система потоков может отслеживать факт блокировки потока переменной мьютекса и вытекающую из этого невозможностьпереключения на выполнение такого потока. Информация, не являющаяся абсолютно необходимой для управления многочисленными потоками, обычно игнорируется. По этой причине задача защиты данных в потоках выполнения одногопроцесса от несанкционированного доступа возлагается на разработчиков приложения.У подобного подхода имеется два аспекта.
Во-первых, высокая производительность многопоточных приложений достижима с гораздо меньшими усилиями, чем в случае их однопоточного аналога. На самом деле многопоточные системы обычно дают выигрыш в производительности. Во-вторых, поскольку потокивыполнения одного процесса не защищаются автоматически друг от друга, разработка многопоточных приложений требует дополнительных интеллектуальныхусилий. Обычно хорошо помогает правильное проектирование и ясность мысли.К сожалению, текущая практика показывает, что эти принципы не всегда воспринимаются должным образом.Потоки выполнения в нераспределенных системахДо того как мы примемся обсуждать роль потоков выполнения в распределенныхсистемах, рассмотрим сначала, как они используются в системах обычных, нераспределенных. Многопоточные процессы способны принести определенные выгоды, повышающие популярность систем с их поддержкой.3.1. Потоки выполнения167Наиболее важное преимущество вытекает из того факта, что процессы с одним потоком выполнения целиком блокируются при любом блокирующем системном вызове.
В качестве иллюстрации рассмотрим какое-либо приложение,например электронные таблицы. Представим себе, что пользователь хочет постоянно изменять значения ячеек в интерактивном режиме. Важным свойствомэлектронных таблиц является поддержка функциональных зависимостей междуразличными ячейками таблицы или различными таблицами. Таким образом, каждый раз при модификации ячейки все ячейки, связанные с ней, автоматическиобновляются. После того как пользователь изменит значение одной из ячеек,внесенное PIM изменение вызовет значительный объем вычислений. Если мы будем работать только с одним потоком выполнения, во время ожидания ввода этивычисления окажутся невозможными. Точно так же нелегко будет организоватьввод в процессе вычислений.
Самым простым решением было бы создать какминимум два потока выполнения — один для поддержания работы с пользователем, другой для обновления таблиц.Другим преимуществом многопоточности является возможность обеспечения параллелизма выполнения программ в мультипроцессорной системе. В этомслучае каждый поток выполняется на своем процессоре, а совместно используемые данные размещаются в общей (разделяемой) памяти. При правильном проектировании подобный параллелизм может быть прозрачным, процесс будетработать так же хорошо и в однопроцессорной системе, разве что немного медленнее. Многопоточная структура в связи с доступностью относительно недорогихмультипроцессорных рабочих станций становится все важнее в плане поддержки параллельного выполнения. На подобных компьютерных системах обычно работают серверы в приложениях клиент-сервер.Многопоточная структура часто используется при построении больших приложений.
Подобные приложения часто разрабатываются в виде наборов совместно работающих программ, каждая из которых выполняется отдельным процессом. Этот подход типичен для среды UNIX. Кооперация между программамиреализуется в виде межпроцессного взаимодействия (через механизмы IPC).Для UNIX-систем эти механизмы обычно включают в себя каналы (ршенованные), очереди сообщений и совместно используемые сегменты памяти [436]. Основной оборотной стороной механизмов IPC является необходимость интенсивного переключения контекстов, продемонстрированная тремя точками на ppic. 3.1.Поскольку IPC требует вмешательства в ядро, процесс обычно вынужденсначала переключиться из пользовательского режима в режим ядра (точка S1 нарисунке).
Это требует изменения карты памяти в блоке MMU, а также сбросабуфера TLB. В ядре происходит переключение контекста процесса (точка 52),после чего второй процесс может быть активизирован очередным переключением из режима ядра в пользовательский режим (точка S3). Последнее переключение вновь потребует изменения карты памяти в блоке MMU и буфера сбросаTLB.Вместо использования процессов приложение может быть построено так,чтобы различные части выполнялись в отдельных потоках. Связь между этимичастями обеспечивается только через разделяемую память. Переключение между168Глава 3.
Процессыпотоками выполнения может происходить исключительно в пространстве пользователя, хотя в некоторых реализациях за потоки выполнения отвечает (управляет ими) ядро. Результатом может быть значительное повышение производительности.S1: переключениеиз пространствапользователяв пространство ядраS3: переключениеиз пространства ядрав пространство пользователяS2: переключение контекстаиз процесса А в процесс ВРис. 3 . 1 .