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