Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5.14.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
8 Мб
Скачать
☆

Многопоточность

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

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

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

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

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

Рис; 4-7. Многопоточный компилятор.

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

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

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

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

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

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

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

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

Суммируя сказанное, приведем термины, относящиеся к реализации процессов ОС:

• Многозадачность. Совместное использование процессора потоками, ожидающими выполнения, и создание иллюзии одновременного вы­полнения всех потоков.

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

• Многопоточность. Поддержка нескольких потоков внутри одного процесса.

Начиная с Windows NT версии 3.51, Service Pack 3 в систему была добавлена новая сущность — во­локна (fibers). Волокном называется легкий поток, планировку которого осуществляет прило­жение. С точки зрения перевода слово "волокно" надо рассматривать как некий канал (сравни: оп­товолокно), который можно использовать для направления потока. В английском языке появление термина fiber более понятно, так как thread дословно переводится как "нить". Нить, как известно, состоит из волокон.

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

С точки зрения системы волокна подразумевают индивидуальность потоков, их породивших. Например, если волокно осуществляет доступ к локальной памяти потока, то это будет локальная память именно того патока, который породил волокно. Если волокно вызывает функцию ExitThread, то закроется по­ток, породивший это волокно.

С волокнами связан гораздо меньший объем информации о состоянии, чем с потоками. У воло­кон поддерживается только их стек, подмножество регистров и данные, переданные при созда­нии волокна.

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

  1. Объект-поток.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]