Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Потоки. Реализация мультипрограммирования




 

Модель процесса базируется на двух независимых концепциях: группировании ресурсов и выполнении программы. С одной стороны, процесс представляет собой способ объединения родственных ресурсов в одну группу и имеет адресное пространство, содержащее текст программы, данные и другие ресурсы (открытые файлы, дочерние процессы, необработанные аварийные сообщения, обработчики сигналов и др.).

С другой стороны, процесс можно рассматривать как поток исполняемых команд. Поток содержит: счетчик команд, отслеживающий порядок выполнения действий; регистры, в которых хранятся текущие переменные; стек, содержащий протокол выполнения процесса. Процессы используются для группирования ресурсов, а потоки должны исполняться внутри процесса и являются объектами, поочередно исполняющимися на центральном процессоре.

Концепция потоков добавляет к модели процесса возможность одновременного выполнения в одной и той же среде процесса нескольких программ (реализацию мультипрограммирования [2]). Несколько потоков, работающих параллельно в одном процессе, аналогичны нескольким процессам, идущим параллельно на одном компьютере. В первом случае потоки разделяют адресное пространство, открытые файлы и другие ресурсы. Во втором случае процессы совместно пользуются физической памятью, дисками, принтерами и другими ресурсами.

При запуске многопоточного процесса в системе с одним процессором потоки работают поочередно. Иллюзия параллельной работы нескольких различных последовательных процессов создается путем постоянного переключения системы между процессами. Многопоточность реализуется аналогичным образом путем переключения процессора между потоками, создавая впечатление параллельной работы потоков.

Независимость разных потоков в одном процессе ограничена, так как у всех потоков одно и то же адресное пространство, что означает совместное использование глобальных переменных. Поскольку любой поток имеет доступ к любому адресу ячейки памяти в адресном пространстве процесса, один поток может считывать, записывать или даже стирать информацию из стека другого потока. Защиты не существует, поскольку потоки созданы таким образом, чтобы работать совместно, не мешая друг другу. Концепция потоков состоит в возможности совместного использования набора ресурсов несколькими потоками для выполнения задачи в тесном взаимодействии.

В таблице 3.2. в первой колонке перечислены элементы, совместно используемые всеми потоками процесса, а во второй – элементы, индивидуальные для каждого потока.

 

Таблица 3.2.

Элементы потока и элементы процесса

 

Элементы процесса Элементы потока
Адресное пространство Глобальные переменные Открытые файлы Дочерние процессы Необработанные аварийные сигналы Сигналы и их обработчики Информация об использовании ресурсов Счетчик команд Регистры Стек Состояние

 

Как и любой процесс, поток может находиться в одном из нескольких состояний: рабочем, заблокированном, готовности или завершенном. Действующий поток взаимодействует с процессором. Заблокированный поток ожидает некоторого события, которое его разблокирует. Например, при выполнении системного запроса чтения с клавиатуры поток блокируется, пока не поступит сигнал с клавиатуры. Поток может быть разблокирован каким-либо внешним событием или другим потоком. Поток в состоянии готовности будет запущен, как только до него дойдет очередь (рис.3.2.).

В многопоточном режиме процессы, как правило, запускаются с одним потоком, который может создавать новые потоки, вызывая библиотечную процедуру, например, thread_create. Новый поток создается в адресном пространстве существующего потока. Иногда возникает иерархия потоков с отношениями типа родительский – дочерний поток, но чаще потоки считаются равнозначными. Выполнив задачу, поток может прекратить работу, вызвав соответствующую библиотечную процедуру, например, thread_exit. После этого поток исчезает и уже не рассматривается планировщиком. В некоторых потоковых системах один поток может ждать прекращения работы другого потока. Для этого вызывается процедура, например thread_wait, которая блокирует вызывающий процедуру поток, пока другой поток не прекратит работу. Процедура thread_yield позволяет потоку уступать свою очередь другому потоку, поскольку у потоков не существует прерывания по таймеру, позволяющему установить режим разделения времени. Существуют процедуры, позволяющие одному потоку подождать, пока другой поток завершит действие и оповестит о его окончании.

