гуд работа. Курс лекций теория вычислительных процессов
Скачать 1.54 Mb.
|
Понятие "нить" В традиционных ОС понятие нити тождественно понятию процесса. В действительности желательно иметь несколько нитей управления, разделяющих единое адресное пространство, но выполняющихся квази- параллельно. Предположим, например, что файл-сервер блокируется, ожидания выполнения операции с диском. Если сервер имеет несколько нитей управления, вторая нить может выполняться, пока первая нить находит- ся в состоянии ожидания. Это повышает пропускную способность и производительность. Эта цель не дости- гается путем создания двух независимых серверных процессов, потому что они должны разделять общий буфер кэша, который требуется им, чтобы быть в одном адресном пространстве. На рисунке 3.9,а показана машина с тремя процессами. Каждый процесс имеет собственный про- граммный счетчик, собственный стек, собственный набор регистров и собственное адресное пространство. Каждый процесс не должен ничего делать с остальными, за исключением того, что они могут взаимодейст- вовать посредством системных примитивов связи, таких как семафоры, мониторы, сообщения. На рисунке 3.9,б показана другая машина с одним процессом. Этот процесс состоит из нескольких нитей управления, обычно называемых просто нитями или иногда облегченными процессами. Во многих отношениях нити по- добны мини-процессам. Каждая нить выполняется строго последовательно и имеет свой собственный про- граммный счетчик и стек. Нити разделяют процессор так, как это делают процессы (разделение времени). Только на многопроцессорной системе они действительно выполняются параллельно. Нити могут, напри- мер, порождать нити-потомки, могут переходить в состояние ожидания до завершения системного вызова, как обычные процессы, пока одна нить заблокирована, другая нить того же процесса может выполняться. 49 Рис. 3.9. а) Три процесса с одной нитью каждый б) Один процесс с тремя нитями Нити делают возможным сохранение идеи последовательных процессов, которые выполняют блоки- рующие системные вызовы (например, RPC для обращения к диску), и в то же время позволяют достичь па- раллелизма вычислений. Блокирующие системные вызовы делают проще программирование, а параллелизм повышает производительность. Различные способы организации вычислительного процесса с использованием нитей Один из возможных способов организации вычислительного процесса показан на рисунке 3.10,а. Здесь нить-диспетчер читает приходящие запросы на работу из почтового ящика системы. После проверки запроса диспетчер выбирает простаивающую (то есть блокированную) рабочую нить, передает ей запрос и активизирует ее, устанавливая, например, семафор, который она ожидает. Когда рабочая нить активизируется, она проверяет, может ли быть выполнен запрос с данными раз- деляемого блока кэша, к которому имеют отношение все нити. Если нет, она посылает сообщение к диску, чтобы получить нужный блок (предположим, это READ), и переходит в состояние блокировки, ожидая за- вершения дисковой операции. В этот момент происходит обращение к планировщику, в результате работы которого активизируется другая нить, возможно, нить-диспетчер или некоторая рабочая нить, готовая к вы- полнению. Структура с диспетчером не единственный путь организации многонитевой обработки. В модели "команда" все нити эквивалентны, каждая получает и обрабатывает свои собственные запросы. Иногда ра- боты приходят, а нужная нить занята, особенно, если каждая нить специализируется на выполнении особого вида работ. В этом случае может создаваться очередь незавершенных работ. При такой организации нити должны вначале просматривать очередь работ, а затем почтовый ящик. Нити могут быть также организованы в виде конвейера. В этом случае первая нить порождает неко- торые данные и передает их для обработки следующей нити и т.д. Хотя эта организация и не подходит для файл-сервера, для других задач, например, задач типа "производитель-потребитель", это хорошее решение. Нити часто полезны и для клиентов. Например, если клиент хочет растиражировать файл на много серверов, он может создать по одной нити для копирования на каждом сервере. Другое использование нитей клиентами - это управление сигналами, такими как прерывание с клавиатуры (del или break). Вместо обра- ботки сигнала прерывания одна нить назначается для постоянного ожидания поступления сигналов. Таким образом, использование нитей может сократить необходимое количество прерываний пользовательского уровня. Другой аргумент в пользу нитей не имеет отношения ни к удаленным вызовам, ни к коммуникациям. Некоторые прикладные задачи легче программировать, используя параллелизм, например задачи типа "про- изводитель-потребитель". Не столь важно параллельное выполнение, сколь важна ясность программы. А поскольку они разделяют общий буфер, не стоит их делать отдельными процессами. Наконец, в многопроцессорных системах нити из одного адресного пространства могут выполняться параллельно на разных процессорах. С другой стороны, правильно сконструированные программы, которые используют нити, должны работать одинаково хорошо на однопроцессорной машине в режиме разделения времени между нитями и на настоящем мультипроцессоре. 50 Вопросы реализации нитей Существует два подхода к управлению нитями: статический и динамический. При статическом под- ходе вопрос, сколько будет нитей, решается уже на стадии написания программы или на стадии компиля- ции. Каждой нити назначается фиксированный стек. Этот подход простой, но негибкий. Более общим явля- ется динамический подход, который позволяет создавать и удалять нити оперативно по ходу выполнения. Системный вызов для создания нити обычно содержится в нити главной программы в виде указателя на процедуру с указанием размера стека, а также других параметров, например, диспетчерского приоритета. Вызов обычно возвращает идентификатор нити, который можно использовать в последующих вызовах, свя- занных с этой нитью. В этой модели процесс начинается с одной нити, но может создавать их еще, когда необходимо. Завершаться нити могут одним из двух способов: по своей инициативе, когда завершается работа, и извне. Во многих случаях, например, при конвейерной модели, нити создаются сразу же после старта про- цесса и никогда не уничтожаются. Рис. 3.10. Три способа организации нитей в процессе: а - модель диспетчер/рабочие нити; б - модель "команда"; в - модель конвейера Поскольку нити разделяют общую память, они могут (и, как правило, делают это) использовать ее для сохранения данных, которые совместно используются множеством нитей, таких, например, как буфер в системе "производитель-потребитель". Доступ к разделяемым данным обычно программируется с использо- ванием критических секций, предотвращающих попытки сразу нескольких нитей обратиться к одним и тем 51 52 же данным в одно и то же время. Критическая секция наиболее легко реализуется с использованием сема- форов, мониторов и аналогичных конструкций. Нити могут быть реализованы как в пользовательском пространстве, так и в пространстве ядра. В первом случае нити работают на базе прикладной системы, управляющей всеми операциями с нитями. Пер- вым преимуществом такого способа является то, что можно реализовать нити в операционной системе, ко- торая их не поддерживает. ОС прикладная среда, управляющая нитями, кажется одним процессом. Все вы- зовы (ПРИОСТАНОВИТЬ, ПРОВЕРИТЬ СЕМАФОР и т. д.) обрабатываются как вызовы функций этой при- кладной среды. Она сохраняет регистры и переключает указатели счетчика команд и стека. В этом случае переключение происходит быстрее, чем с помощью ядра. Такая реализация имеет еще одно преимущество - для каждого процесса можно организовать свою схему планирования. Однако этот подход связан с некото- рыми проблемами, одна из которых состоит в следующем. При выполнении блокирующих системных вызо- вов приостанавливается весь набор нитей, принадлежащих этому процессу. Чтобы избежать этого, можно сделать все системные вызовы неблокирующими, но это требует изменений в ОС, что нежелательно, так как одной из целей реализации нитей в пользовательском пространстве является их работа в существующих операционных системах. Такой проблемы не существует при реализации нитей в пространстве ядра. Преимущество заключа- ется также и в том, что ядро может при диспетчеризации выбирать нить из другого процесса. Однако хотя механизм управления нитями аналогичен первому случаю, временные затраты на переключение нитей вы- ше, так как тратится время на переключение из режима пользователя в режим ядра. 6. Планирование процессов в ОС UNIX В системе UNIX System V Release 4 реализована вытесняющая многозадачность, основанная на ис- пользовании приоритетов и квантования. Все процессы разбиты на несколько групп, называемых классами приоритетов. Каждая группа имеет свои характеристики планирования процессов. Созданный процесс наследует характеристики планирования процесса-родителя, которые включают класс приоритета и величину приоритета в этом классе. Процесс остается в данном классе до тех пор, пока не будет выполнен системный вызов, изменяющий его класс. В UNIX System V Release 4 возможно включение новых классов приоритетов при инсталляции сис- темы. В настоящее время имеется три приоритетных класса: класс реального времени, класс системных процессов и класс процессов разделения времени. В отличие от ранних версий UNIX приоритетность (при- вилегии) процесса тем выше, чем больше число, выражающее приоритет. На рисунке 5.2 показаны диапазо- ны изменения приоритетов для разных классов. Значения приоритетов определяются для разных классов по разному. Процессы системного класса используют стратегию фиксированных приоритетов. Системный класс зарезервирован для процессов ядра. Уровень приоритета процессу назначается ядром и никогда не изменя- ется. Заметим, что пользовательский процесс, перешедший в системную фазу, не переходит при этом в сис- темный класс приоритетов. Процессы реального времени также используют стратегию фиксированных приоритетов, но пользо- ватель может их изменять. Так как при наличии готовых к выполнению процессов реального времени дру- гие процессы не рассматриваются, то процессы реального времени надо тщательно проектировать, чтобы они не захватывали процессор на слишком долгое время. Характеристики планирования процессов реально- го времени включают две величины: уровень глобального приоритета и квант времени. Для каждого уровня приоритета имеется по умолчанию своя величина кванта времени. Процессу разрешается захватывать про- цессор на указанный квант времени, а по его истечении планировщик снимает процесс с выполнения. Процессы разделения времени были до появления UNIX System V Release 4 единственным классом процессов, и по умолчанию UNIX System V Release 4 назначает новому процессу этот класс. Состав класса процессов разделения времени наиболее неопределенный и часто меняющийся, в отличие от системных процессов и процессов реального времени. Для справедливого распределения времени процессора между процессами, в этом классе используется стратегия динамических приоритетов, которая адаптируется к опе- рационным характеристикам процесса. Приоритетный класс Выбор планировщика Глобальное значение приоритета Реальное время (real time) первый 159 53 . . . . . . . 100 Системные процессы (system) . . . . . . . . 99 . . . . . . 60 Процессы разделения времени (time-shared) . . . . . . . последний 59 . . . . . . 0 Возможно добавление новых классов Рис. 5.2. Приоритетные классы процессов Величина приоритета, назначаемого процессам разделения времени, вычисляется пропорционально значениям двух составляющих: пользовательской части и системной части. Пользовательская часть приори- тета может быть изменена суперпользователем и владельцем процесса, но в последнем случае только в сто- рону его снижения. Системная составляющая позволяет планировщику управлять процессами в зависимости от того, как долго они используют процессор, не уходя в состояние ожидания. Тем процессам, которые потребляют большие периоды времени без ухода в состояние ожидания, приоритет снижается, а тем процессам, которые часто уходят в состояние ожидания после короткого периода использования процессора, приоритет повы- шается. Таким образом, процессам, ведущим себя не по-джентльменски, дается низкий приоритет, что озна- чает, что они реже выбираются на выполнение. Но процессам с низким приоритетом даются большие кван- ты времени, чем процессам с высокими приоритетами. Таким образом, хотя низкоприоритетный процесс и не работает так часто, как высокоприоритетный, но зато, когда он наконец выбирается на выполнение, ему отводится больше времени. Планировщик использует следующие характеристики для процессов разделения времени: ts_globpri содержит величину глобального приоритета; ts_quantum определяет количество тиков системных часов, которые отводятся процессу до его вытеснения; ts_tqexp системная часть приоритета, назначаемая процессу при истечении его кванта времени; ts_slpret системная составляющая приоритета, назначаемая процессу после выхода его из состояния ожидания; ожидающим процессам дается высокий приоритет, так что они быстро получают доступ к процессору после освобождения ресурса; ts_maxwaite максимальное число секунд, которое разрешается потреблять процессу; если этот квант време- ни истекает до кванта ts_quantum, то, следовательно, считается, что процесс ведет себя по- джентльменски, и ему назначается более высокий приоритет; ts_lwait величина системной части приоритета, назначаемая процессу, если истекает ts_maxwait секунд. Для процессов разделения времени в дескрипторе процесса proc имеется указатель на структуру, специфическую для данного класса процесса. Эта структура состоит из полей, используемых для вычисле- ния глобального приоритета: 54 ts_timeleft число тиков, остающихся в кванте процесса; ts_cpupri системная часть приоритета процесса; ts_uprilim, ts_upri верхний предел и текущее значение пользовательской части приоритета. Эти две переменные могут модифицироваться пользователем; ts_nice используется для обратной совместимости с системным вызовом nice. Она содержит текущее значение величины nice, которая влияет на результирующую величину приоритета. Чем выше эта величина, тем меньше приоритет. В версии SVR4 нет поддержки многонитевой (multithreading) организации процессов на уровне ядра, хотя и есть два системных вызова для организации нитей в пользовательском режиме. Во многих коммерче- ских реализациях UNIX, базирующихся на кодах SVR4, в ядро включена поддержка нитей за счет собствен- ной модификации исходных текстов SVR4. 7. Процессы и нити в ОС Windows NT В разных ОС процессы реализуются по-разному. Эти различия заключаются в том, какими структу- рами данных представлены процессы, как они именуются, какими способами защищены друг от друга и ка- кие отношения существуют между ними. Процессы Windows NT имеют следующие характерные свойства: • Процессы Windows NT реализованы в форме объектов, и доступ к ним осуществляется по- средством службы объектов. • Процесс Windows NT имеет многонитевую организацию. • Как объекты-процессы, так и объекты-нити имеют встроенные средства синхронизации. • Менеджер процессов Windows NT не поддерживает между процессами отношений типа "ро- дитель-потомок". В любой системе понятие "процесс" включает следующее: • исполняемый код, • собственное адресное пространство, которое представляет собой совокупность виртуальных адресов, которые может использовать процесс, • ресурсы системы, такие как файлы, семафоры и т.п., которые назначены процессу операцион- ной системой. • хотя бы одну выполняемую нить. Адресное пространство каждого процесса защищено от вмешательства в него любого другого про- цесса. Это обеспечивается механизмами виртуальной памяти. Операционная система, конечно, тоже защи- щена от прикладных процессов. Чтобы выполнить какую-либо процедуру ОС или прочитать что-либо из ее области памяти, нить должна выполняться в режиме ядра. Пользовательские процессы получают доступ к функциям ядра посредством системных вызовов. В пользовательском режиме выполняются не только при- кладные программы, но и защищенные подсистемы Windows NT. В Windows NT процесс - это просто объект, создаваемый и уничтожаемый менеджером объектов. Объект-процесс, как и другие объекты, содержит заголовок, который создает и инициализирует менеджер объектов. Менеджер процессов определяет атрибуты, хранимые в теле объекта-процесса, а также обеспечи- вает системный сервис, который восстанавливает и изменяет эти атрибуты. В число атрибутов тела объекта-процесса входят: • Идентификатор процесса - уникальное значение, которое идентифицирует процесс в рамках операционной системы. • Токен доступа - исполняемый объект, содержащий информацию о безопасности. • Базовый приоритет - основа для исполнительного приоритета нитей процесса. • Процессорная совместимость - набор процессоров, на которых могут выполняться нити про- цесса. • Предельные значения квот - максимальное количество страничной и нестраничной системной памяти, дискового пространства, предназначенного для выгрузки страниц, процессорного времени - кото- рые могут быть использованы процессами пользователя. • Время исполнения - общее количество времени, в течение которого выполняются все нити процесса. Напомним, что нить является выполняемой единицей, которая располагается в адресном пространст- ве процесса и использует ресурсы, выделенные процессу. Подобно процессу нить в Windows NT реализова- на в форме объекта и управляется менеджером объектов. Объект-нить имеет следующие атрибуты тела: 55 • Идентификатор клиента - уникальное значение, которое идентифицирует нить при ее обра- щении к серверу. • Контекст нити - информация, которая необходима ОС для того, чтобы продолжить выполне- ние прерванной нити. Контекст нити содержит текущее состояние регистров, стеков и индивидуальной об- ласти памяти, которая используется подсистемами и библиотеками. • Динамический приоритет - значение приоритета нити в данный момент. • Базовый приоритет - нижний предел динамического приоритета нити. • Процессорная совместимость нитей - перечень типов процессоров, на которых может выпол- няться нить. • Время выполнения нити - суммарное время выполнения нити в пользовательском режиме и в режиме ядра, накопленное за период существования нити. • Состояние предупреждения - флаг, который показывает, что нить должна выполнять вызов асинхронной процедуры. • Счетчик приостановок - текущее количество приостановок выполнения нити. Кроме перечисленных, имеются и некоторые другие атрибуты. Как видно из перечня, многие атрибуты объекта-нити аналогичны атрибутам объекта-процесса. Весьма сходны и сервисные функции, которые могут быть выполнены над объектами-процессами и объек- тами-нитями: создание, открытие, завершение, приостановка, запрос и установка информации, запрос и ус- тановка контекста и другие функции. |