Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 10
Текст из файла (страница 10)
Такой сущностью стали легковесные (thin) процессы, или, как их теперь преимущественно называют, потокивыполнения1, нити, или треды (threads).Когда говорят о процессах (process), то тем самым хотят отметить, что операционная система поддерживает их обособленность: у каждого процесса имеется своевиртуальное адресное пространство, каждому процессу назначаются свои ресурсы — файлы, окна, семафоры и т. д. Такая обособленность нужна для того, чтобызащитить один процесс от другого, поскольку они, совместно используя все ресурсы вычислительной системы, конкурируют друг с другом за доступ к ресурсам.о общем случае процессы просто никак не связаны между собой и могут принадлежать даже разным пользователям, разделяющим одну вычислительную систему.Поток выполнения (thread) не следует путать с потоком данных (stream).38Глава 1.
Основные понятияДругими словами, в случае процессов операционная система считает их совершеннонесвязанными и независимыми. При этом именно операционная система берет насебя роль арбитра в спорах конкурирующих процессов за ресурсы. Она же и обеспечивает защиту выполняющихся вычислений.Однако желательно иметь еще и возможность задействовать внутренний параллелизм, который может быть в самих процессах. Такой внутренний параллелизмвстречается достаточно часто и позволяет ускорить вычисления.
Например, некоторые операции, выполняемые приложением, могут требовать для своего исполнения достаточно длительное использование центрального процессора. В этомслучае при интерактивной работе с приложением пользователь вынужден долгоожидать завершения заказанной операции и не может управлять приложением дотех пор, пока операция не выполнится до самого конца.
Такие ситуации встречаются достаточно часто, например, при работе с графическими редакторами приобработке больших изображений с высокой степенью детализации. Если же программные модули, исполняющие такие длительные операции, оформлять в видесамостоятельных «подпроцессов» (легковесных процессов, потоков выполнения,или задач), которые могут выполняться параллельно с другими подпроцессами(потоками, задачами), то у пользователя появляется возможность параллельновыполнять несколько операций в рамках одного приложения (процесса). Легковесными эти процессы называют потому, что операционная система не должна дляних организовывать полноценную виртуальную машину, то есть эти задачи, прежде всего, не имеют своих собственных ресурсов, а развиваются в том же виртуальном адресном пространстве, могут пользоваться теми же файлами, виртуальнымиустройствами и иными ресурсами, выделенными ОС данному процессу.
Единственное, что они имеют свое — это процессорный ресурс. В однопроцессорной системепотоки выполнения (задачи) разделяют между собой процессорное время так же,как это делают обычные процессы, а в мультипроцессорной системе они могутвыполняться одновременно, если не встречают конкуренции из-за обращенияк иным ресурсам.Главное, что обеспечивает многопоточность — это возможность параллельно выполнять несколько видов операций в одной прикладной программе. Параллельные вычисления (а следовательно, и более эффективное использование ресурсовцентрального процессора, и меньшее суммарное время выполнения задач) гораздоудобнее реализовать не на уровне процессов, но на уровне задач (потоков, тредов).И программа, разработанная с использованием механизма потоков, представляемая как некоторое множество задач в рамках одного процесса, может быть выполнена быстрее за счет параллельного функционирования ее отдельных частей.
Особенно это выгодно при наличии нескольких процессоров, ибо каждая задача можетвыполняться на отдельном процессоре. Например, если электронная таблица, текстовый процессор или графический редактор были разработаны с учетом возможностей многопоточной обработки, то пользователь может запросить пересчет своегорабочего листа, слияние нескольких документов или преобразование изображения и одновременно продолжать заполнять таблицу, открывать для редактирования следующий документ, изменять другое изображение.Понятия вычислительного процесса и ресурса39Особенно эффективно можно использовать многопоточнослъ для выполнения распределенных приложений. Например, многопоточный сервер может параллельновыполнять запросы сразу нескольких клиентов.
Как известно, операционная система OS/2 была одной из первых систем, используемых в персональных компьютерах, которая поддерживала многопоточность. В середине 90-х годов для этой операционной системы было создано большое количество приложений, в которыхналичие механизмов многопоточной обработки реально приводило к существенному повышению скорости вычислений. Для систем Windows, с которыми мы всеимеем дело, ярко выраженной многопоточностыо обладают такие продукты, какSQL Server, Oracle.
И хотя те же Word, Excel, Internet Explorer также при своейработе образуют потоки, явного параллелизма в этих программах почти не поддерживается. Поэтому при увеличении числа процессоров в компьютере такиепрограммы не начинают выполняться быстрее.Итак, сущность «поток выполнения» была введена для того, чтобы именно с помощью этих единиц распределять процессорное время между возможными работами. Сущность «процесс» предполагает, что при диспетчеризации нужно учитывать все ресурсы, закрепленные за ним.
При манипулировании задачами-потокамиможно менять только контекст задачи, если мы переключаемся с одной задачи надругую в рамках одного процесса. Все остальные вычислительные ресурсы приэтом не затрагиваются. Каждый процесс всегда состоит, по крайней мере, из одного потока выполнения, и только если имеется внутренний параллелизм, программист может «расщепить» один поток на несколько параллельных. Потребность впотоках возникла еще в однопроцессорных вычислительных системах, посколькуони позволяли организовать вычисления более эффективно.
Для использованиядостоинств многопроцессорных систем с общей памятью потоки уже просто необходимы, так как позволяют не только реально ускорить выполнение тех задач, которые допускают их естественное распараллеливание, но и загрузить процессорные элементы работой, с тем чтобы они не простаивали. Заметим, однако, чтожелательно, чтобы можно было свести к минимуму взаимодействие потоков между собой, ибо ускорение от одновременного выполнения параллельных потоковможет быть сведено к минимуму из-за задержек синхронизации и обмена данными.Каждый поток выполняется строго последовательно и имеет свой собственныйпрограммный счетчик и стек. Потоки, как и процессы, могут порождать потокипотомки, поскольку любой процесс состоит по крайней мере из одного потока.Подобно традиционным процессам (то есть процессам, состоящим из одного потока), каждый поток может находиться в одном из активных состояний.
Пока одинпоток заблокирован (или просто находится в очереди готовых к исполнению задач), другой поток того же процесса может выполняться. Потоки разделяют процессорное время так же, как это делают обычные процессы, в соответствии с различными вариантами диспетчеризации.Как уже упоминалось, иногда потоки выполнения называют легковесными процессами. Как мы уже знаем, все потоки имеют одно и то же виртуальное адресноепространство своего процесса. Это означает, что они разделяют одни и те же глобальные переменные. Поскольку каждый поток может иметь доступ к каждому40Глава 1. Основные понятиявиртуальному адресу, один поток может использовать стек другого потока. Междупотоками нет полной защиты, потому что, во-первых, это невозможно, а во-вторых, не нужно.
Все потоки одного процесса всегда решают общую задачу одногопользователя, и механизм потоков используется здесь для более быстрого решения задачи путем ее распараллеливания. При этом программисту очень важно получить в свое распоряжение удобные средства организации взаимодействия частей одной программы. Повторим, что кроме разделения адресного пространства,все потоки разделяют также набор открытых файлов, устройства, выделенные процессу, имеют одни и те же наборы сигналов, семафоры и т. п. А что у потоков является их собственным? Собственными являются программный счетчик, стек, рабочие регистры процессора, потоки-потомки, состояние.Вследствие того, что потоки, относящиеся к одному процессу, выполняются в одном и том же виртуальном адресном пространстве, между ними легко организовать тесное взаимодействие, в отличие от процессов, для которых нужны специальные механизмы обмена сообщениями и данными.