Потоки необходимы по следующим причинам. Основной из них является выполнение большинством приложений большого числа действий, часть которых могут время от времени блокироваться. Схему программы можно существенно упростить, если разбить приложение на несколько последовательных потоков, запущенных в квазипараллельном режиме. Другой причиной является легкость создания и уничтожения потоков, поскольку с потоком не связаны никакие ресурсы. В большинстве систем на создание потока уходит примерно в 100 раз меньше времени, чем на создание процесса.

Третьей причиной является производительность. Концепция потоков не дает увеличения производительности, если все они ограничены возможностями процессора. Но когда имеется одновременная потребность в выполнении большого объема вычислений и операций ввода-вывода, наличие потоков позволяет совмещать эти виды деятельности во времени, увеличивая общую скорость работы приложения. Следующая причина заключается в том, что концепция потоков необходима в системах с несколькими процессорами при их параллельной работе. Необходимость использования потоков могут продемонстрировать следующие примеры.

Динамическая электронная таблица представляет собой программу, позволяющую пользователю работать с матрицей, некоторые элементы которой заданы пользователем. Остальные элементы вычисляются на основе заданных элементов с использованием достаточно сложных формул. Если пользователь изменяет один элемент матрицы, это приводит к пересчету других элементов. При использовании концепции потоков один поток занят пересчетом элементов в фоновом режиме, другой поток позволяет пользователю вносить изменения, третий поток – периодически сохранять резервную копию файла на диске.

Другой пример. На web -сервер приходят запросы и клиенту отсылается содержимое запрашиваемых web -страниц. У большинства web -сайтов некоторые страницы существенно более посещаемы, чем другие. Для повышения эффективности работы сервер использует эту особенность, храня содержимое популярных страниц в кэш памяти, чтобы не надо было каждый раз обращаться за ними на диск.

На рисунке 3.5 представлен один из способов организации web-сервера. Один поток, называемый диспетчером, считывает приходящие по сети запросы. После этого он находит свободный (блокированный) рабочий поток и передает ему запрос, записывая указатель сообщения в специальное слово, связанное с каждым потоком. Затем диспетчер активизирует ждущий поток, переводя его из состояния блокировки в состояние готовности. После активации рабочий поток проверяет возможность удовлетворения запроса в кэше web -страниц, к которому имеют доступ все потоки. В случае отрицательного ответа поток начинает операцию чтения read, чтобы считать страницу с диска, и блокируется до завершения этой операции. Когда рабочий поток блокируется, для запуска выбирается следующий поток, им может оказаться диспетчер или другой готовый рабочий поток.


Эта модель позволяет создать сервер в виде набора последовательных потоков. Программа диспетчера состоит из бесконечного цикла, в который входит получение запроса и передача его рабочему потоку. Программа каждого рабочего потока состоит из бесконечного цикла, включающего получение запроса от диспетчера и проверку кэша на наличие запрашиваемой страницы. При наличии страницы в кэше она отсылается клиенту, и рабочий процесс блокируется в ожидании нового запроса. При отсутствии страницы в кэше она считывается с диска, отсылается клиенту, и рабочий процесс блокируется в ожидании нового запроса.

Третий пример. В приложениях, оперирующих большим количеством данных, обычно считывается блок данных, обрабатывается и снова записывается. Проблема состоит в том, что при наличии только системных запросов с блокировкой процесс будет блокироваться при чтении и записи данных. Необходимо избегать простоя процессора, особенно при таком большом объеме вычислений. Для этого процесс можно разбить на входной поток, обрабатывающий поток и выходной поток. Входной поток считывает данные и помещает их во входной буфер. Обрабатывающий поток считывает данные из входного буфера, обрабатывает их и помещает в выходной буфер, а выходной поток считывает их оттуда и записывает обратно на диск. В такой модели считывание данных, обработка и запись происходят одновременно, причем системные вызовы должны блокировать только вызывающий поток, а не весь процесс.

3.5. Системные вызовы и прерывания

 

В операционных системах поддерживается механизм, позволяющий пользовательским программам обращаться к услугам ядра операционной системы. Этот механизм реализует системные вызовы (system calls), которые представляют собой интерфейс между операционной системой и пользовательской программой. Пользовательская программа запрашивает сервис у операционной системы через системный вызов. Имеются библиотеки процедур, которые загружают машинные регистры определенными параметрами и осуществляют прерывание процессора, после чего управление передается обработчику данного вызова, входящему в ядро операционной системы. Цель библиотек – сделать системный вызов похожим на обычный вызов подпрограммы. При системном вызове задача переходит в привилегированный режим ядра (kernel mode), поэтому системные вызовы называются программными прерываниями.

