ОС многопроцессорной вычислительной системы должна, прежде всего, выполнять функции обычной операционной системы: обрабатывать вызовы; управлять памятью; поддерживать файловую систему; управлять устройствами ввода-вывода. Кроме того, многопроцессорная операционная система должны выполнять ряд специфических функций. Выделим из них четыре следующие функции, рассматриваемые в данном курсе:
Отметим, что три первые функции находят непосредственное отражение в языках программирования высокого уровня. Четвертая функция в значительной мере определяет производительность многопроцессорной системы.
Кроме очевидных требований надежности и производительности к ОС многопроцессорной ЭВМ предъявляются следующие требования.
Прозрачность операционной системы – пользователь не должен знать, где расположены те или иные ресурсы; пользователи должны разделять ресурсы автоматически (средствами ОС).
Масштабируемость операционной системы - выход из строя одного из процессоров системы или увеличение количества процессоров в ней не должны приводить к отказу ОС. Для обеспечения масштабируемости системы ни один из процессоров не должен иметь полной информации о состоянии системы, процессоры должны принимать решения на основе только локальной информации, не должны использоваться глобальные часы.
Центральным понятием операционной системы для многопроцессорных вычислительных систем является понятие процесса.
Процессы.
Единицы работы, между которыми операционная система разделяет процессоры и другие ресурсы вычислительной системы, называется процессом. Любая работа вычислительной системы состоит в выполнении некоторой программы. Поэтому можно сказать, что процесс – это выполнение вычислительной системой некоторой системной или прикладной программы или их фрагмента.
Каждому процессу в операционной системе соответствует контекст процесса. Этот контекст включает в себя:
Важно, что из-за большого объема данных контекста процесса, переключение процессора системы с выполнения одного процесса на выполнение другого процесса (смена контекста процесса) является относительно дорогостоящей операцией.
Для уменьшения времени смены контекста процесса в современных ОС (например, в ОС UNIX) наряду с понятием процесса широко используется понятие легковесного процесса “light-weight process” или понятие потока, нити "thread". Легковесный процесс можно определить как подпроцесс некоторого процесса, выполняемый в контексте этого процесса - см. рис. 1. Контекст процесса содержит общую для всех его легковесных процессов информацию - виртуальная память, дескрипторы открытых файлов и т.д. Остальная информация из контекста процесса переходит в контексты его легковесных процессов.
Рис. 1.  К определению легковесного процесса.
Простейшим процессом является процесс, состоящий из одного легковесного процесса.
Принципиальным является то обстоятельство, что нити одного процесса выполняются в общей виртуальной памяти, т.е. имеют равные права доступа к любым частям виртуальной памяти процесса. Операционной системой основной ресурс вычислительной системы – процессорное время – выделяется не процессу, а легковесному процессу.
На основе сказанного, процесс можно определить как некоторый контекст, включающий виртуальную память и другие системные ресурсы, в котором выполняется, по крайней мере, один легковесный процесс, обладающий своим собственным (более простым) контекстом. ОС «знает» о существовании двух указанных уровней контекстов и способна сравнительно быстро изменять контекст легковесного процесса, не изменяя общего контекста процесса. Заметим, что для синхронизации легковесных процессов, работающих в общем контексте процесса, можно использовать более дешевые средства, чем для синхронизации процессов.
Понятие легковесного процесса направлено на организацию вычислений в многопроцессорной вычислительной системе в случае, когда приложение, выполняемое в рамках одного процесса, обладает внутренним параллелизмом. Разумеется, параллельное выполнение приложения можно организовать и на пользовательском уровне – путем создания для одного приложения нескольких процессов для каждой из параллельных работ. Однако при этом не учитывается тот факт, что эти процессы решают общую задачу, а, значит, могут иметь много общего – общие данные, программные коды, права доступа к ресурсам системы и пр. Кроме того, как отмечалось выше, каждый процесс требует значительных системных ресурсов, которые при такой организации параллельных вычислений неоправданно дублируются.
Средства создания и завершения процессов.
Рассмотрим основные средства создания и завершения процессов на примере операционной системы UNIX.
Системный вызов fork. Для создания нового процесса используется системный вызов fork. Все процессы ОС UNIX, кроме начального, запускаемого при «раскрутке» системы, образуются при помощи системного вызова fork. После создания процесса-потомка процесс-предок и процесс-потомок начинают «жить» своей собственной жизнью, произвольным образом изменяя свой контекст. Например, и процесс-предок, и процесс-потомок могут выполнить системный вызов exec (см. ниже), приводящий к полному изменению контекста процесса.
Системный вызов wait. Системный вызов wait используется для синхронизации процесса-предка и процессов-потомков. Выполнение этого системного вызова приводит к приостановке выполнения процесса-предка до тех пор, пока не завершится выполнение какого-либо из процессов, являющегося его потомком.
Сигналы. Сигнал - это способ информирования процесса со стороны ядра операционной системы о происшествии некоторого события (event) в системе, например:
Все возможные в системе сигналы имеют уникальные номера и идентификаторы.
С помощью системного вызова signal пользовательская программа может осуществить «перехват» указанного в вызове сигнала – вызвать соответствующую функцию, которая выполнит обработку этого сигнала. Например, вызов signal(SIGFPE, error) вызовет выполнение функции error при переполнении или делении на ноль во время выполнения операции с плавающей запятой.
ОС Unix предоставляет возможность пользовательским процессам направлять сигналы другим процессам. Например, системный вызов kill(PID, signum) посылает процессу с идентификатором PID сигнал с номером signum.
Системный вызов exec. При выполнении системного вызова exec(filename,…), где filename – имя выполняемого файла, операционная система производит реорганизацию виртуальной памяти вызывающего процесса, уничтожая в ней сегменты старого программного кода и образуя новые сегменты, в которые загружаются программный код из файла filename.