40
Глава 1. Основные понятия
виртуальному адресу, один поток может использовать стек другого потока. Между
потоками нет полной защиты, потому что, во-первых, это невозможно, а во-вто-
рых, не нужно. Все потоки одного процесса всегда решают общую задачу одного
пользователя, и механизм потоков используется здесь для более быстрого реше-
ния задачи путем ее распараллеливания. При этом программисту очень важно по-
лучить в свое распоряжение удобные средства организации взаимодействия час-
тей одной программы. Повторим, что кроме разделения адресного пространства,
все потоки разделяют также набор открытых файлов, устройства, выделенные про-
цессу, имеют одни и те же наборы сигналов, семафоры и т. п. А что у потоков явля-
ется их собственным? Собственными являются программный счетчик, стек, рабо-
чие регистры процессора, потоки-потомки, состояние.
Вследствие того, что потоки, относящиеся к одному процессу, выполняются в од-
ном и том же виртуальном адресном пространстве, между ними легко организо-
вать тесное взаимодействие, в отличие от процессов, для которых нужны специ-
альные механизмы обмена сообщениями и данными. Более того, программист,
создающий многопоточное приложение, может заранее продумать работу множе-
ства потоков процесса таким образом, чтобы они могли взаимодействовать наибо-
лее выгодным способом, а не конкурировать за ресурсы тогда, когда этого можно
избежать.
Для того чтобы можно было эффективно организовать параллельное выполнение
рассмотренных сущностей (процессов и потоков), в архитектуру современных про-
цессоров включены средства для работы со специальной информационной струк-
турой, описывающей ту или иную сущность. Для этого уже на уровне архитектуры
микропроцессора используется понятие задача (task). Оно как бы объединяет в себе
и обычный процесс, и поток выполнения (тред). Это понятие и поддерживаемая
для него на уровне аппаратуры информационная структура позволяют в дальней-
шем при разработке операционной системы строить соответствующие дескрипто-
ры как для задач, так и для процессов. И отличаться эти дескрипторы будут прежде
всего тем, что дескриптор задачи может хранить только контекст приостановлен-
ного вычислительного процесса, тогда как дескриптор процесса должен содержать
поля, описывающие тем или иным способом ресурсы, выделенные этому процес-
су. Для хранения контекста задачи в микропроцессорах с архитектурой i32 имеет-
ся специальный сегмент состояния задачи (Task State Segment, TSS). А для отобра-
жения информации о процессе используется уже иная информационная структура,
однако она включает в себя TSS. Другими словами, сегмент состояния задачи, по-
дробно рассматриваемый в разделе «Адресация в 32-разрядных микропроцессо-
рах i80x86 при работе в защищенном режиме» главы 4, используется как основа
для дескриптора процесса. Таким образом, дескриптор процесса больше по разме-
ру, чем TSS, и включает в себя такие традиционные поля, как идентификатор про-
цесса, его имя, тип, приоритет и проч.
Каждый поток (в случае использования так называемой «плоской» модели памя-
ти — см. раздел «Сегментная, страничная и сегментно-страничная организация
памяти» в главе 3) может быть оформлен в виде самостоятельного сегмента, что
приводит к тому, что простая (не многопоточная) программа будет иметь всего
один сегмент кода в виртуальном адресном пространстве.