Linux - статьи

Параллелизм ядра


В ОС Linux имеется поддержка симметричных многопроцессорных архитектур, причем ее реализация не потребовала специальных серьезных изменений в ядре; в рамках постепенной эволюции ядра к нему был добавлен минимальный набор необходимых примитивов.

Для абсолютно независимых процессов, не использующих совместных ресурсов, поддержка SMP не нужна: они будут работать, по возможности используя каждый свой процессор со своей же порцией оперативной памяти, а их общая производительность в двухпроцессорной конфигурации будет почти вдвое больше, чем в однопроцессорной. Использование специальных средств координации нужно только в том случае, когда два процесса пытаются одновременно получить доступ к одному ресурсу, как правило, лежащему в памяти. В этом случае операционная система должна организовать доступ к нему так, чтобы один процессор случайно не испортил результаты работы другого. Для этого в ОС Linux предусмотрена система контроля доступа к областям памяти и блокировок на чтение и запись.

Блокировки требуют соблюдения правил доступа к памяти, на поддержку которых тратятся определенные вычислительные ресурсы, причем даже работая на однопроцессорных компьютерах, поэтому, чтобы не включать в ядро Linux лишний код используется условная компиляция по макроопределению CONFIG_SMP, устанавливаемому утилитой autoconf. Все фрагменты кода, помеченные этим макросом, относятся к многопроцессорной системе; таких мест в общем коде операционной системы, содержащемся в каталоге kernel, восемнадцать. В основном они сосредоточены в планировщике, системе управления потоками, обработке исключительных ситуаций и сигналов, в коде управления таймером. Ядро, собранное с этим макросом, обычно поставляется в отдельном пакете, который устанавливается только в случае необходимости. В частности, если Linux устанавливался на компьютер с одним процессором, а потом в него был добавлен второй, то нужно переустановить ядро.

В ядре Linux для организации параллельных вычислений предусмотрено три группы примитивов: атомарные операции (include/asm-<arch>/atomic.h, где вместо <arch>нужно подставить код соответствующей аппаратной архитектуры), семафоры (include/asm-<arch>/semaphore.h) и спин-блокировка (include/linux/spinlock.h). Из 17 вариантов различных процессорных архитектур, для которых разработана ОС Linux, поддержка SMP не реализована только у четырех: ARM, М68000, SuperH и встроенных сетевых процессорах Etrax. Разберем каждую из этих групп.



Содержание раздела