Понятие нити и связь Хе с процессом

МНОГОПОТОЧНОЕ ФУНКЦИОНИРОВАНИЕ ОС

Упражнения

1. Разработать программы для Windows, выполняющие те же задачи, что и рассмотренные выше программы в листингах 7.3.1а, 7.3.1b, 7.3.1c для Unix. Аналогично рассмотренным примерам, при выполнении упражнения необходимо создать три исполняемых файла Procest.exe, Child1.exe и Child2.exe. Программа Child1.c должна описывать создание (из исполняемого файла child2.exe) процесса, который будет процессоЬ-Тнуком для исходного процесса.

 

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

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

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

Обычно нить своей работой реализует действия одной из процедур программы. Теоретически любой нити процесса доступны все части программы процесса, в частности, все его процедуры, но реально работа организуется так, чтобы нити отвечала отдельная процедура. Учитывая, что процедуре для нормальной работы необходимы локальные переменные, становится понятным закрепление области этих переменных за нитью. Объект хранения локальных переменных (вместе со служебной информацией при вызове подпрограмм) называют стеком. (Более точное понятие стека программы формируется только с помощью архитектуры процессора.) Этот стек в действительности является частью оперативной памяти, он используется не только программно, но и аппаратно, в частности, при реализации прерываний. Стек процедуры является неотъемлемой частью ресурсов, принадлежащих процедуре. (Более точным термином является кадр стека для процедуры или фрейм стека.)

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

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

Для задания многопоточного приложения как результата разработки в системах программирования Borland Inc. (Inprise Inc.) при использовании командного вызова компилятора следует обязательно использовать опцию -tWM, так что вызов компилятора для построения исполняемой программы из файла prog.c будет записываться в виде

BCC32 -tWM prog.c

Для компиляции исходного файла в системе MS Visual C++ с помощью компилятора CL.EXE этого пакета следует использовать опцию /MT, так что аналогичный вызов компилятора будет иметь вид

CL /MT prog.c

При использовании интегрированных систем разработки нужно учитывать необходимость установки флажка многопоточного приложения (флажка Multithread) в соответствующем диалоговом окне окна цели (target) разработки. В частности, в среде разработки Borland C++ этот флажок необходимо установить в окне TargetExpert с заголовком New Target, возникающим после выбора подпункта New в пункте Project меню, выпадающего из пункта File главного меню.

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

gcc prog.c /usr/lib/libpthread

а вторая задает эту же библиотеку неявно и записывается в виде

gcc prog.c -lpthread

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