12.1 ПРОБЛЕМЫ, СВЯЗАННЫЕ С МНОГОПРОЦЕССОРНЫМИ СИСТЕМАМИ
В главе 2 мы
говорили о том, что защита
целостности структур данных ядра
системы UNIX обеспечивается двумя
способами: ядро не может выгрузить
один процесс и переключиться на
контекст другого, если работа
производится в режиме ядра, кроме
того, если при выполнении
критического участка программы
обработчик возникающих прерываний
может повредить структуры данных
ядра, все возникающие прерывания
тщательно маскируются. В
многопроцессорной системе, однако,
если два и более процессов
выполняются одновременно в режиме
ядра на разных процессорах,
нарушение целостности ядра может
произойти даже несмотря на
принятие защитных мер, с другой
стороны, в однопроцессорной
системе вполне достаточных.
struct queue {
} *bp, *bp1;
bp1->forp=bp->forp;
bp1->backp=bp;
bp->forp=bp1;
/* рассмотрите возможность переключения контекста в
* этом месте */
bp1->forp->backp=bp1;
|
Рисунок 12.2. Включение
буфера в список с двойными
указателями
В качестве примера рассмотрим
фрагмент программы из главы 2 (Рисунок 12.2), в котором
новая структура данных (указатель
bp1) помещается в список после
существующей структуры (указатель
bp). Предположим, что этот фрагмент
выполняется одновременно двумя
процессами на разных ЦП, причем
процессор A пытается поместить
вслед за структурой bp структуру bpA,
а процессор B структуру bpB. По поводу
сопоставления быстродействия
процессоров не приходится делать
никаких предположений: возможен
даже наихудший случай, когда
процессор B исполняет 4 команды
языка Си, прежде чем процессор A
исполнит одну. Пусть, например,
выполнение программы процессором A
приостанавливается в связи с
обработкой прерывания. В
результате, даже несмотря на
блокировку остальных прерываний,
целостность данных будет
поставлена под угрозу (в главе 2 этот момент уже
пояснялся).
Ядро обязано удостовериться в
том, что такого рода нарушение не
сможет произойти. Если вопрос об
опасности возникновения нарушения
целостности оставить открытым, как
бы редко подобные нарушения ни
случались, ядро утратит свою
неуязвимость и его поведение
станет непредсказуемым. Избежать
этого можно тремя способами:
- Исполнять все критические
операции на одном процессоре,
опираясь на стандартные методы
сохранения целостности данных
в однопроцессорной системе;
- Регламентировать доступ к
критическим участкам
программы, используя элементы
блокирования ресурсов;
- Устранить конкуренцию за
использование структур данных
путем соответствующей
переделки алгоритмов.
Первые два способа здесь мы
рассмотрим подробнее, третьему
способу будет посвящено отдельное
упражнение.
Предыдущая
глава || Оглавление
|| Следующая глава
|