Синхронизация процессов.
Процессы должны синхронизироваться при доступе к совместно используемым ресурсам.
Использование явных примитивов для синхронизации порождает серьезные проблемы при написании, отладке и сопровождении программ, поэтому в традиционных UNIX-системах понятие процесса жестко связывается с понятием отдельной и недоступной для других процессов виртуальной памятью, когдакаждый процесс защищен ядром операционной системы от неконтролируемого вмешательства других процессов. Но связывание процесса с виртуальной памятью, в свою очередь, порождает две основные проблемы:
1. первая проблема связана с системами реального времени, предназначенными для одновременного управления несколькими внешними объектами и представляющимися в виде совокупности параллельно (квазипараллельно) выполняемых потоков команд (т. е. взаимодействующих процессов). Если с каждым процессом связана отдельная виртуальная память, то переключение с выполнения одного процесса на выполнение другого является дорогостоящей операцией, поэтому традиционный подход UNIX-систем препятствовал использованию системы в приложениях реального времени;
2. вторая проблема связана с появлением симметричных мультипроцессорных компьютерных архитектур (SMP – Symmetric Multiprocessor Architectures), в которых физически присутствуют несколько процессоров, имеющих одинаковые по скорости возможности доступа к совместно используемой основной памяти – при применении традиционного подхода UNIX-систем к организации процессов наличие общей памяти не является большим достоинством.
Таким образом, более эффективным остается явное параллельное программирование с использованием параллельных процессов в общей виртуальной памяти с явной синхронизацией.
В целях синхронизации используется, так называемая, нить (thread), которая является независимым потоком управления, выполняемым в контексте некоторого процесса.
В этом случае понятие контекста процесса изменяется следующим образом: все, что не относится к потоку управления (виртуальная память, дескрипторы открытых файлов и т. д.), остается в общем контексте процесса, а все, что характерно для потока управления (регистровый контекст, стеки разного уровня и т. д.), переходит из контекста процесса в контекст нити. Все нити процесса выполняются в его контексте, но каждая нить имеет свой собственный контекст.
Контекст нити, как и контекст процесса, состоит из пользовательской и ядерной составляющих.
Пользовательская составляющая контекста нити включает индивидуальный стек нити. Поскольку нити одного процесса выполняются в общей виртуальной памяти (все нити процесса имеют равные права доступа к любым частям виртуальной памяти процесса), то стек (сегмент стека) любой нити процесса не защищен от произвольного (например, по причине ошибки) доступа со стороны других нитей.
Ядерная составляющая контекста нити включает ее регистровый контекст (в частности, содержимое регистра счетчика команд) и динамически создаваемые ядерные стеки.