лабы / lab3_IS221_Ekaterina_Magalnik
.docx
ФЕДЕРАЛЬНОЕ
АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА
(РОСАВИАЦИЯ)
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)
Кафедра вычислительных машин, комплексов, сетей и систем.
Лабораторная работа защищена с оценкой ____________________
____________________
(подпись преподавателя, дата)
ЛАБОРАТОРНАЯ РАБОТА №3
по дисциплине «Моделированию вычислительных систем и сетей».
Тема: «Эмулятор исполнения команд GPSS.»
Выполнила студент группы ИС221
Магальник Екатерина Борисовна
Руководитель: Петрухин Сергей Александрович
МОСКВА – 2025
Цель работы:
Тестирование процессов обработки транзакций.
Листинг:
class GPSSSimulator: def __init__(self): self.transactions = [] self.queues = {} self.facilities = {} self.block_chain = [] # Цепочка блоков для транзакций (QUE, SEI, ADV, REL, TER и т.д.) self.next_tid = 1 self.time_limit = 0 def parse_program(self, lines): """Разделяет директивы и блочную цепочку.""" blocks = [] gen_count = 0 time_limit = 0 for line in lines: parts = line.strip().split() if not parts: continue cmd = parts[0].upper() args = parts[1:] if cmd == "GEN": gen_count = int(args[0]) elif cmd == "STA": self.time_limit = int(args[0]) elif cmd in ("QUE", "SEI", "DEP", "ADV", "REL", "TER"): blocks.append((cmd, args)) # Игнорируем всё остальное (включая STA/GEN как блоки) # Генерация транзакций for _ in range(gen_count): self.transactions.append({ 'id': self.next_tid, 'state': 'waiting', 'queue': None, 'facility': None, 'delay_left': 0, 'block_index': 0 # Начинаем с первого блока }) self.next_tid += 1 self.block_chain = blocks print(f"Создано {gen_count} транзакций.") print(f"Блоков для выполнения: {len(self.block_chain)}") print([f"{cmd} {' '.join(args)}" for cmd, args in self.block_chain]) def execute_command(self, tx): if tx['block_index'] >= len(self.block_chain): tx['state'] = 'terminated' return cmd, args = self.block_chain[tx['block_index']] if cmd == "QUE": qname = args[0] if qname not in self.queues: self.queues[qname] = [] self.queues[qname].append(tx['id']) tx['queue'] = qname tx['block_index'] += 1 # Состояние остаётся 'waiting' → следующий блок (SEI) выполнится в этом же такте! elif cmd == "SEI": fname = args[0] if fname not in self.facilities: self.facilities[fname] = None if self.facilities[fname] is None: self.facilities[fname] = tx['id'] tx['state'] = 'using_facility' tx['facility'] = fname tx['block_index'] += 1 else: # Устройство занято — ждём (остаёмся в waiting, не двигаемся) pass # Можно добавить логику ожидания в очереди, если нужно elif cmd == "DEP": qname = args[0] if qname in self.queues and tx['id'] in self.queues[qname]: self.queues[qname].remove(tx['id']) tx['queue'] = None # сброс tx['block_index'] += 1 elif cmd == "ADV": delay = int(args[0]) tx['state'] = 'delaying' tx['delay_left'] = delay elif cmd == "REL": fname = args[0] if fname in self.facilities and self.facilities[fname] == tx['id']: self.facilities[fname] = None tx['state'] = 'waiting' tx['facility'] = None tx['block_index'] += 1 elif cmd == "TER": # Автоматически освобождаем устройство при завершении if tx['facility']: fname = tx['facility'] if fname in self.facilities and self.facilities[fname] == tx['id']: self.facilities[fname] = None tx['state'] = 'terminated' tx['block_index'] += 1 def run(self): print("=== Запуск симуляции ===\n") for t in range(self.time_limit + 1): # +1 чтобы увидеть финальное состояние print(f"Такт {t}:") self.display_state() # Обновляем задержки for tx in self.transactions: if tx['state'] == 'delaying': tx['delay_left'] -= 1 if tx['delay_left'] <= 0: tx['state'] = 'waiting' tx['block_index'] += 1 # Продвигаем после задержки # Выполняем команды для ожидающих транзакций for tx in self.transactions: if tx['state'] == 'waiting' and tx['block_index'] < len(self.block_chain): self.execute_command(tx) # Проверка завершения if all(tx['state'] == 'terminated' for tx in self.transactions): print("\n✅ Все транзакции завершены досрочно.") break def display_state(self): print(" Транзакции:") for tx in self.transactions: info = f" T{tx['id']}: {tx['state']}" if tx['queue']: info += f" [очередь {tx['queue']}]" if tx['facility']: info += f" [устройство {tx['facility']}]" if tx['delay_left'] > 0: info += f" (осталось: {tx['delay_left']})" print(info) if self.queues: print(" Очереди:") for q, tids in self.queues.items(): print(f" {q}: {[f'T{tid}' for tid in tids]}") else: print(" Очереди: <пусто>") if self.facilities: print(" Устройства:") for f, tid in self.facilities.items(): status = f"T{tid}" if tid else "свободно" print(f" {f}: {status}") else: print(" Устройства: <пусто>") print() # === Использование === commands1 = [ "GEN 3", "QUE Qu1", "SEI Ch1", "DEP Qu2", "ADV 2", "REL Ch2", "TER", "STA 4" ] sim = GPSSSimulator() sim.parse_program(commands1) sim.run() commands2 = [ "GEN 3", "QUE Qu2", "SEI Ch2", "DEP Qu1", "ADV 2", "REL Ch1", "TER", "STA 4" ] sim = GPSSSimulator() sim.parse_program(commands2) sim.run() |
Результат работы программы:
