Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

отчет лаба 1 Гаранин

.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
81.65 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА

(РОСАВИАЦИЯ)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

Кафедра вычислительных машин, комплексов, сетей и систем.

Лабораторная работа защищена с оценкой ____________________

____________________

(подпись преподавателя, дата)

ЛАБОРАТОРНАЯ РАБОТА №1

по дисциплине «Модели и технологии распределенных вычислений».

Вариант 1

Тема: «Алгоритмы на основе получения разрешений.»

Выполнила студентка группы ИС2-1

Магальник Екатерина Борисовна

Руководитель: Гаранин Сергей Александрович

МОСКВА – 2024

Цель лабораторной работы: изучение видов и свойств алгоритмов на основе получения разрешений, получение навыков разработки программ для синхронизации доступа к критическому ресурсу в распределенных вычислительных системах.

Задание: реализовать процесс доступа к критическому ресурсу в многопоточной программе на основе алгоритмов в соответствии с вариантом задания. Вариант 1: Алгоритм Лампорта (Lamport's Mutual Exclusion Algorithm).

Теоретические сведения:

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

Вот как это работает:

  1. присвоение номера: каждому процессу, который хочет попасть в критическую секцию, присваивается номер. Обычно это число на единицу больше максимального числа, используемого в настоящее время любым процессом. Это обеспечивает уникальное и последовательно увеличивающееся число для каждого процесса.

  2. ожидание очереди: процесс должен дождаться своей очереди, чтобы перейти в критическую секцию. Порядок определяется номерами - младшие номера идут первыми. Если два процесса имеют одинаковый номер (что теоретически возможно из-за условий гонки на этапе присвоения номера), процесс с меньшим идентификатором процесса запускается первым.

  3. вход в критическую секцию: как только наступает очередь процесса (ни один другой процесс не имеет меньшего номера, или те, у кого меньше номеров, не заинтересованы в входе в критическую секцию), процесс переходит в критическую секцию.

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

Этот алгоритм обеспечивает взаимоисключение, то есть никакие два процесса не могут находиться в своих критических секциях одновременно.

Ключевым преимуществом алгоритма пекарни является его справедливость - каждый процесс получает шанс пройти свою критическую стадию за ограниченный промежуток времени, предотвращая голодание. Однако это может быть неэффективно, если процессов много, поскольку ожидающий процесс должен постоянно проверять, настала ли его очередь, что приводит к напряженному ожиданию.

Листинг:

from multiprocessing import Process, Array, Value import time import ctypes import random class BakeryLock: def __init__(self, n): self.n = n self.choosing = Array(ctypes.c_bool, [False] * n) # Shared array of booleans self.number = Array(ctypes.c_long, [0] * n) # Shared array of long integers self.state = Array(ctypes.c_char, b'_' * n) # Shared array for state def update_state(self, process_id, new_state): self.state[process_id] = new_state.encode() def lock(self, process_id): self.update_state(process_id, 'R') # R for requesting # Step 1: Doorway - Choosing a number self.choosing[process_id] = True time.sleep(random.uniform(0, 0.1)) # Introducing a delay to simulate non-atomic write self.number[process_id] = max(self.number) + 1 time.sleep(random.uniform(0, 0.1)) # Simulate non-atomic read with delay self.choosing[process_id] = False # Step 2: Wait for the turn for other_id in range(self.n): while self.choosing[other_id]: pass # Busy wait while self.number[other_id] != 0 and (self.number[other_id], other_id) < ( self.number[process_id], process_id): pass # Busy wait self.update_state(process_id, 'C') # C for in critical section def unlock(self, process_id): self.update_state(process_id, '_') # _ for not in critical section self.number[process_id] = 0 def critical_section(shared_counter, process_id): # Critical section old_value = shared_counter.value new_value = old_value + 1 shared_counter.value = new_value # Simulate some work print(f"Process {process_id} is working...") time.sleep(random.random()) print(f"Process {process_id} finished working!") # Validate no other process has entered the critical section assert shared_counter.value == new_value, "Mutual exclusion violated" def process_function(lock, shared_counter, process_id, iterations): for _ in range(iterations): lock.lock(process_id) print(generate_ascii_art(lock)) # Print ASCII art when entering critical section critical_section(shared_counter, process_id) lock.unlock(process_id) print(generate_ascii_art(lock)) # Print ASCII art when leaving critical section time.sleep(0.5) # Small delay between iterations def generate_ascii_art(lock): state_symbols = {b'R': 'Requesting', b'C': 'In Critical Section', b'_': 'Waiting'} ascii_art = "\nSystem State:\n" for i in range(lock.n): ascii_art += f"Process {i}: {state_symbols[lock.state[i]]}\n" return ascii_art def main(): num_processes = 5 iterations_per_process = 10 lock = BakeryLock(num_processes) shared_counter = Value('i', 0) # Shared integer counter processes = [] for process_id in range(num_processes): process = Process(target=process_function, args=(lock, shared_counter, process_id, iterations_per_process)) processes.append(process) process.start() for process in processes: process.join() print(generate_ascii_art(lock)) print(f"Final counter value: {shared_counter.value}") assert shared_counter.value == num_processes * iterations_per_process, "Final counter value does not match expected" if __name__ == "__main__": main()

Результат работы программы:

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: In Critical Section

Process 4: Requesting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Waiting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Requesting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Requesting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Waiting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Requesting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Requesting

Process 1: Waiting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Requesting

Process 1: Waiting

Process 2: Requesting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Requesting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Requesting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: Requesting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: Requesting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: In Critical Section

Process 4: Waiting

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Waiting

Process 3: In Critical Section

Process 4: Waiting

Process 3 is working...

Process 3 finished working!

System State:

Process 0: Requesting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: In Critical Section

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 0 is working...

Process 0 finished working!

System State:

Process 0: Waiting

Process 1: Requesting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: In Critical Section

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

Process 1 is working...

Process 1 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Requesting

Process 3: Waiting

Process 4: Requesting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: In Critical Section

Process 3: Waiting

Process 4: Requesting

Process 2 is working...

Process 2 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Waiting

Process 4: In Critical Section

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Waiting

Process 4: In Critical Section

Process 4 is working...

Process 4 finished working!

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Waiting

Process 4: Waiting

System State:

Process 0: Waiting

Process 1: Waiting

Process 2: Waiting

Process 3: Waiting

Process 4: Waiting

Final counter value: 50