Код ядра операционной системы исполняется в адресном пространстве и в контексте вызвавшей его задачи, благодаря чему ядро операционной системы имеет полный доступ к памяти пользовательской программы. При системном вызове достаточно передать адреса одной или нескольких областей памяти с параметрами вызова и адреса одной или нескольких областей памяти для результатов вызова. В большинстве операционных систем системный вызов осуществляется командой программного прерывания int, представляющей синхронное событие. Системные вызовы управляют процессами и обеспечивают обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции. С точки зрения программиста системный вызов выглядит как вызов подпрограммы или функции из системной библиотеки. Главными системными вызовами являются вызовы, связанные с созданием и окончанием процессов.

Например: процесс, называемый интерпретатором команд или оболочкой (shell), читает команды с терминала. Пользователь напечатал команду, содержащую запрос на компиляцию программы. Теперь оболочка должна создать новый процесс, который запустит компилятор. Когда процесс закончит компиляцию, он выполнит системный вызов, завершающий его собственную работу. Другие системные вызовы предназначаются для запросов о предоставлении дополнительной памяти (или освобождении не использующейся памяти), ожидании завершения процессов потомков и наложении одной программы на другую.

Предпосылками изменения состояния процесса являются события. Один из основных видов событий – прерывания (hardware interrupt), событие, генерируемое внешним (по отношению к процессору) устройством. Прерывания являются основной движущей силой любой операционной системы и возникают в процессе выполнения программы в зависимости от внешних событий или при появлении непредвиденных аварийных ситуаций. Сходство прерываний с процессами состоит в том, что в обоих случаях выполняется специальная подпрограмма, обрабатывающая конкретную ситуацию, после чего продолжается выполнение основной ветви программы. В зависимости от источника различают три класса прерываний: внешние, внутренние, программные.

1. Внешние (аппаратные) прерывания возникают в результате действий пользователя или в результате поступления сигналов от аппаратных устройств (сигналов завершения операций ввода-вывода, вырабатываемых контроллерами внешних устройств компьютера или сигналов от датчиков технических объектов, управляемых компьютером). Посредством аппаратных прерываний аппаратура информирует процессор о событие и требует немедленной реакции (пользователь нажал клавишу) или сообщает о завершении асинхронной операции ввода-вывода (например, закончено чтение данных с диска в основную память).

Основной вид аппаратных прерываний – прерывания таймера, которые генерируются периодически через фиксированный промежуток времени и используются операционной системой при планировании процессов. Каждый тип аппаратных прерываний имеет собственный номер, определяющий источник прерывания. Аппаратное прерывание – это асинхронное событие по отношению к потоку инструкций прерываемой программы, которое возникает вне зависимости от того, какой код исполняется процессором в данный момент. Аппаратура процессора работает так, что асинхронные прерывания возникают между выполнением двух соседних инструкций, при этом система после обработки прерывания продолжает выполнение процесса, начиная со следующей инструкции.

2. Внутреннее прерывание (исключение exeption) происходят синхронно выполнению программы при появлении аварийной ситуации в ходе выполнения некоторой инструкции. Например, ошибки защиты памяти, обращение по несуществующему адресу, попытка выполнить привилегированную инструкцию в пользовательском режиме.

3. Программные прерывания – это прерывания, которые возникают при выполнении особой команды процессора (например: INT в процессорах Intel Pentium; trap в процессорах Motorola; syscall в процессорах MIPS; Ticc в процессорах SPARC), выполнение которой имитирует прерывание, то есть переход на новую последовательность инструкций. При выполнении команды программного прерывания процессор отрабатывает туже последовательность действий, что и при возникновении внешнего или внутреннего прерывания. Практически все современные процессоры имеют в системе команд инструкции программных прерываний, которые предоставляют возможность смены пользовательского режима на привилегированный. Программные прерывания используются для выполнения системных вызовов и имеют приоритет, с помощью которого они ранжируются по степени важности и срочности. Все источники прерываний делятся на классы, каждому из которых присваивается свой приоритет.

