Автор: Пользователь скрыл имя, 15 Декабря 2012 в 16:47, реферат
Когда в системе одновременно выполняется несколько независимых задач, то возникают дополнительные проблемы. Хотя потоки возникают и выполняются асинхронно, у них может возникнуть необходимость во взаимодействии, например при обмене данными. Согласование скоростей потоков также очень важно для предотвращения эффекта «гонок» (когда несколько потоков пытаются изменить один и тот же файл), взаимных блокировок или других коллизий, которые возникают при совместном использовании ресурсов. Синхронизация потоков является одной из важных функций подсистемы управления процессами и потоками.
Планирование процессов и потоков
Одной из основных подсистем мультипрограммной ОС, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами и потоками, которая занимается их созданием и уничтожением, поддерживает взаимодействие между ними, а также распределяет процессорное время между несколькими одновременно существующими в системе процессами и потоками.
Подсистема
управления процессами и потоками ответственна
за обеспечение процессов
Когда
в системе одновременно выполняется
несколько независимых задач, то
возникают дополнительные проблемы.
Хотя потоки возникают и выполняются
асинхронно, у них может возникнуть
необходимость во взаимодействии, например
при обмене данными. Согласование скоростей
потоков также очень важно
для предотвращения эффекта «гонок»
(когда несколько потоков
Каждый
раз, когда процесс завершается,
ОС предпринимает шаги, чтобы «зачистить
следы» его пребывания в системе.
Подсистема управления процессами закрывает
все файлы, с которыми работал
процесс, освобождает области
Понятия «процесс» и «поток»
Чтобы
поддерживать мультипрограммирование,
ОС должна определить и оформить для
себя те внутренние единицы работы,
между которыми будет разделяться
процессор и другие ресурсы компьютера.
В настоящее время в
Очевидно,
что любая работа вычислительной
системы заключается в
В операционных системах, где существуют и процессы, и потоки, процесс рассматривается операционной системой как заявка на потребление всех видов ресурсов, кроме одного — процессорного времени. Этот последний важнейший ресурс распределяется операционной системой между другими единицами работы — потоками, которые и получили свое название благодаря тому, что они представляют собой последовательности (потоки выполнения) команд.
В
простейшем случае процесс состоит
из одного потока, и именно таким
образом трактовалось понятие «процесс»
до середины 80-х годов (например, в
ранних версиях UNIX) и в таком же
виде оно сохранилось в некоторых
современных ОС. В таких системах
понятие «поток» полностью
Для того чтобы процессы не могли вмешаться в распределение ресурсов, а также не могли повредить коды и данные друг друга, важнейшей задачей ОС является изоляция одного процесса от другого. Для этого операционная система обеспечивает каждый процесс отдельным виртуальным адресным пространством, так что ни один процесс не может получить прямого достуца к командам и данным другого процесса.
При необходимости взаимодействия процессы обращаются к операционной системе, которая, выполняя функции посредника, предоставляет им средства межпроцессной связи — конвейеры, почтовые ящики, разделяемые секции памяти и некоторые другие.
Однако
в системах, в которых отсутствует
понятие потока, возникают проблемы
при организации параллельных вычислений
в рамках процесса. А такая необходимость
может возникать. Действительно, при
мультипрограммировании повышается пропускная
способность системы, но отдельный
процесс никогда не может быть
выполнен быстрее, чем в однопрограммном
режиме (всякое разделение ресурсов только
замедляет работу одного из участников
за счет дополнительных затрат времени
на ожидание освобождения ресурса). Однако
приложение, выполняемое в рамках
одного процесса, может обладать внутренним
параллелизмом, который в принципе
мог бы позволить ускорить его
решение. Если, например, в программе
предусмотрено обращение к
Потоки возникли в операционных системах как средство распараллеливания вычислений. Конечно, задача распараллеливания вычислений в рамках одного приложения может быть решена и традиционными способами.
Во-первых, прикладной программист может взять на себя сложную задачу организации параллелизма, выделив в приложении некоторую подпрограмму- диспетчер, которая периодически передает управление той или иной ветви вычислений. При этом программа получается логически весьма запутанной, с многочисленными передачами управления, что существенно затрудняет ее отладку и модификацию.
Во-вторых, решением является создание для одного приложения нескольких процессов для каждой из параллельных работ. Однако использование для создания процессов стандартных средств ОС не позволяет учесть тот факт, что эти процессы решают единую задачу, а значит, имеют много общего между собой — они могут работать с одними и теми же данными, использовать один и тот же кодовый сегмент, наделяться одними и теми же правами доступа к ресурсам вычислительной системы. Так, если в примере с сервером баз данных создавать отдельные процессы для каждого запроса, поступающего из сети, то все процессы будут выполнять один и тот же программный код и выполнять поиск в записях, общих для всех процессов файлов данных. А операционная система при таком подходе будет рассматривать эти процессы наравне со всеми остальными процессами и с помощью универсальных механизмов обеспечивать их изоляцию друг от друга. В данном случае все эти достаточно громоздкие механизмы используются явно не по назначению, выполняя не только бесполезную, но и вредную работу, затрудняющую обмен данными между различными частями приложения. Кроме того, на создание каждого процесса ОС тратит определенные системные ресурсы, которые в данном случае неоправданно дублируются — каждому процессу выделяются собственное виртуальное адресное пространство, физическая память, закрепляются устройства ввода-вывода и т. п.
Из всего вышеизложенного, следует, что в операционной системе наряду с процессами нужен другой механизм распараллеливания вычислений, который учитывал бы тесные связи между отдельными ветвями вычислений одного и того же приложения. Для этих целей современные ОС предлагают механизм многопоточной обработки (multithreading). При этом вводится новая единица работы — поток выполнения, а понятие «процесс» в значительной степени меняет смысл. Понятию «поток» соответствует последовательный переход процессора от одной команды программы к другой. ОС распределяет процессорное время между потоками. Процессу ОС назначает адресное пространство и набор ресурсов, которые совместно используются всеми его потоками.
ПРИМЕЧАНИЕ
Заметим, что в однопрограммных системах не возникает необходимости введения понятия, обозначающего единицу работы, так как там не существует проблемы разделения ресурсов.
Создание потоков требует от ОС
меньших накладных расходов, чем
процессов. В отличие от процессов,
которые принадлежат разным, вообще
говоря, конкурирующим приложениям,
все потоки одного процесса всегда
принадлежат одному приложению, поэтому
ОС изолирует потоки в гораздо
меньшей степени, нежели процессы в
традиционной мультипрограммной системе.
Все потоки одного процесса используют
общие файлы, таймеры, устройства, одну
и ту же область оперативной памяти,
одно и то же адресное пространство.
Это означает, что они разделяют
одни и те же глобальные переменные.
Поскольку каждый поток может
иметь доступ к любому виртуальному
адресу процесса, один поток может
использовать стек другого потока.
Между потоками одного процесса нет
полной защиты, потому что, во-первых, это
невозможно, а во-вторых, не нужно. Чтобы
организовать взаимодействие и обмен
данными, потокам вовсе не требуется
обращаться к ОС, им достаточно использовать
общую память — один поток записывает
данные, а другой читает их. С другой стороны,
потоки разных процессов по-прежнему хорошо
защищены друг от друга.
Итак,
мультипрограммирование более эффективно
на уровне потоков, а не процессов. Каждый
поток имеет собственный
Использование потоков связано не только со стремлением повысить производительность системы за счет параллельных вычислений, но и с целью создания более читабельных, логичных программ. Введение нескольких потоков выполнения упрощает программирование. Например, в задачах типа «писатель-читатель» один поток выполняет запись в буфер, а другой считывает записи из него. Поскольку они разделяют общий буфер, не стоит их делать отдельными процессами. Другой пример использования потоков — управление сигналами, такими как прерывание с клавиатуры (del или break). Вместо обработки сигнала прерывания один поток назначается для постоянного ожидания поступления сигналов. Таким образом, использование потоков может сократить необходимость в прерываниях пользовательского уровня. В этих примерах не столь важно параллельное выполнение, сколь важна ясность программы.
Наибольший
эффект от введения многопоточной обработки
достигается в
Создание процессов и потоков
Создать процесс — это прежде всего означает создать описатель процесса, в качестве которого выступает одна или несколько информационных структур, содержащих все сведения о процессе,, необходимые операционной системе для управления им. В число таких сведений могут входить, например, идентификатор процесса, данные о расположении в памяти исполняемого модуля, степень привилегированности процесса (приоритет и права доступа) и т. п. Примерами описателей процесса являются блок управления задачей (ТСВ — Task Control Block) в OS/360, управляющий блок процесса (РСВ — Process Control Block) в OS/2, дескриптор процесса в UNIX, объект-процесс (object-process) в Windows NT.
Создание описателя процесса знаменует собой появление в системе еще одного претендента на вычислительные ресурсы. Начиная с этого момента при распределении ресурсов ОС должна принимать во внимание потребности нового процесса.
Создание процесса включает загрузку кодов и данных исполняемой программы данного процесса с диска в оперативную память. Для этого ОС должна обнаружить местоположение такой программы на диске, перераспределить оперативную память и выделить память исполняемой программе нового процесса. Затем необходимо считать программу в выделенные для нее участки памяти и, возможно, изменить параметры программы в зависимости от размещения в памяти. В системах с виртуальной памятью в начальный момент может загружаться только часть кодов и данных процесса, с тем чтобы «подкачивать» остальные по мере необходимости. Существуют системы, в которых на этапе создания процесса не требуется непременно загружать коды и данные в оперативную память, вместо этого исполняемый модуль копируется из того каталога файловой системы, в котором он изначально находился, в область подкачки — специальную область диска, отведенную для хранения кодов и данных процессов. При выполнении всех этих действий подсистема управления процессами тесно взаимодействует с подсистемой управления памятью и файловой системой.
В
многопоточной системе при