Магальник отчет лаба 2 Гаранин
.docx
ФЕДЕРАЛЬНОЕ
АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА
(РОСАВИАЦИЯ)
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)
Кафедра вычислительных машин, комплексов, сетей и систем.
Лабораторная работа защищена с оценкой ____________________
____________________
(подпись преподавателя, дата)
ЛАБОРАТОРНАЯ РАБОТА №2
по дисциплине «Модели и технологии распределенных вычислений».
Вариант 4
Тема: «Семафоры. Обеспечение взаимного исключения исполнения критических секций.»
Выполнила студентка группы ИС2-1
Магальник Екатерина Борисовна
Руководитель: Гаранин Сергей Александрович
МОСКВА – 2024
Цель лабораторной работы: изучение семафоров, обеспечения взаимного исключения исполнения критических секций
Задание: вариант 4: есть приложение, которое одновременно выполняет несколько потоков, каждый из которых пытается получить доступ к общим ресурсам, например, критической секции кода или общей переменной. Нужно использовать семафор для синхронизации доступа к этим ресурсам и предотвращения состояний гонки.
Теоретические сведения: Семафор — это примитив синхронизации работы процессов и потоков, в основе которого лежит счётчик, над которым можно производить две атомарные операции: увеличение и уменьшение значения на единицу.
Семафор служит для построения более сложных механизмов синхронизации и используется:
для синхронизации параллельно работающих задач;
для защиты передачи данных через разделяемую память;
для защиты критических секций;
для управления доступом к аппаратному обеспечению.
Вычислительные семафоры используются для контроля над ограниченными ресурсами.
Листинг:
import threading import time # Создание семафора с начальным значением 2 semaphore = threading.Semaphore(2) # Функция, которая будет выполняться в потоке def critical_section(): # Запрашиваем доступ к критической секции semaphore.acquire() try: # Критическая секция, доступ к общим ресурсам print("Вошел в критическую секцию") time.sleep(5) finally: # Освобождаем доступ к критической секции semaphore.release() print("Вышел из критической секции") # Создание нескольких потоков threads = [] for i in range(5): t = threading.Thread(target=critical_section) threads.append(t) t.start() # Ожидание завершения всех потоков for t in threads: t.join() print("Все потоки завершили выполнение")
Результат работы программы:
