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 этот момент уже
пояснялся).  
Ядро обязано удостовериться в
том, что такого рода нарушение не
сможет произойти. Если вопрос об
опасности возникновения нарушения
целостности оставить открытым, как
бы редко подобные нарушения ни
случались, ядро утратит свою
неуязвимость и его поведение
станет непредсказуемым. Избежать
этого можно тремя способами:  
    - Исполнять все критические
        операции на одном процессоре,
        опираясь на стандартные методы
        сохранения целостности данных
        в однопроцессорной системе; 
 
    - Регламентировать доступ к
        критическим участкам
        программы, используя элементы
        блокирования ресурсов; 
 
    - Устранить конкуренцию за
        использование структур данных
        путем соответствующей
        переделки алгоритмов. 
 
 
Первые два способа здесь мы
рассмотрим подробнее, третьему
способу будет посвящено отдельное
упражнение.  
Предыдущая
глава || Оглавление
|| Следующая глава 
  
 
 |