Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_Realtime_2.doc
Скачиваний:
221
Добавлен:
14.02.2015
Размер:
611.33 Кб
Скачать
        1. Многопоточность

Использование двух процессов для достижения параллельности не всегда эффективно. В некоторых системах UNIX,например, когда один процесс создает другой, система должна скопировать все содержимое адресного пространства первого процесса в адресное пространство второго. Для большого адресного пространства эта операция занимает много времени. Более того, два процесса должны установить канал обмена данными друг с другом. Не во всех ОС это осуществляется быстро и легко. Windows NTрешает проблему, создавая удобные механизмы совместного использования памяти. Это память "копирование при модификации", позволяющая избежать копирования всего адресного пространства из одного процесса в другой, а также оптимизированное для локального использования средство передачи сообщений.

Даже при наличии этих усовершенствований бывают ситуации, когда более выгоден другой подход к достижению параллельности, а именно, многопоточный процесс (multithreaded process).Как говорилось ранее, терминупоток (thread)отвечает перемещение процессора по командам программы; каждый поток отображает отдельный счетчик команд. У многопоточного процесса имеется два или более потоков (и счетчиков команд), которые совместно используют одно и то же адресное пространство, описатели объектов и другие ресурсы.

В много потоковой программе в каждый момент времени могут выполняться «параллельно» несколько элементов кода, при этом каждый элемент кода выполняется одним потокм управления. Многопотоковое программирование можно использовать для разработки приложений, которые могут выполняться параллельно. Эти приложения можно запускать на любых многопроцессорных системах, эффективно используя аппаратные ресурсы. В частности, если многопотоковое приложение за пускается на системе с Мпроцессорами, то все его потоки могут выполняться одновременно, каждый отдельным процессором. Следовательно, производительность такого приложения можно увеличить вN раз, гдеN – максимальное число свободных в данных момент процессоров (NM).

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

Каждый процесс NTсоздается с одним потоком. При необходимости программа может создать внутри процесса дополнительные потоки. Они часто используются для выполнения в программеасинхронных операций (asynchronous operations),т. е. операций, которые могут иметь место в любое время, безотносительно к основному течению программы. К этой категории часто относятся операции ввода-вывода. Например, можно использовать поток для периодического сохранения редактируемого документа или для опроса устройства пользовательского ввода, например мыши или клавиатуры. Используя один поток для выполнения основной программы и создав второй для опроса устройства ввода, система может по отдельности выполнять обе операции на одном процессоре, так что будет иметь место многозадачность. На многопроцессорном компьютере эти два потока могут выполняться одновременно, притом не требуя расходов на создание второго процесса и инициализацию его адресного пространства.

Чтобы достичь параллелизма с использованием потоков, программа создает два или несколько потоков в одном процессе. Многопоточный компилятор изображен на рис. 2-9.

Рис. 2-9. Многопоточный компилятор.

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

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

Использование многопоточного процесса — идеальное решение для серверного приложения (например, защищенных подсистем Windows NT),которое принимает запросы от клиентов и выполняет по каждому запросу один и тот же код. Например, файл-сервер выполняет операции с файлами; он открывает файлы, читает из них, пишет в них и закрывает их. Хотя каждый запрос может требовать от сервера работы со своим файлом, программа сервера загружается в память только один раз. Каждый приходящий запрос принимается и обрабатывается отдельным потоком сервера, который выполняет необходимую функцию. Все запросы клиентов обслуживаются параллельно. Иллюстрацией этого служит рис. 2-10.

Рис. 2-10. Многопоточный сервер.

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

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

Такого не происходит, если приложения используют для достижения параллельности два процесса и взаимодействуют явным образом путем посылки сообщений или через каналы. Один процесс не может случайно или намеренно повредить адресное пространство другого. Именно по этой причине защищенные подсистемы Windows NTреализованы как отдельные серверные процессы (и именно поэтому они называются "защищенными" подсистемами).

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

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

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