Прерывания обрабатываются модулями операционной системы, так как действия, выполняемые по прерыванию, относятся к управлению разделяемыми ресурсами вычислительной системы: принтером, диском, таймером, процессором и пр. Процедуры, вызываемые по прерываниям, называются обработчиками прерываний или процедурами обслуживания прерываний (Interrupt Service Routine, ISR). Аппаратные прерывания обрабатываются драйверами соответствующих внешних устройств, программные – процедурами операционной системы, обслуживающими системные вызовы. Работу отдельных обработчиков прерываний координирует диспетчер прерываний – программный модуль операционной системы, который занимается диспетчеризацией обработчиков прерываний и при возникновении прерываний вызывается первым.

Механизм прерываний поддерживается аппаратными средствами компьютера и программными средствами операционной системы. Аппаратная поддержка прерываний имеет свои особенности, зависящие от типа процессора и других аппаратных компонентов (контроллера внешнего устройства, шины подключения внешних устройств, контроллера прерываний - посредника между сигналами шины и сигналами процессора), передающих сигнал запроса прерывания от внешнего устройства к процессору.

Особенности аппаратной реализации прерываний оказывают влияние на средства программной поддержки прерываний в операционной системе. Существует два основных способа, с помощью которых шины выполняют прерывания: векторный (vectored) и опрашиваемый (polled). В обоих случаях процессору предоставляется информация об уровне приоритета прерывания на шине подключения внешних устройств. В случае векторных прерываний в процессор передается информация о начальном адресе программы обработки возникновения прерываний – обработчика прерываний. Устройствам, использующим векторные прерывания, назначается вектор прерываний – электрический сигнал, выставляемый на соответствующие шины процессора и несущий в себе информацию об определенном, закрепленном на данном устройстве номере, который идентифицирует обработчик прерываний.

При использовании опрашиваемых прерываний процессор получает от запросившего прерывание устройства только информацию об уровне приоритета прерывания. С каждым уровнем прерываний может быть связано несколько устройств и соответственно несколько программ – обработчиков прерываний. При возникновении прерывания процессор должен определить, какое устройство из тех, которые связаны с данным уровнем прерываний, действительно запросило прерывание. Это достигается вызовом всех обработчиков прерываний для данного уровня приоритета, пока один из обработчиков не подтвердит, что прерывание пришло от обслуживаемого им устройства. Обобщенная последовательность действий аппаратных и программных средств по обработке прерываний следующая.

1.При возникновении сигнала (для аппаратных прерываний) или условия (для внутренних прерываний) прерывания происходит первичное аппаратное распознавание типа прерывания. Если прерывания данного типа в настоящий момент запрещены (приоритетной схемой или механизмом маскирования), то процессор продолжает поддерживать естественный ход выполнения команд. В противном случае в зависимости от поступившей в процессор информации (уровень прерывания, вектор прерывания или тип условия внутреннего прерывания) происходит автоматический вызов процедуры обработки прерывания, адрес которой находится в специальной таблице операционной системы, размещаемой либо в регистрах процессора, либо в определенном месте оперативной памяти.

2.Автоматически сохраняется некоторая часть контекста (значения счетчика команд, слова состояния машины, регистры общего назначения, которые требуются программе обработки прерывания) прерванного потока процесса, которая позволит ядру возобновить его исполнение после обработки прерывания. Возможно сохранение и полного контекста, если операционная система обслуживает данное прерывание со сменой процесса.

3.Одновременно с загрузкой адреса процедуры обработки прерываний в счетчик команд может автоматически выполняться загрузка нового значения слова состояния машины, которое определяет режимы работы процессора при обработке прерывания, в том числе работу в привилегированном режиме. В некоторых моделях процессоров переход в привилегированный режим за счет смены состояния машины при обработке прерывания является единственным способом смены режима. Прерывания практически во всех мультипрограммных операционных системах обрабатываются в привилегированном режиме модулями ядра, так как при этом обычно нужно выполнить ряд критических операций (управлять внешними устройствами, перепланировать потоки и т.п.), от которых зависит жизнеспособность системы.

4.Временно запрещаются прерывания данного типа, чтобы не образовалась очередь вложенных друг в друга потоков одной и той же процедуры. Детали выполнения этой операции зависят от особенностей аппаратной платформы, например, может использоваться механизм маскирования прерываний. Многие процессоры автоматически устанавливают признак запрета прерываний в начале цикла обработки прерывания, в противном случае это делает программа обработки прерываний.

