Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 11
Текст из файла (страница 11)
Более того, программист,создающий многопоточное приложение, может заранее продумать работу множества потоков процесса таким образом, чтобы они могли взаимодействовать наиболее выгодным способом, а не конкурировать за ресурсы тогда, когда этого можноизбежать.Для того чтобы можно было эффективно организовать параллельное выполнениерассмотренных сущностей (процессов и потоков), в архитектуру современных процессоров включены средства для работы со специальной информационной структурой, описывающей ту или иную сущность. Для этого уже на уровне архитектурымикропроцессора используется понятие задача (task). Оно как бы объединяет в себеи обычный процесс, и поток выполнения (тред). Это понятие и поддерживаемаядля него на уровне аппаратуры информационная структура позволяют в дальнейшем при разработке операционной системы строить соответствующие дескрипторы как для задач, так и для процессов.
И отличаться эти дескрипторы будут преждевсего тем, что дескриптор задачи может хранить только контекст приостановленного вычислительного процесса, тогда как дескриптор процесса должен содержатьполя, описывающие тем или иным способом ресурсы, выделенные этому процессу. Для хранения контекста задачи в микропроцессорах с архитектурой i32 имеется специальный сегмент состояния задачи (Task State Segment, TSS). А для отображения информации о процессе используется уже иная информационная структура,однако она включает в себя TSS. Другими словами, сегмент состояния задачи, подробно рассматриваемый в разделе «Адресация в 32-разрядных микропроцессорах i80x86 при работе в защищенном режиме» главы 4, используется как основадля дескриптора процесса.
Таким образом, дескриптор процесса больше по размеру, чем TSS, и включает в себя такие традиционные поля, как идентификатор процесса, его имя, тип, приоритет и проч.Каждый поток (в случае использования так называемой «плоской» модели памяти — см. раздел «Сегментная, страничная и сегментно-страничная организацияпамяти» в главе 3) может быть оформлен в виде самостоятельного сегмента, чтоприводит к тому, что простая (не многопоточная) программа будет иметь всегоодин сегмент кода в виртуальном адресном пространстве.Понятия вычислительного процесса и ресурса41Теперь, если вернуться к уже упомянутому файлу CONFIG.SYS, в котором для операционной системы OS/2 указываются наиболее важные параметры, определяющиеее работу, стоит заметить, что в этом файле строка THREADS=1024 указывает на количество не процессов, а именно задач.
И под задачей в данном случае понимаетсякак процесс, так и поток этого процесса.К большому сожалению, практически невозможно использовать термины «задача» и «процесс» с однозначным толкованием, чтобы под задачей обязательно понимать поток, в то время как термин «процесс» означал бы множество потоков.Значение этих терминов по-прежнему сильно зависит от контекста. И это характерно практически для каждой книги, в том числе и для учебной литературы. Грешен этим и автор. Остается надеяться, что со временем все же ситуация изменится, и толкование этих слов будет более четким и строгим.В завершение можно привести несколько советов по использованию потоков выполнения при создании приложений, заимствованных из [28].а В случае однопроцессорной системы множество параллельных потоков частоне ускоряет работу приложения, поскольку в каждый отдельно взятый промежуток времени возможно выполнение только одного потока.
Кроме того, чембольше у вас потоков, тем больше нагрузки на систему, относящиеся к переключению между ними. Мультизадачность из более двух постоянно работающих потоков в вашем проекте не сделает программу быстрее, если каждый изпотоков не будет требовать частого ввода-вывода.Q Вначале нужно понять, для чего необходим поток. Поток, осуществляющийобработку, может помешать системе быстро реагировать на запросы ввода-вывода. Потоки позволяют программе отзываться на просьбы пользователя и устройств, но при этом (в том числе) сильно загружают процессор.
Потоки позволяют компьютеру одновременно обслуживать множество устройств, и созданныйвами поток, отвечающий за обработку специфического устройства, как минимум может потребовать столько времени, сколько системе необходимо для обработки запросов от всех устройств.• Потокам можно назначать разные приоритеты для того, чтобы наименее значимые процессы выполнялись в фоновом режиме. Это путь честного разделенияресурсов процессора.
Однако необходимо осознать тот факт, что процессор одинна всех, а потоков много. Если в вашей программе главная процедура передаетнечто для обработки в низкоприоритетный поток, то сама программа становится просто неуправляемой.• Потоки хорошо работают, когда они независимы.
Но они начинают работатьнепродуктивно, когда вынуждены часто синхронизироваться для доступа к общим ресурсам. Взаимные блокировки и критические секции отнюдь не добавляют скорости работы системы, хотя без использования этих механизмов взаимодействующие вычисления организовывать нельзя.Q Помните, что память виртуальна. Механизм виртуальной памяти (см. раздел «Память и отображения, виртуальное адресное пространство» в главе 3) следит за тем, какая часть виртуального адресного пространства должна находиться в оперативной памяти, а какая должна быть сброшена в файл подкачки.42Глава 1. Основные понятияПотоки усложняют ситуацию, если они обращаются в одно и то же время к разным адресам виртуального адресного пространства приложения. Это значительно увеличивает нагрузку на систему, особенно при небольшом объеме кэшпамяти. Помните, что реально память не всегда «свободна», как это пишутв информационных окошках «О системе».
Всегда отождествляйте доступ к памяти с доступом к файлу на диске и создавайте приложение с учетом вышесказанного.•Всякий раз, когда любой из ваших потоков пытается воспользоваться общимресурсом вычислительного процесса, которому он принадлежит, вы обязаныкаким-то образом легализовать и защитить вашу деятельность. Хорошим средством для этого являются критические секции, семафоры и очереди сообщений (см. главу 7). Если вы протестировали ваше приложение и не обнаружилиошибок синхронизации, то это еще не значит, что их там нет.
Пользователь может создавать самые непредсказуемые ситуации. Это очень ответственный момент в разработке многопоточных приложений.•Не возлагайте на поток несколько функций. Сложные функциональные отношения затрудняют понимание общей структуры приложения, его алгоритм. Чемпроще и однозначнее каждая из рассматриваемых ситуаций, тем больше вероятность, что ошибок удастся избежать.Основные виды ресурсови возможности их разделенияРассмотрим кратко основные виды ресурсов вычислительной системы и способыих разделения (см. рис.
1.5). Прежде всего, одним из важнейших ресурсов является сам процессор 1 , точнее — процессорное время. Процессорное время делитсяпопеременно (параллельно). Имеется множество методов разделения этого ресурса (см. раздел «Планирование и диспетчеризация процессов и задач» в главе 2).Вторым видом ресурсов вычислительной системы можно считать память. Оперативная память может делиться и одновременно (то есть в памяти одновременноможет располагаться несколько задач или, по крайней мере, текущих фрагментов,участвующих в вычислениях), и попеременно (в разные моменты оперативная память может предоставляться для разных вычислительных процессов).
Память —очень интересный вид ресурса. Дело в том, что в каждый конкретный момент времени процессор при выполнении вычислений обращается к очень ограниченномучислу ячеек оперативной памяти. С этой точки зрения желательно память выделять для возможно большего числа параллельно исполняемых задач. С другой стороны, как правило, чем больше оперативной памяти может быть выделено дляконкретного текущего вычислительного процесса, тем лучше будут условия еговыполнения.
Поэтому проблема эффективного разделения оперативной памятимежду параллельно выполняемыми вычислительными процессами является одРазговор о процессоре как об одном из ресурсов более характерен для мультипроцессорных систем.В случае однопроцессорных систем чаще говорят о процессорном времени.Основные виды ресурсов и возможности их разделения43ной из самых актуальных.
Достаточно подробно вопросы распределения памятимежду параллельно выполняющимися процессами рассмотрены в главе 3.Внешняя память тоже является ресурсом, который часто необходим для выполнения вычислений. Когда говорят о внешней памяти (например, памяти на магнитных дисках), то собственно память и доступ1 к ней считаются разными видамиресурса. Каждый из этих ресурсов может предоставляться независимо от другого.Но для полноценной работы с внешней памятью необходимо иметь оба этих ресурса. Собственно внешняя память может разделяться и одновременно, а вот доступ к ней всегда разделяется попеременно.Если говорить о внешних устройствах, то они, как правило, могут разделяться параллельно, если используются механизмы прямого доступа. Если же устройствоработает с последовательным доступом, то оно не может считаться разделяемымресурсом. Простыми и наглядными примерами внешних устройств, которые немогут быть разделяемыми, являются принтер и накопитель на магнитной ленте.Действительно, если допустить, что принтер можно разделять между двумя процессами, которые смогут его использовать (управлять его работой) попеременно,то результаты печати, скорее всего, окажутся негодными — фрагменты выведенного текста могут перемешаться таким образом, что будет не понятно, что есть что.Аналогично и для накопителя на магнитной ленте.
Если один процесс начнет чтото читать или писать, а второй при этом запросит перемотку ленты на ее начало, тооба вычислительных процесса не смогут выполнить свои вычисления. Здесь следует заметить, что при работе с устройствами печати мы, тем не менее, явно наблюдаем возможность печатать из разных программ, выполняющихся параллельно.Однако необходимо знать, что это реализуется за счет того, что каждый вычислительный процесс получает свой виртуальный принтер, который он ни с кем не разделяет.
А операционная система, получив задания на печать от выполняющихсязадач, сама упорядочивает эти задания и передает очередное задание на принтертолько после полного завершения предыдущего задания.Очень важным видом ресурсов являются программные модули. Прежде всего, мыбудем рассматривать системные программные модули, поскольку именно они обыч.но считаются программными ресурсами и поэтому в принципе могут распределяться между выполняющимися процессами.Как известно, программные модули могут быть однократно используемыми и многократно (или повторно) используемыми. Однократно используемыми называюттакие программные модули, которые могут быть правильно выполнены только одинРаз, то есть в процессе своего выполнения они могут испортить себя: либо повреждается часть кода, либо исходные данные, от которых зависит ход вычислений.Очевидно, что однократно используемые программные модули являются неделимым ресурсом. Более того, их, как правило, вообще не распределяют как ресурссистемы.