Дайте определение понятиям: критическая секция, семафор, мьютекс, фьютекс, монитор.



Критическая секция — участок исполняемого кода программы, в котором производится доступ к общему ресурсу (данным или устройству), который не должен быть одновременно использован более чем одним потоком выполнения. При нахождении в критической секции двух (или более) потоков возникает состояние «гонки» («состязания»).

 

Семафо́р (англ. semaphore) — примитив синхронизации работы процессов и потоков, в основе которого лежит счётчик, над которым можно производить две атомарные операции: увеличение и уменьшение значения на единицу, при этом операция уменьшения для нулевого значения счётчика является блокирующейся.

 

Мью́текс (англ. mutex, от mutual exclusion — «взаимное исключение») — примитив синхронизации, обеспечивающий взаимное исключение исполнения критических участков кода. Классический мьютекс отличается от двоичного семафора наличием эксклюзивного владельца, который и должен его освобождать

 

Фьютекс (англ. futex, сокращение от англ. fast userspace mutex) — низкоуровневый легковесный примитив синхронизации, на основе которого реализуются другие примитивы и механизмы, такие как мьютексы, семафоры и условные переменные

 

Монитор (от лат. monitor — напоминающий, предупреждающий, надзиратель, надсмотрщик) — часть управляющей программы операционной системы, реализующая управление одной из фаз вычислительного процесса на ЭВМ.

 

 

Как решить задачу «производителя – потребителя» с помощью семафоров?

int n;

binary_semaphore s = 1;

binary_semaphore delay = 0;

 

void producer()

{

while(true)

{

proceduce();

waitB(s);

append();

n++;

if (n == 1)

signalB(delay);

signalB(s);

}

}

 

void consumer()

{

int m; /* Локальная переменная */

waitB(delay);

while(true)

{

waitB(s);

take ();

n--;

m = n;

signalB(s);

consume();

if (m == 0)

waitB(delay);

}

}

 

void main()

{

n = 0;

parbegin(producer,consumer);

}

 

Как решить задачу «производителя – потребителя» с помощью передичи сообщений?

https://lawbooks.news/windows_952/reshenie-zadachi-proizvoditelya-potrebitelya-66344.html

Алгоритм Патерсона.

Алгоритм Петерсона — алгоритм параллельного программирования для взаимного исключения потоков исполнения кода, разработанный Гарри Петерсоном в 1981 г. Хотя изначально был сформулирован для 2-поточного случая, алгоритм может быть обобщён для произвольного количества потоков.

Алгоритм Петерсона ограничено двумя процессами, которые чередуют выполнение между своими критическими секциями и остальными секциями. Процессы пронумерованы как 𝑃0 и 𝑃1. Для удобства при представлении 𝑃𝑖 мы используем 𝑃𝑗 для обозначения другого процесса; то есть 𝑗 равно 1 − 𝑖. Алгоритм Петерсона требует, чтобы два процесса совместно использовали два элемента данных: int turn; boolean flag[2]; Переменная turn указывает, чья очередь войти в критическую секцию. То есть, если turn == i, то процессу 𝑃𝑖 разрешается выполняться в его критической секции. Массив flag используется для указания того, готов ли процесс войти в свою критическую секцию. Например, если flag[i] равен true, 𝑃𝑖 готов войти в критическую секцию. После описания этих структур данных мы готовы описать алгоритм, показанный на рисунке (Рисунок 3). Чтобы войти в критическую секцию, процесс 𝑃𝑖 сначала устанавливает flag[i] в значение true, а затем устанавливает turn = j, подтверждая тем самым, что, если другой процесс желает войти в критическую секцию, он может это сделать. Если оба процесса пытаются войти в одно и то же время, turn будет установлен на оба значения i и j примерно в одно и то же время. Только одно из этих событий произойдет; другое произойдет, но будет немедленно перезаписано. Конечное значение переменной turn определяет, какому из двух процессов разрешено сначала войти в критическую секцию.

Барьеры.

инструкции, которые могут заставить любые изменения в памяти распространяться на все другие процессоры, тем самым гарантируя, что изменения памяти видны потокам, работающим на других процессорах. Такие инструкции известны как барьеры памяти (memory barriers) или ограждения памяти (memory fences). Когда выполняется инструкция барьера памяти, система гарантирует, что все загрузки и сохранения завершены, прежде чем будут выполнены любые последующие операции загрузки или сохранения.

Задача обедающих философов.

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

 

Каждый философ может либо есть, либо размышлять. Приём пищи не ограничен количеством оставшихся спагетти — подразумевается бесконечный запас. Тем не менее, философ может есть только тогда, когда держит две вилки — взятую справа и слева (альтернативная формулировка проблемы подразумевает миски с рисом и палочки для еды вместо тарелок со спагетти и вилок).

 

Каждый философ может взять ближайшую вилку (если она доступна) или положить — если он уже держит её. Взятие каждой вилки и возвращение её на стол являются раздельными действиями, которые должны выполняться одно за другим.

 

Вопрос задачи заключается в том, чтобы разработать модель поведения (параллельный алгоритм), при котором ни один из философов не будет голодать, то есть будет вечно чередовать приём пищи и размышления

 

Задача читателей и писателей

https://is.gd/kMIIRf


Дата добавления: 2022-06-11; просмотров: 123; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!