5.После того как прерывание обработано ядром операционной системы, прерванный контекст восстанавливается, и работа потока возобновляется с прерванного места. Часть контекста восстанавливается аппаратно по команде возврата из прерываний (например, адрес следующей команды и слово состояния машины), а часть – программным способом, с помощью явных команд извлечения данных из стека. При возврате из прерывания блокировка повторных прерываний данного типа снимается.

Иллюзия нескольких последовательных процессов на машине с одним процессором и несколькими устройствами ввода-вывода поддерживается следующим образом. С каждым устройством связана программа обработки прерываний. Когда процессор принимает сигнал прерывания от этого устройства с учетом его приоритета, аппаратное обеспечение помещает адрес соответствующей программы в счетчик команд. Для хранения таблицы адресов всех программ обработки прерываний, называемой таблицей векторов прерываний выделяется специальная область основной памяти.

С классом устройств ввода-вывода связана область памяти – вектор прерываний, содержащая адрес процедуры обработки прерываний. Например, в момент прерывания диска работал пользовательский процесс. Содержимое счетчика команд процесса, слово состояния программы и регистры записываются в текущий стек аппаратными средствами прерывания. Затем происходит переход по адресу, указанному в векторе прерывания диска. Вся остальная обработка прерывания производится программным обеспечением, например процедурой обработки прерываний.

 

Таблица 3.3.

Схема обработки прерывания

 

Обработка прерывания нижним уровнем операционной системы
1. Аппаратное обеспечение сохраняет в стеке счетчик команд и т. п. 2. Аппаратное обеспечение загружает новый счетчик команд из вектора прерываний. 3. Процедура на ассемблере сохраняет регистры. 4. Процедура на ассемблере устанавливает новый стек. 5. Запускается программа обработки прерываний на диске С:, которая считывает и буферизирует входные данные. 6. Планировщик выбирает следующий процесс. 7. Программа на диске С: передает управление процедуре на ассемблере. 8.Процедура на ассемблере запускает новый процесс.

 

Все прерывания начинаются с сохранения регистров в блоке управления PCB текущим процессом в таблице процессов. Затем информация, помещенная в стек прерыванием, удаляется, и указатель стека переставляется на временный стек, используемый программой обработки процесса. Данные действия выполняются небольшой программой на ассемблере, обычно одинаковой для всех прерываний, поскольку процедура сохранения регистров не зависит от причины возникновения прерывания. По завершении своей работы эта программа вызывает процедуру на языке С, которая выполняет все остальные действия, связанные с конкретным прерыванием. Когда процедура завершает свою работу (в результате чего, возможно, некоторые процессы переходят в состояние готовность) вызывается планировщик для выбора следующего процесса. После этого управление возвращается к программе на ассемблере, загружающей регистры и карту памяти для текущего процесса и запускающей его (табл.3.3.).

Современные операционные системы предусматривают разделение времени между выполняющимися процессами (многозадачность) и разделение полномочий, препятствующее исполняемым программам обращаться к данным других программ и оборудованию. Ядро операционной системы исполняется в привилегированном режиме работы процессора. Для выполнения межпроцессной операции или операции, требующей доступа к оборудованию, программа обращается к ядру, которое, в зависимости от полномочий вызывающего процесса, исполняет либо отказывает в исполнении такого вызова.

Время от времени необходимо передавать информацию работающему процессу так, чтобы он не простаивал в ожидании получения этой информации. Например, процесс, связанный с другим процессом на удаленном компьютере, делает это, посылая сообщения по сети. Чтобы предотвратить возможность потери сообщения или ответа на него, отправитель может потребовать от собственной операционной системы уведомления, если по истечении определенного интервала ожидания не будет получено подтверждение о получении сообщения. В этом случае он сможет повторить отправку сообщения. После установки таймера программа продолжит выполнение другой работы.

Если по истечении определенного количества секунд ответа нет, операционная система посылает процессу сигнал тревоги, который вызывает временную остановку процесса, сохраняет его регистры в стеке и запускает специальную процедуру обработки сигнала. После завершения обработки сигнала работающий процесс запускается заново в том состоянии, в котором он находился до сигнала. Сигналы являются программными аналогами аппаратных прерываний. Многие аппаратные прерывания (например, вызванные выполнением недопустимой команды или использованием неправильного адреса) также преобразуются в сигналы для процесса, в котором произошла ошибка.

 




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 1320; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.038 сек.