SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Операционные Системы
 Взаимодействие процессов




        КРСУ, Бишкек, Гайдамако В.В.
Необходимость синхронизации
В любой момент времени в ядре могут быть
активны несколько процессов (ядро
реентерабельно), использующих одни и те же
структуры ядра
Изначально система невытесняющая, процесс
добровольно покидает процессор, всегда
оставляя ядро в корректном состоянии
(современные системы в случае реального
времени используют вытеснение)




               КРСУ, Бишкек, Гайдамако В.В.
Пример отстутствия
                       синхронизации




КРСУ. Операционные
Системы. Процессы.
Гайдамако В.В.
Эффект гонок – Race
       Condition
Результат выполнения
последовательности действий
зависит не только от алгоритма и
входных данных




           КРСУ, Бишкек, Гайдамако В.В.
Критическая секция
Участок кода программы, при
выполнении которого может
возникнуть эффект гонок




           КРСУ, Бишкек, Гайдамако В.В.
Синхронизация необходима
    при         многопроцессорной обработке
    при         операции блокировки
    при         прерываниях




КРСУ. Операционные
Системы. Процессы.
Гайдамако В.В.
КРСУ. Операционные
Системы. Процессы.
Гайдамако В.В.
КРСУ, Бишкек, Гайдамако В.В.
КРСУ, Бишкек, Гайдамако В.В.
Напоминание: требования к
              алгоритмам
  Задача должна быть решена чисто программным способом на обычной машине, не
имеющей специальных команд взаимоисключения. При этом предполагается, что
основные инструкции языка программирования (такие примитивные инструкции как
load, store, test) являются атомарными операциями.
  Не должно существовать никаких предположений об относительных скоростях
выполняющихся процессов или числе процессоров, на которых они исполняются.
  Если процесс Pi исполняется в своем критическом участке, то не существует
никаких других процессов, которые исполняются в своих соответствующих
критических секциях. Это условие получило название условия взаимоисключения
(mutual exclusion).
  Процессы, которые находятся вне своих критических участков и не собираются
входить в них, не могут препятствовать другим процессам входить в их собственные
критические участки. Если нет процессов в критических секциях, и имеются
процессы, желающие войти в них, то только те процессы, которые не исполняются в
remainder section, должны принимать решение о том, какой процесс войдет в свою
критическую секцию. Такое решение не должно приниматься бесконечно долго. Это
условие получило название условия прогресса (progress).
  Не должно возникать бесконечного ожидания для входа процесса в свой
критический участок. От того момента, когда процесс запросил разрешение на вход
в критическую секцию, и до того момента, когда он это разрешение получил, другие
процессы могут пройти через свои критические участки лишь ограниченное число
раз. Это условие получило название условия ограниченного ожидания (bound
waiting).

Надо заметить, что описание соответствующего алгоритма в нашем случае означает описание
способа организации пролога и эпилога для критической секции.
                                  КРСУ, Бишкек, Гайдамако В.В.
Напоминание: алгоритмы с buisy
            wait
Запрет прерываний
Переменная-замок (lock variable)
Строгое чередование (strict
alteration)
Флаги готовности
Алгоритм Петерсона
Алгоритм булочной (Bakery
Algorithm)
            КРСУ, Бишкек, Гайдамако В.В.
Планирование процессов
    Планировщик – часть ядра,
    распределяющая процессорное
    время между процессами
    Долгосрочное и краткосрочное
    планирование – выбор алгоритма и
    «кто следующий»



КРСУ. Операционные
Системы. Процессы.
Гайдамако В.В.
Аппаратная поддержка. Test-
               and-Set 
    Test-and-Set (Проверить и присвоить )
О выполнении команды Test-and-Set, осуществляющей проверку значения логической переменной
    с одновременной установкой ее значения в 1, можно думать, как о выполнении функции
     int Test_and_Set (int *target){

     int tmp = *target;
          *target = 1;
          return tmp;

     }

С использованием этой атомарной команды мы можем модифицировать наш алгоритм для
    переменной-замка, так чтобы он обеспечивал взаимоисключения
     shared int lock = 0;
         while (some condition) {

     while(Test_and_Set(&lock));

     critical section

     lock = 0;

     remainder section

     }

К сожалению, даже в таком виде полученный алгоритм не удовлетворяет условию ограниченного
    ожидания для алгоритмов. Подумайте, как нужно его изменить для соблюдения всех условий.



                                       КРСУ, Бишкек, Гайдамако В.В.
Аппаратная поддержка. Swap
 void Swap (int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
    }

 Применяя атомарную команду Swap, мы можем реализовать предыдущий алгоритм, введя
    дополнительную логическую переменную key локальную для каждого процесса:

 shared int lock = 0;
    int key;
     while (some condition) {

 key = 1;
    do Swap(&lock,&key);
    while (key);

 critical section

 lock = 0;

 remainder section

 }




                                КРСУ, Бишкек, Гайдамако В.В.
Резюме
1. Рассмотренные методы громоздки
   и неэлегантны
2. Процедура ожидания входа в
   критический участок включает в
   себя достаточно длительное
   вращение процесса в пустом
   цикле, вхолостую пожирая
   драгоценное время процессора.
3. Инверсия приоритетов
            КРСУ, Бишкек, Гайдамако В.В.
Механизмы синхронизации более высокого
               уровня:

семафоры,
мониторы и
сообщения




             КРСУ, Бишкек, Гайдамако В.В.
Семафоры
Дейкстра (Dijkstra) в 1965 году

P(S):пока S == 0 процесс
блокируется;
S = S – 1;V(S):S = S + 1;




           КРСУ, Бишкек, Гайдамако В.В.
Решение проблемы producer-
    consumer с помощью семафоров
Semaphore mutex = 1;
   Semaphore empty = N, где N –               Semaphore mutex = 1;
   емкость буфера;                                Semaphore empty = N, где N
   Semaphore full = 0;                            – емкость буфера;
                                                  Semaphore full = 0;
Producer:

while(1) {                                    Consumer:

produce_item;                                 while(1) {
   P(empty);
   P(mutex);                                  P(full);
   put_item;                                     P(mutex);
   V(mutex);
   V(full);                                       put_item;
                                                  V(mutex);
                                                  V(empty);
}                                                 consume_item;

                                              }
}

                          КРСУ, Бишкек, Гайдамако В.В.
Проблема
Допустим, что в рассмотренном примере мы
случайно поменяли местами операции P,
сначала выполняя ее для семафора mutex, а
уже затем для семафоров full и empty.
Допустим теперь, что потребитель, войдя в
свой критический участок (mutex сброшен),
обнаруживает, что буфер пуст. Он блокируется
и начинает ждать появления сообщений. Но
производитель не может войти в критический
участок, для передачи информации, так как тот
заблокирован потребителем. Получаем
тупиковую ситуацию.

               КРСУ, Бишкек, Гайдамако В.В.
Мониторы
1974 году Хор(Hoare)
   Мониторы представляют собой тип данных, который может быть с
   успехом внедрен в объектно-ориентированные языки
   программирования. Монитор обладает своими собственными
   переменными, определяющими его состояние. Значения этих
   переменных извне монитора могут быть изменены только с помощью
   вызова функций-методов, принадлежащих монитору. В свою очередь,
   эти функции-методы могут использовать в своей работе только
   данные, находящиеся внутри монитора и свои параметры. На
   абстрактном уровне можно описать структуру монитора следующим
   образом:
