Dieses Projekt wurde im Rahmen des Moduls Betriebssysteme an der Hochschule-Ruhr-West im Fachbereich Angewandte Informatik erstellt.
Ein C/C++-basierter Deadlock-Simulator mit einer grafischen Benutzeroberfläche zur Visualisierung und Bewertung von Algorithmen zur Erkennung, Verhinderung und Auflösung von Deadlocks.
Der Fokus liegt auf der Kernfunktionalität des Simulators, der verschiedene Deadlock-Szenarien erzeugt und es ermöglicht, unterschiedliche Strategien zur Deadlockerkennung, -vermeidung und -behebung zu testen. Hierbei werden unter anderem der Banker's Algorithmus sowie Strategien zur Ressourcenprävention, Prozessunterbrechung und -rücksetzung unterstützt. Die implementierte API stellt sicher, dass diese Algorithmen in der Simulationsumgebung wiederholt und unter verschiedenen Bedingungen evaluiert werden können. Ein grafisches Interface visualisiert eine Tabelle, welche die Zustände der Prozesse und Ressourcen während der Ausführung der verschiedenen Strategien demonstriert.
Dieses Projekt erfordert:
- CMake (zum Kompilieren des Projekts)
- Das Qt Framework in der Version
6.5.1
(zur Erstellung der grafischen Benutzeroberfläche)
Für dieses Projekt wird das Qt-Framework benötigt, das vor der Kompilierung installiert sein muss. Der Installationspfad für Qt muss während der CMake-Konfiguration bereitgestellt werden.
cmake -DCMAKE_PREFIX_PATH="~/Qt/6.5.1/macos" .
cmake -DCMAKE_PREFIX_PATH="~/Qt/6.5.1/gcc_64" .
Nachdem Qt installiert und der Installationspfad in der CMake-Konfiguration festgelegt wurde, können Sie das Projekt wie
folgt kompilieren:
Wichtig: CMake 3.29
wurde festgelegt und wird hier spezifisch benötigt.
- Navigieren Sie in der CMD zum Projektordner.
- Führen Sie die folgendenen Befehle aus:
mkdir build && cd build
cmake ..
make
Nach erfolgreicher Kompilierung finden Sie die ausführbare Datei im Ordner build
.
- Starten Sie das Programm. Daraufhin öffnet sich das GUI.
- Wählen Sie eine der folgenden Optionen, um die Deadlock-Algorithmen zu testen:
- Generate Deadlock: Erzeugt eine Deadlock-Situation mit mehreren Prozessen und Ressourcen.
- Run Banker's Algorithm: Führt den Banker's Algorithmus durch, um zu prüfen, ob das System in einem sicheren Zustand ist.
- Run Interrupt Process: Unterbricht einen Prozess, um Deadlocks aufzulösen.
- Run Abort Process: Bricht einen Prozess ab, um Deadlocks aufzulösen.
- Reset: Setzt die Simulation zurück.
- Run Avoidance Strategy: Führt verschiedene Deadlock Avoidance Strategien aus.
- Schedule Banker's Algorithm: Plant den Banker's Algorithmus auszuführen auf beliebige Zeitangabe.
- Schedule Interrupt Process: Plant den den Unterbrechungs-Algorithmus auszuführen auf beliebige Zeitangabe.
- Schedule Abort Process: Plant den den Abbrechungs-Algorithmus auszuführen auf beliebige Zeitangabe.
- Process Events: Führt die geplanten Algorithmen aus und gibt die Zeitangaben in der Konsole aus.
Das Projekt ist in verschiedene Komponenten unterteilt, die jeweils unterschiedliche Aspekte der Deadlock-Simulation und -Verwaltung übernehmen. Hier ist eine Übersicht der wichtigsten Dateien und Klassen:
Die Hauptfunktion der Anwendung. Hier wird die grafische Benutzeroberfläche erstellt und die verschiedenen Deadlock-Algorithmen und Strategien aufgerufen.
Verantwortlich für das Hauptfenster der grafischen Benutzeroberfläche. Hier werden die Interaktionselemente (wie Buttons) und die Tabellen, die die Zustände der Prozesse und Ressourcen anzeigen, definiert und verwaltet.
Diese Dateien definieren die Process
-Klasse. Ein Process
repräsentiert einen laufenden Prozess in der Simulation und
speichert Informationen wie die maximale Ressourcennutzung, die zugeteilten Ressourcen und die Priorität des Prozesses.
Die Klasse enthält Methoden zum Anfordern und Freigeben von Ressourcen.
class Process {
public:
Process(int id, const std::vector<int>& maxRes, int prio);
bool requestResources(const std::vector<int>& request, std::vector<Resource>& resources);
void releaseResources(std::vector<Resource>& resources);
};
Definiert die Resource
-Klasse, die die verfügbaren Ressourcen im System repräsentiert. Sie enthält Methoden zur
Zuteilung und Freigabe von Ressourcen.
Diese Dateien enthalten die Algorithmen zur Deadlockerkennung und -lösung. Der DeadlockRecovery
-Klasse bietet
verschiedene Strategien zur Lösung von Deadlocks, wie Unterbrechung eines Prozesses oder Rücksetzen auf einen früheren
Zustand.
class DeadlockRecovery {
public:
bool detectDeadlock(const std::vector<Process>& processes, const std::vector<Resource>& resources);
void resolveDeadlock(std::vector<Process>& processes, std::vector<Resource>& resources, const std::string& strategy);
};
Der Banker's Algorithmus wird hier implementiert, um zu überprüfen, ob eine angeforderte Ressourcenzuteilung sicher ist oder nicht. Diese Klasse ist für die Überprüfung des sicheren Zustands des Systems zuständig.
Die Tests für den Banker's Algorithmus und die Deadlock-Strategien werden in den Dateien BankersAlgorithmTest.h
und
DeadlockTest.h
definiert.
class BankersAlgorithmTest {
public:
void runAllTests();
};
- Tim Wittlerbäumer
- Daria Hardering