monitor monitor_name {


описание переменных ;
   void m1(...){...
   }
   void m2(...){...
   }
   ...
   void mn(...){...
   }
   {
                      КРСУ, Бишкек, Гайдамако В.В.
блок инициализации внутрениих переменных ;
Мониторы, продолжение
Важной особенностью мониторов является то, что в
любой момент времени только один процесс может быть
активен, т. е. находиться в
состоянии готовность или исполнение, внутри данного
монитора. Поскольку мониторы представляют собой
особые конструкции языка программирования, то
компилятор может отличить вызов функции,
принадлежащей монитору, от вызовов других функций и
обработать его специальным образом, добавив к нему
пролог и эпилог, реализующий взаимоисключение. Так
как обязанность конструирования механизма
взаимоисключений возложена на компилятор, а не на
программиста, работа программиста при использовании
мониторов существенно упрощается, а вероятность
появления ошибок становится меньше.



                 КРСУ, Бишкек, Гайдамако В.В.
Мониторы, wait
Однако одних только взаимоисключений не достаточно
для того, чтобы в полном объеме реализовать решение
задач, возникающих при взаимодействии процессов.
Нам нужны еще и средства организации очередности
процессов, подобно семафорам full и empty в
предыдущем примере. Для этого в мониторах было
введено понятие условных переменных (condition
variables), над которыми можно совершать две
операции wait и signal, до некоторой степени похожие
на операции P и V над семафорами.
Если функция монитора не может выполняться дальше,
пока не наступит некоторое событие, она выполняет
операцию wait над какой-либо условной переменной.
При этом процесс, выполнивший операцию wait,
блокируется, становится неактивным, и другой процесс
получает возможность войти в монитор.


                  КРСУ, Бишкек, Гайдамако В.В.
Мониторы, signal
Когда ожидаемое событие происходит, другой процесс
внутри функции-метода совершает операцию signal над
той же самой условной переменной. Это приводит к
пробуждению ранее заблокированного процесса, и он
становится активным. Если несколько процессов
дожидались операции signal для этой переменной, то
активным становится только один из них. Что нам нужно
предпринять для того, чтобы у нас не оказалось двух
процессов, разбудившего и пробужденного,
одновременно активных внутри монитора? Хор
предложил, чтобы пробужденный процесс подавлял
исполнение разбудившего процесса, пока он сам не
покинет монитор. Несколько позже Хансен
(Hansen) предложил другой механизм: разбудивший
процесс покидает монитор немедленно после
исполнения операции signal. Мы будем придерживаться
подхода Хансена.

                  КРСУ, Бишкек, Гайдамако В.В.
Producer-consumer, монитор
monitor ProducerConsumer {
  condition full, empty;
  int count;
    void put() {
    if(count == N) full.wait;
    put_item;
    count += 1;
    if(count == 1) empty.signal;
    }
    void get() {
    if (count == 0) empty.wait;
    get_item();
    count -= 1;
    if(count == N-1) full.signal;
    }
    {
    count = 0;
    }

}



                               КРСУ, Бишкек, Гайдамако В.В.
Producer-consumer, producer
Producer: 

 while(1) { 

   produce_item; 
  ProducerConsumer.put(); 

} 
               КРСУ, Бишкек, Гайдамако В.В.
Producer-consumer, consumer
Consumer: 

 while(1) { 

 ProducerConsumer.get(); 
 consume_item; 

 } 
               КРСУ, Бишкек, Гайдамако В.В.
Реализация мониторов
Реализация мониторов требует разработки
специальных языков программирования и
компиляторов для них. Мониторы встречаются
в таких языках как параллельный Евклид,
параллельный Паскаль, Java и т.д. Эмуляция
мониторов с помощью системных вызовов для
обычных широко используемых языков
программирования не так проста, как эмуляция
семафоров. Поэтому можно пользоваться еще
одним механизмом со скрытыми
взаимоисключеньями, механизмом, о котором
мы уже упоминали, — передачей сообщений.

               КРСУ, Бишкек, Гайдамако В.В.
Сообщения. Примитивы send-
         receive
Прямая адресация:
send(P, message)—послать сообщение
message процессу P;
receive(Q, message) — получить сообщение
message от процесса Q.
Косвенная адресация:
send(A, message) — послать сообщение
message в почтовый ящик A;
receive(A, message) — получить сообщение
message из почтового ящика A.
              КРСУ, Бишкек, Гайдамако В.В.
Сообщения - синхронизация
Примитивы send и receive уже имеют скрытый
от наших глаз механизм взаимоисключения.
Более того, в большинстве систем они уже
имеют и скрытый механизм блокировки при
чтении из пустого буфера и при записи в
полностью заполненный буфер. Реализация
решения задачи producer-consumer для таких
примитивов становится неприлично
тривиальной. Надо отметить, что, несмотря на
простоту использования, передача сообщений
в пределах одного компьютера происходит
существенно медленнее, чем работа с
семафорами и мониторами.
               КРСУ, Бишкек, Гайдамако В.В.
Эквивалентность семафоров,
  мониторов и сообщений
Реализация мониторов и 
передачи сообщений с 
помощью семафоров
Реализация семафоров и 
передачи сообщений с 
помощью мониторов
Реализация семафоров и 
мониторов с помощью очередей 
сообщений
         КРСУ, Бишкек, Гайдамако В.В.

Weitere ähnliche Inhalte

Was ist angesagt?

ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsAlexey Paznikov
 
20090222 parallel programming_lecture01-07
20090222 parallel programming_lecture01-0720090222 parallel programming_lecture01-07
20090222 parallel programming_lecture01-07Computer Science Club
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAlexey Fyodorov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 

Was ist angesagt? (20)

ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
20090222 parallel programming_lecture01-07
20090222 parallel programming_lecture01-0720090222 parallel programming_lecture01-07
20090222 parallel programming_lecture01-07
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 

Andere mochten auch

NoSQL атакует: JSON функции в MySQL сервере.
NoSQL атакует: JSON функции в MySQL сервере.NoSQL атакует: JSON функции в MySQL сервере.
NoSQL атакует: JSON функции в MySQL сервере.Sveta Smirnova
 
Final race-condition-in-the-web
Final race-condition-in-the-webFinal race-condition-in-the-web
Final race-condition-in-the-webXchym Hiệp
 
4.3. Rat races conditions
4.3. Rat races conditions4.3. Rat races conditions
4.3. Rat races conditionsdefconmoscow
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...Iosif Itkin
 

Andere mochten auch (8)

NoSQL атакует: JSON функции в MySQL сервере.
NoSQL атакует: JSON функции в MySQL сервере.NoSQL атакует: JSON функции в MySQL сервере.
NoSQL атакует: JSON функции в MySQL сервере.
 
Final race-condition-in-the-web
Final race-condition-in-the-webFinal race-condition-in-the-web
Final race-condition-in-the-web
 
IT Race 2014
IT Race 2014IT Race 2014
IT Race 2014
 
4.3. Rat races conditions
4.3. Rat races conditions4.3. Rat races conditions
4.3. Rat races conditions
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Race condition
Race conditionRace condition
Race condition
 
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
 
Linux IPC
Linux IPCLinux IPC
Linux IPC
 

Ähnlich wie 04 ос взаимодействие_процессов_1

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
06 vasenin roganov siis_2013
06 vasenin roganov siis_201306 vasenin roganov siis_2013
06 vasenin roganov siis_2013Marina_creautor
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
PostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellPostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellAlexey Lesovsky
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresProit-people
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиDotNetConf
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Ontico
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Параллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхПараллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхSergey Vasilyev
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Async Javascript
Async JavascriptAsync Javascript
Async JavascriptGetDev.NET
 

Ähnlich wie 04 ос взаимодействие_процессов_1 (20)

Lab5
Lab5Lab5
Lab5
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
06 vasenin roganov siis_2013
06 vasenin roganov siis_201306 vasenin roganov siis_2013
06 vasenin roganov siis_2013
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
PostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellPostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of Hell
 
Multimaster2
Multimaster2Multimaster2
Multimaster2
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметки
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Параллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхПараллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данных
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 

04 ос взаимодействие_процессов_1

  • 1. Операционные Системы Взаимодействие процессов КРСУ, Бишкек, Гайдамако В.В.
  • 2. Необходимость синхронизации В любой момент времени в ядре могут быть активны несколько процессов (ядро реентерабельно), использующих одни и те же структуры ядра Изначально система невытесняющая, процесс добровольно покидает процессор, всегда оставляя ядро в корректном состоянии (современные системы в случае реального времени используют вытеснение) КРСУ, Бишкек, Гайдамако В.В.
  • 3. Пример отстутствия синхронизации КРСУ. Операционные Системы. Процессы. Гайдамако В.В.
  • 4. Эффект гонок – Race Condition Результат выполнения последовательности действий зависит не только от алгоритма и входных данных КРСУ, Бишкек, Гайдамако В.В.
  • 5. Критическая секция Участок кода программы, при выполнении которого может возникнуть эффект гонок КРСУ, Бишкек, Гайдамако В.В.
  • 6. Синхронизация необходима при многопроцессорной обработке при операции блокировки при прерываниях КРСУ. Операционные Системы. Процессы. Гайдамако В.В.
  • 10. Напоминание: требования к алгоритмам Задача должна быть решена чисто программным способом на обычной машине, не имеющей специальных команд взаимоисключения. При этом предполагается, что основные инструкции языка программирования (такие примитивные инструкции как load, store, test) являются атомарными операциями. Не должно существовать никаких предположений об относительных скоростях выполняющихся процессов или числе процессоров, на которых они исполняются. Если процесс Pi исполняется в своем критическом участке, то не существует никаких других процессов, которые исполняются в своих соответствующих критических секциях. Это условие получило название условия взаимоисключения (mutual exclusion). Процессы, которые находятся вне своих критических участков и не собираются входить в них, не могут препятствовать другим процессам входить в их собственные критические участки. Если нет процессов в критических секциях, и имеются процессы, желающие войти в них, то только те процессы, которые не исполняются в remainder section, должны принимать решение о том, какой процесс войдет в свою критическую секцию. Такое решение не должно приниматься бесконечно долго. Это условие получило название условия прогресса (progress). Не должно возникать бесконечного ожидания для входа процесса в свой критический участок. От того момента, когда процесс запросил разрешение на вход в критическую секцию, и до того момента, когда он это разрешение получил, другие процессы могут пройти через свои критические участки лишь ограниченное число раз. Это условие получило название условия ограниченного ожидания (bound waiting). Надо заметить, что описание соответствующего алгоритма в нашем случае означает описание способа организации пролога и эпилога для критической секции. КРСУ, Бишкек, Гайдамако В.В.
  • 11. Напоминание: алгоритмы с buisy wait Запрет прерываний Переменная-замок (lock variable) Строгое чередование (strict alteration) Флаги готовности Алгоритм Петерсона Алгоритм булочной (Bakery Algorithm) КРСУ, Бишкек, Гайдамако В.В.
  • 12. Планирование процессов Планировщик – часть ядра, распределяющая процессорное время между процессами Долгосрочное и краткосрочное планирование – выбор алгоритма и «кто следующий» КРСУ. Операционные Системы. Процессы. Гайдамако В.В.
  • 13. Аппаратная поддержка. Test- and-Set  Test-and-Set (Проверить и присвоить ) О выполнении команды Test-and-Set, осуществляющей проверку значения логической переменной с одновременной установкой ее значения в 1, можно думать, как о выполнении функции int Test_and_Set (int *target){ int tmp = *target; *target = 1; return tmp; } С использованием этой атомарной команды мы можем модифицировать наш алгоритм для переменной-замка, так чтобы он обеспечивал взаимоисключения shared int lock = 0; while (some condition) { while(Test_and_Set(&lock)); critical section lock = 0; remainder section } К сожалению, даже в таком виде полученный алгоритм не удовлетворяет условию ограниченного ожидания для алгоритмов. Подумайте, как нужно его изменить для соблюдения всех условий. КРСУ, Бишкек, Гайдамако В.В.
  • 14. Аппаратная поддержка. Swap void Swap (int *a, int *b){ int tmp = *a; *a = *b; *b = tmp; } Применяя атомарную команду Swap, мы можем реализовать предыдущий алгоритм, введя дополнительную логическую переменную key локальную для каждого процесса: shared int lock = 0; int key; while (some condition) { key = 1; do Swap(&lock,&key); while (key); critical section lock = 0; remainder section } КРСУ, Бишкек, Гайдамако В.В.
  • 15. Резюме 1. Рассмотренные методы громоздки и неэлегантны 2. Процедура ожидания входа в критический участок включает в себя достаточно длительное вращение процесса в пустом цикле, вхолостую пожирая драгоценное время процессора. 3. Инверсия приоритетов КРСУ, Бишкек, Гайдамако В.В.
  • 16. Механизмы синхронизации более высокого уровня: семафоры, мониторы и сообщения КРСУ, Бишкек, Гайдамако В.В.
  • 17. Семафоры Дейкстра (Dijkstra) в 1965 году P(S):пока S == 0 процесс блокируется; S = S – 1;V(S):S = S + 1; КРСУ, Бишкек, Гайдамако В.В.
  • 18. Решение проблемы producer- consumer с помощью семафоров Semaphore mutex = 1; Semaphore empty = N, где N – Semaphore mutex = 1; емкость буфера; Semaphore empty = N, где N Semaphore full = 0; – емкость буфера; Semaphore full = 0; Producer: while(1) { Consumer: produce_item; while(1) { P(empty); P(mutex); P(full); put_item; P(mutex); V(mutex); V(full); put_item; V(mutex); V(empty); } consume_item; } } КРСУ, Бишкек, Гайдамако В.В.
  • 19. Проблема Допустим, что в рассмотренном примере мы случайно поменяли местами операции P, сначала выполняя ее для семафора mutex, а уже затем для семафоров full и empty. Допустим теперь, что потребитель, войдя в свой критический участок (mutex сброшен), обнаруживает, что буфер пуст. Он блокируется и начинает ждать появления сообщений. Но производитель не может войти в критический участок, для передачи информации, так как тот заблокирован потребителем. Получаем тупиковую ситуацию. КРСУ, Бишкек, Гайдамако В.В.
  • 20. Мониторы 1974 году Хор(Hoare) Мониторы представляют собой тип данных, который может быть с успехом внедрен в объектно-ориентированные языки программирования. Монитор обладает своими собственными переменными, определяющими его состояние. Значения этих переменных извне монитора могут быть изменены только с помощью вызова функций-методов, принадлежащих монитору. В свою очередь, эти функции-методы могут использовать в своей работе только данные, находящиеся внутри монитора и свои параметры. На абстрактном уровне можно описать структуру монитора следующим образом: monitor monitor_name { описание переменных ; void m1(...){... } void m2(...){... } ... void mn(...){... } { КРСУ, Бишкек, Гайдамако В.В. блок инициализации внутрениих переменных ;
  • 21. Мониторы, продолжение Важной особенностью мониторов является то, что в любой момент времени только один процесс может быть активен, т. е. находиться в состоянии готовность или исполнение, внутри данного монитора. Поскольку мониторы представляют собой особые конструкции языка программирования, то компилятор может отличить вызов функции, принадлежащей монитору, от вызовов других функций и обработать его специальным образом, добавив к нему пролог и эпилог, реализующий взаимоисключение. Так как обязанность конструирования механизма взаимоисключений возложена на компилятор, а не на программиста, работа программиста при использовании мониторов существенно упрощается, а вероятность появления ошибок становится меньше. КРСУ, Бишкек, Гайдамако В.В.
  • 22. Мониторы, wait Однако одних только взаимоисключений не достаточно для того, чтобы в полном объеме реализовать решение задач, возникающих при взаимодействии процессов. Нам нужны еще и средства организации очередности процессов, подобно семафорам full и empty в предыдущем примере. Для этого в мониторах было введено понятие условных переменных (condition variables), над которыми можно совершать две операции wait и signal, до некоторой степени похожие на операции P и V над семафорами. Если функция монитора не может выполняться дальше, пока не наступит некоторое событие, она выполняет операцию wait над какой-либо условной переменной. При этом процесс, выполнивший операцию wait, блокируется, становится неактивным, и другой процесс получает возможность войти в монитор. КРСУ, Бишкек, Гайдамако В.В.
  • 23. Мониторы, signal Когда ожидаемое событие происходит, другой процесс внутри функции-метода совершает операцию signal над той же самой условной переменной. Это приводит к пробуждению ранее заблокированного процесса, и он становится активным. Если несколько процессов дожидались операции signal для этой переменной, то активным становится только один из них. Что нам нужно предпринять для того, чтобы у нас не оказалось двух процессов, разбудившего и пробужденного, одновременно активных внутри монитора? Хор предложил, чтобы пробужденный процесс подавлял исполнение разбудившего процесса, пока он сам не покинет монитор. Несколько позже Хансен (Hansen) предложил другой механизм: разбудивший процесс покидает монитор немедленно после исполнения операции signal. Мы будем придерживаться подхода Хансена. КРСУ, Бишкек, Гайдамако В.В.
  • 24. Producer-consumer, монитор monitor ProducerConsumer { condition full, empty; int count; void put() { if(count == N) full.wait; put_item; count += 1; if(count == 1) empty.signal; } void get() { if (count == 0) empty.wait; get_item(); count -= 1; if(count == N-1) full.signal; } { count = 0; } } КРСУ, Бишкек, Гайдамако В.В.
  • 25. Producer-consumer, producer Producer:   while(1) {     produce_item;  ProducerConsumer.put();  }  КРСУ, Бишкек, Гайдамако В.В.
  • 26. Producer-consumer, consumer Consumer:  while(1) {  ProducerConsumer.get();  consume_item;  }  КРСУ, Бишкек, Гайдамако В.В.
  • 27. Реализация мониторов Реализация мониторов требует разработки специальных языков программирования и компиляторов для них. Мониторы встречаются в таких языках как параллельный Евклид, параллельный Паскаль, Java и т.д. Эмуляция мониторов с помощью системных вызовов для обычных широко используемых языков программирования не так проста, как эмуляция семафоров. Поэтому можно пользоваться еще одним механизмом со скрытыми взаимоисключеньями, механизмом, о котором мы уже упоминали, — передачей сообщений. КРСУ, Бишкек, Гайдамако В.В.
  • 28. Сообщения. Примитивы send- receive Прямая адресация: send(P, message)—послать сообщение message процессу P; receive(Q, message) — получить сообщение message от процесса Q. Косвенная адресация: send(A, message) — послать сообщение message в почтовый ящик A; receive(A, message) — получить сообщение message из почтового ящика A. КРСУ, Бишкек, Гайдамако В.В.
  • 29. Сообщения - синхронизация Примитивы send и receive уже имеют скрытый от наших глаз механизм взаимоисключения. Более того, в большинстве систем они уже имеют и скрытый механизм блокировки при чтении из пустого буфера и при записи в полностью заполненный буфер. Реализация решения задачи producer-consumer для таких примитивов становится неприлично тривиальной. Надо отметить, что, несмотря на простоту использования, передача сообщений в пределах одного компьютера происходит существенно медленнее, чем работа с семафорами и мониторами. КРСУ, Бишкек, Гайдамако В.В.
  • 30. Эквивалентность семафоров, мониторов и сообщений Реализация мониторов и  передачи сообщений с  помощью семафоров Реализация семафоров и  передачи сообщений с  помощью мониторов Реализация семафоров и  мониторов с помощью очередей  сообщений КРСУ, Бишкек, Гайдамако В.В.