commit cac8cf6ad7faa3c49228558aa277f558d81b1471 Author: Launchcore Date: Thu Nov 6 10:36:22 2025 +0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2e4546 --- /dev/null +++ b/.gitignore @@ -0,0 +1,246 @@ +### C++ ### +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +### CMake ### +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + +### CMake Patch ### +CMakeUserPresets.json + +# External projects +*-prefix/ + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### MicrosoftOffice ### +*.tmp + +# Word temporary +~$*.doc* + +# Word Auto Backup File +Backup of *.doc* + +# Excel temporary +~$*.xls* + +# Excel Backup File +*.xlk + +# PowerPoint temporary +~$*.ppt* + +# Visio autosave temporary files +*.~vsd* + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/Experiment.iml b/.idea/Experiment.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/Experiment.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..25c6c37 --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,344 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0b76fe5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e9eeaab --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/2330110900 张顾皓 实验报告.docx b/2330110900 张顾皓 实验报告.docx new file mode 100644 index 0000000..1886400 Binary files /dev/null and b/2330110900 张顾皓 实验报告.docx differ diff --git a/2330110900+张顾皓+可变分区存储管理实验.docx b/2330110900+张顾皓+可变分区存储管理实验.docx new file mode 100644 index 0000000..2e0cbda Binary files /dev/null and b/2330110900+张顾皓+可变分区存储管理实验.docx differ diff --git a/2330110900+张顾皓+处理机调度实验.docx b/2330110900+张顾皓+处理机调度实验.docx new file mode 100644 index 0000000..02c6492 Binary files /dev/null and b/2330110900+张顾皓+处理机调度实验.docx differ diff --git a/2330110900+张顾皓+死锁避免实验.docx b/2330110900+张顾皓+死锁避免实验.docx new file mode 100644 index 0000000..423e3b4 Binary files /dev/null and b/2330110900+张顾皓+死锁避免实验.docx differ diff --git a/2330110900+张顾皓+进程同步实验.docx b/2330110900+张顾皓+进程同步实验.docx new file mode 100644 index 0000000..fab9705 Binary files /dev/null and b/2330110900+张顾皓+进程同步实验.docx differ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a327cbd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 4.0) +project(Experiment) + +set(CMAKE_CXX_STANDARD 20) + +add_executable(CPUScheduler CPUScheduler.cpp) + +add_executable(ProcessSync ProcessSync.cpp) + +add_executable(DeadlockAvoid DeadlockAvoid.cpp) + +add_executable(MemoryManager MemoryManager.cpp) \ No newline at end of file diff --git a/CPUScheduler.cpp b/CPUScheduler.cpp new file mode 100644 index 0000000..215dc65 --- /dev/null +++ b/CPUScheduler.cpp @@ -0,0 +1,435 @@ +#include +#include +#include +#include +#include +#include +using namespace std; + +// 进程结构体 +struct Process { + int pid; // 进程ID + int arrivalTime; // 到达时间 + int burstTime; // 服务时间 + int priority; // 优先级(数值越小优先级越高) + int remainingTime; // 剩余时间 + int finishTime; // 完成时间 + int turnaroundTime; // 周转时间 + int waitingTime; // 等待时间 + double responseRatio; // 响应比(用于HRRN) + + Process(int p, int a, int b, int pr = 0) { + pid = p; + arrivalTime = a; + burstTime = b; + priority = pr; + remainingTime = b; + finishTime = 0; + turnaroundTime = 0; + waitingTime = 0; + responseRatio = 0.0; + } +}; + +class CPUScheduler { +private: + vector processes; + vector originalProcesses; + +public: + // 添加进程 + void addProcess(int pid, int arrivalTime, int burstTime, int priority = 0) { + processes.push_back(Process(pid, arrivalTime, burstTime, priority)); + originalProcesses.push_back(Process(pid, arrivalTime, burstTime, priority)); + } + + // 重置进程状态 + void resetProcesses() { + processes = originalProcesses; + for (auto& p : processes) { + p.remainingTime = p.burstTime; + p.finishTime = 0; + p.turnaroundTime = 0; + p.waitingTime = 0; + p.responseRatio = 0.0; + } + } + + // 先来先服务(FCFS)算法 + void FCFS() { + cout << "\n========== 先来先服务(FCFS)调度算法 ==========\n"; + resetProcesses(); + + // 按到达时间排序 + sort(processes.begin(), processes.end(), + [](const Process& a, const Process& b) { + return a.arrivalTime < b.arrivalTime; + }); + + int currentTime = 0; + cout << "执行顺序: "; + + for (auto& p : processes) { + // 如果当前时间小于进程到达时间,CPU空闲 + if (currentTime < p.arrivalTime) { + currentTime = p.arrivalTime; + } + + cout << "P" << p.pid << " "; + currentTime += p.burstTime; + p.finishTime = currentTime; + p.turnaroundTime = p.finishTime - p.arrivalTime; + p.waitingTime = p.turnaroundTime - p.burstTime; + } + cout << "\n"; + + printResults(); + } + + // 最短作业优先(SJF)算法 + void SJF() { + cout << "\n========== 最短作业优先(SJF)调度算法 ==========\n"; + resetProcesses(); + + vector readyQueue; + vector completed; + int currentTime = 0; + cout << "执行顺序: "; + + while (completed.size() < processes.size()) { + // 将已到达的进程加入就绪队列 + for (auto& p : processes) { + if (p.arrivalTime <= currentTime && p.finishTime == 0) { + bool inQueue = false; + for (const auto& q : readyQueue) { + if (q.pid == p.pid) { + inQueue = true; + break; + } + } + if (!inQueue) { + readyQueue.push_back(p); + } + } + } + + if (!readyQueue.empty()) { + // 选择服务时间最短的进程 + auto shortestJob = min_element(readyQueue.begin(), readyQueue.end(), + [](const Process& a, const Process& b) { + return a.burstTime < b.burstTime; + }); + + cout << "P" << shortestJob->pid << " "; + currentTime += shortestJob->burstTime; + + // 更新原进程信息 + for (auto& p : processes) { + if (p.pid == shortestJob->pid) { + p.finishTime = currentTime; + p.turnaroundTime = p.finishTime - p.arrivalTime; + p.waitingTime = p.turnaroundTime - p.burstTime; + completed.push_back(p); + break; + } + } + + // 从就绪队列中移除已完成的进程 + readyQueue.erase(shortestJob); + } else { + currentTime++; + } + } + cout << "\n"; + + printResults(); + } + + // 最短剩余时间优先(SRTF)算法 + void SRTF() { + cout << "\n========== 最短剩余时间优先(SRTF)调度算法 ==========\n"; + resetProcesses(); + + int currentTime = 0; + int completed = 0; + vector executionOrder; + + while (completed < processes.size()) { + int shortestIdx = -1; + int shortestTime = INT_MAX; + + // 找到当前时间已到达且剩余时间最短的进程 + for (int i = 0; i < processes.size(); i++) { + if (processes[i].arrivalTime <= currentTime && + processes[i].remainingTime > 0 && + processes[i].remainingTime < shortestTime) { + shortestTime = processes[i].remainingTime; + shortestIdx = i; + } + } + + if (shortestIdx == -1) { + currentTime++; + continue; + } + + // 执行选中的进程1个时间单位 + executionOrder.push_back(processes[shortestIdx].pid); + processes[shortestIdx].remainingTime--; + currentTime++; + + // 如果进程完成 + if (processes[shortestIdx].remainingTime == 0) { + processes[shortestIdx].finishTime = currentTime; + processes[shortestIdx].turnaroundTime = + processes[shortestIdx].finishTime - processes[shortestIdx].arrivalTime; + processes[shortestIdx].waitingTime = + processes[shortestIdx].turnaroundTime - processes[shortestIdx].burstTime; + completed++; + } + } + + // 输出执行顺序(去重连续相同的进程) + cout << "执行顺序: "; + if (!executionOrder.empty()) { + cout << "P" << executionOrder[0]; + for (int i = 1; i < executionOrder.size(); i++) { + if (executionOrder[i] != executionOrder[i-1]) { + cout << " P" << executionOrder[i]; + } + } + } + cout << "\n"; + + printResults(); + } + + // 最高响应比优先(HRRN)算法 + void HRRN() { + cout << "\n========== 最高响应比优先(HRRN)调度算法 ==========\n"; + resetProcesses(); + + vector completed; + int currentTime = 0; + cout << "执行顺序: "; + + while (completed.size() < processes.size()) { + vector readyQueue; + + // 找到所有已到达且未完成的进程 + for (int i = 0; i < processes.size(); i++) { + if (processes[i].arrivalTime <= currentTime && processes[i].finishTime == 0) { + readyQueue.push_back(i); + } + } + + if (!readyQueue.empty()) { + // 计算响应比并选择最高的 + int selectedIdx = -1; + double highestRatio = 0.0; + + for (int idx : readyQueue) { + int waitTime = currentTime - processes[idx].arrivalTime; + processes[idx].responseRatio = + (double)(waitTime + processes[idx].burstTime) / processes[idx].burstTime; + + if (processes[idx].responseRatio > highestRatio) { + highestRatio = processes[idx].responseRatio; + selectedIdx = idx; + } + } + + cout << "P" << processes[selectedIdx].pid << " "; + currentTime += processes[selectedIdx].burstTime; + processes[selectedIdx].finishTime = currentTime; + processes[selectedIdx].turnaroundTime = + processes[selectedIdx].finishTime - processes[selectedIdx].arrivalTime; + processes[selectedIdx].waitingTime = + processes[selectedIdx].turnaroundTime - processes[selectedIdx].burstTime; + completed.push_back(processes[selectedIdx]); + } else { + currentTime++; + } + } + cout << "\n"; + + printResults(); + } + + // 时间片轮转(RR)算法 + void RR(int timeQuantum = 2) { + cout << "\n========== 时间片轮转(RR)调度算法 (时间片=" << timeQuantum << ") ==========\n"; + resetProcesses(); + + queue readyQueue; + vector inQueue(processes.size(), false); + int currentTime = 0; + int completed = 0; + cout << "执行顺序: "; + + // 将时间0到达的进程加入队列 + for (int i = 0; i < processes.size(); i++) { + if (processes[i].arrivalTime <= currentTime) { + readyQueue.push(i); + inQueue[i] = true; + } + } + + while (completed < processes.size()) { + if (readyQueue.empty()) { + currentTime++; + // 检查是否有新进程到达 + for (int i = 0; i < processes.size(); i++) { + if (processes[i].arrivalTime <= currentTime && + !inQueue[i] && processes[i].remainingTime > 0) { + readyQueue.push(i); + inQueue[i] = true; + } + } + continue; + } + + int currentProcess = readyQueue.front(); + readyQueue.pop(); + inQueue[currentProcess] = false; + + cout << "P" << processes[currentProcess].pid << " "; + + // 执行时间片或直到进程完成 + int executeTime = min(timeQuantum, processes[currentProcess].remainingTime); + currentTime += executeTime; + processes[currentProcess].remainingTime -= executeTime; + + // 将在执行期间到达的进程加入队列 + for (int i = 0; i < processes.size(); i++) { + if (processes[i].arrivalTime <= currentTime && + !inQueue[i] && processes[i].remainingTime > 0 && i != currentProcess) { + readyQueue.push(i); + inQueue[i] = true; + } + } + + // 如果当前进程还未完成,重新加入队列 + if (processes[currentProcess].remainingTime > 0) { + readyQueue.push(currentProcess); + inQueue[currentProcess] = true; + } else { + // 进程完成 + processes[currentProcess].finishTime = currentTime; + processes[currentProcess].turnaroundTime = + processes[currentProcess].finishTime - processes[currentProcess].arrivalTime; + processes[currentProcess].waitingTime = + processes[currentProcess].turnaroundTime - processes[currentProcess].burstTime; + completed++; + } + } + cout << "\n"; + + printResults(); + } + + // 优先级调度算法(非抢占) + void PriorityScheduling() { + cout << "\n========== 优先级调度算法(非抢占) ==========\n"; + resetProcesses(); + + vector completed; + int currentTime = 0; + cout << "执行顺序: "; + + while (completed.size() < processes.size()) { + vector readyQueue; + + // 找到所有已到达且未完成的进程 + for (int i = 0; i < processes.size(); i++) { + if (processes[i].arrivalTime <= currentTime && processes[i].finishTime == 0) { + readyQueue.push_back(i); + } + } + + if (!readyQueue.empty()) { + // 选择优先级最高的进程(数值最小) + int selectedIdx = readyQueue[0]; + for (int idx : readyQueue) { + if (processes[idx].priority < processes[selectedIdx].priority) { + selectedIdx = idx; + } + } + + cout << "P" << processes[selectedIdx].pid << " "; + currentTime += processes[selectedIdx].burstTime; + processes[selectedIdx].finishTime = currentTime; + processes[selectedIdx].turnaroundTime = + processes[selectedIdx].finishTime - processes[selectedIdx].arrivalTime; + processes[selectedIdx].waitingTime = + processes[selectedIdx].turnaroundTime - processes[selectedIdx].burstTime; + completed.push_back(processes[selectedIdx]); + } else { + currentTime++; + } + } + cout << "\n"; + + printResults(); + } + + // 打印结果 + void printResults() { + cout << "\n进程调度结果:\n"; + cout << "进程ID\t到达时间\t服务时间\t完成时间\t周转时间\t等待时间\n"; + cout << "--------------------------------------------------------------\n"; + + double totalTurnaround = 0, totalWaiting = 0; + + for (const auto& p : processes) { + cout << "P" << p.pid << "\t" << p.arrivalTime << "\t\t" + << p.burstTime << "\t\t" << p.finishTime << "\t\t" + << p.turnaroundTime << "\t\t" << p.waitingTime << "\n"; + totalTurnaround += p.turnaroundTime; + totalWaiting += p.waitingTime; + } + + cout << "--------------------------------------------------------------\n"; + cout << fixed << setprecision(2); + cout << "平均周转时间: " << totalTurnaround / processes.size() << "\n"; + cout << "平均等待时间: " << totalWaiting / processes.size() << "\n"; + } + + // 显示所有进程信息 + void displayProcesses() { + cout << "\n当前进程信息:\n"; + cout << "进程ID\t到达时间\t服务时间\t优先级\n"; + cout << "----------------------------------------\n"; + for (const auto& p : originalProcesses) { + cout << "P" << p.pid << "\t" << p.arrivalTime << "\t\t" + << p.burstTime << "\t\t" << p.priority << "\n"; + } + } +}; + +int main() { + CPUScheduler scheduler; + + cout << "处理机调度算法实验\n"; + cout << "==================\n"; + + // 示例进程数据 + cout << "使用示例进程数据进行测试:\n"; + scheduler.addProcess(1, 0, 8, 3); // 进程P1: 到达时间0, 服务时间8, 优先级3 + scheduler.addProcess(2, 1, 4, 1); // 进程P2: 到达时间1, 服务时间4, 优先级1 + scheduler.addProcess(3, 2, 2, 4); // 进程P3: 到达时间2, 服务时间2, 优先级4 + scheduler.addProcess(4, 3, 1, 2); // 进程P4: 到达时间3, 服务时间1, 优先级2 + scheduler.addProcess(5, 4, 3, 5); // 进程P5: 到达时间4, 服务时间3, 优先级5 + + scheduler.displayProcesses(); + + // 执行各种调度算法 + scheduler.FCFS(); + scheduler.SJF(); + scheduler.SRTF(); + scheduler.HRRN(); + scheduler.RR(2); + scheduler.PriorityScheduling(); + + return 0; +} \ No newline at end of file diff --git a/DeadlockAvoid.cpp b/DeadlockAvoid.cpp new file mode 100644 index 0000000..ce68a66 --- /dev/null +++ b/DeadlockAvoid.cpp @@ -0,0 +1,507 @@ +#include +#include +#include +using namespace std; + +class BankersAlgorithm { +private: + int n; // 进程数量 + int m; // 资源类型数量 + vector> allocation; // 分配矩阵 + vector> max; // 最大需求矩阵 + vector> need; // 需求矩阵 + vector available; // 可用资源向量 + +public: + // 构造函数,初始化银行家算法 + BankersAlgorithm(int processes, int resources) { + n = processes; + m = resources; + allocation.resize(n, vector(m, 0)); + max.resize(n, vector(m, 0)); + need.resize(n, vector(m, 0)); + available.resize(m, 0); + } + + // 加载测试数据集1:安全状态测试 + void loadTestData1() { + cout << "加载测试数据集1:安全状态测试(5进程,3资源)" << endl; + n = 5; m = 3; + + // 重新调整矩阵大小 + allocation.resize(n, vector(m)); + max.resize(n, vector(m)); + need.resize(n, vector(m)); + available.resize(m); + + // 可用资源向量 + available = {3, 3, 2}; + + // 分配矩阵 + allocation = { + {0, 1, 0}, + {2, 0, 0}, + {3, 0, 2}, + {2, 1, 1}, + {0, 0, 2} + }; + + // 最大需求矩阵 + max = { + {7, 5, 3}, + {3, 2, 2}, + {9, 0, 2}, + {2, 2, 2}, + {4, 3, 3} + }; + + calculateNeedMatrix(); + cout << "测试数据集1加载完成!预期:系统安全,安全序列如P1->P3->P4->P2->P0" << endl; + } + + // 加载测试数据集2:不安全状态测试 + void loadTestData2() { + cout << "加载测试数据集2:不安全状态测试(3进程,3资源)" << endl; + n = 3; m = 3; + + // 重新调整矩阵大小 + allocation.resize(n, vector(m)); + max.resize(n, vector(m)); + need.resize(n, vector(m)); + available.resize(m); + + // 可用资源向量 + available = {1, 0, 0}; + + // 分配矩阵 + allocation = { + {1, 2, 0}, + {2, 0, 1}, + {0, 1, 2} + }; + + // 最大需求矩阵 + max = { + {3, 3, 2}, + {4, 2, 2}, + {3, 3, 3} + }; + + calculateNeedMatrix(); + cout << "测试数据集2加载完成!预期:系统不安全" << endl; + } + + // 加载测试数据集3:边界情况测试 + void loadTestData3() { + cout << "加载测试数据集3:边界情况测试(2进程,2资源)" << endl; + n = 2; m = 2; + + // 重新调整矩阵大小 + allocation.resize(n, vector(m)); + max.resize(n, vector(m)); + need.resize(n, vector(m)); + available.resize(m); + + // 可用资源向量 + available = {2, 2}; + + // 分配矩阵 + allocation = { + {1, 0}, + {0, 1} + }; + + // 最大需求矩阵 + max = { + {3, 2}, + {2, 3} + }; + + calculateNeedMatrix(); + cout << "测试数据集3加载完成!预期:系统安全,安全序列如P0->P1或P1->P0" << endl; + } + + // 输入系统状态信息 + void inputSystemState() { + cout << "请输入可用资源向量Available(" << m << "个资源类型):"; + for (int i = 0; i < m; i++) { + cin >> available[i]; + } + + cout << "请输入分配矩阵Allocation:" << endl; + for (int i = 0; i < n; i++) { + cout << "进程P" << i << ":"; + for (int j = 0; j < m; j++) { + cin >> allocation[i][j]; + } + } + + cout << "请输入最大需求矩阵Max:" << endl; + for (int i = 0; i < n; i++) { + cout << "进程P" << i << ":"; + for (int j = 0; j < m; j++) { + cin >> max[i][j]; + } + } + + // 计算需求矩阵Need = Max - Allocation + calculateNeedMatrix(); + } + + // 计算需求矩阵 + void calculateNeedMatrix() { + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + need[i][j] = max[i][j] - allocation[i][j]; + } + } + } + + // 显示当前系统状态 + void displaySystemState() { + cout << "\n=== 当前系统状态 ===" << endl; + + // 显示可用资源 + cout << "可用资源Available:"; + for (int i = 0; i < m; i++) { + cout << setw(4) << available[i]; + } + cout << endl; + + // 显示各矩阵 + cout << "\n进程\t分配矩阵Allocation\t最大需求矩阵Max\t\t需求矩阵Need" << endl; + for (int i = 0; i < n; i++) { + cout << "P" << i << "\t"; + + // 分配矩阵 + for (int j = 0; j < m; j++) { + cout << setw(3) << allocation[i][j]; + } + cout << "\t\t"; + + // 最大需求矩阵 + for (int j = 0; j < m; j++) { + cout << setw(3) << max[i][j]; + } + cout << "\t\t"; + + // 需求矩阵 + for (int j = 0; j < m; j++) { + cout << setw(3) << need[i][j]; + } + cout << endl; + } + } + + // 安全性检查,返回是否安全及安全序列 + bool safetyCheck(vector& safeSequence) { + vector work = available; // 工作向量,初始值为Available + vector finish(n, false); // 完成标记数组 + safeSequence.clear(); + + cout << "\n=== 安全性检查过程 ===" << endl; + cout << "初始工作向量Work:"; + for (int i = 0; i < m; i++) { + cout << setw(4) << work[i]; + } + cout << endl; + + int count = 0; // 已完成的进程数量 + + // 循环查找可以完成的进程 + while (count < n) { + bool found = false; + + for (int i = 0; i < n; i++) { + // 如果进程i未完成且Need[i] <= Work + if (!finish[i]) { + bool canFinish = true; + for (int j = 0; j < m; j++) { + if (need[i][j] > work[j]) { + canFinish = false; + break; + } + } + + if (canFinish) { + // 进程i可以完成 + cout << "进程P" << i << "可以完成,需求:"; + for (int j = 0; j < m; j++) { + cout << setw(3) << need[i][j]; + } + cout << " <= 工作向量:"; + for (int j = 0; j < m; j++) { + cout << setw(3) << work[j]; + } + cout << endl; + + // 更新工作向量:Work = Work + Allocation[i] + for (int j = 0; j < m; j++) { + work[j] += allocation[i][j]; + } + + finish[i] = true; + safeSequence.push_back(i); + count++; + found = true; + + cout << "完成后工作向量:"; + for (int j = 0; j < m; j++) { + cout << setw(4) << work[j]; + } + cout << endl << endl; + break; + } + } + } + + // 如果没有找到可以完成的进程,系统不安全 + if (!found) { + cout << "无法找到可完成的进程,系统处于不安全状态!" << endl; + return false; + } + } + + return true; + } + + // 资源请求处理 + bool requestResources(int processId, vector& request) { + cout << "\n=== 处理进程P" << processId << "的资源请求 ===" << endl; + cout << "请求向量Request:"; + for (int i = 0; i < m; i++) { + cout << setw(4) << request[i]; + } + cout << endl; + + // 步骤1:检查Request <= Need + cout << "检查Request <= Need:"; + for (int i = 0; i < m; i++) { + if (request[i] > need[processId][i]) { + cout << "失败!请求超过需求量" << endl; + return false; + } + } + cout << "通过" << endl; + + // 步骤2:检查Request <= Available + cout << "检查Request <= Available:"; + for (int i = 0; i < m; i++) { + if (request[i] > available[i]) { + cout << "失败!请求超过可用资源" << endl; + return false; + } + } + cout << "通过" << endl; + + // 步骤3:试探性分配 + cout << "进行试探性分配..." << endl; + + // 保存原始状态 + vector originalAvailable = available; + vector> originalAllocation = allocation; + vector> originalNeed = need; + + // 修改系统状态 + for (int i = 0; i < m; i++) { + available[i] -= request[i]; + allocation[processId][i] += request[i]; + need[processId][i] -= request[i]; + } + + cout << "试探性分配后的状态:" << endl; + displaySystemState(); + + // 步骤4:执行安全性检查 + vector safeSequence; + bool isSafe = safetyCheck(safeSequence); + + if (isSafe) { + cout << "系统处于安全状态!" << endl; + cout << "安全序列:"; + for (int i = 0; i < safeSequence.size(); i++) { + cout << "P" << safeSequence[i]; + if (i < safeSequence.size() - 1) cout << " -> "; + } + cout << endl; + cout << "资源分配成功!" << endl; + return true; + } else { + // 恢复原始状态 + available = originalAvailable; + allocation = originalAllocation; + need = originalNeed; + cout << "分配后系统不安全,拒绝分配,恢复原状态" << endl; + return false; + } + } + + // 显示数据选择菜单 + void showDataMenu() { + cout << "\n=== 选择测试数据或手动输入 ===" << endl; + cout << "1. 使用测试数据集1(5进程3资源,安全状态)" << endl; + cout << "2. 使用测试数据集2(3进程3资源,不安全状态)" << endl; + cout << "3. 使用测试数据集3(2进程2资源,边界测试)" << endl; + cout << "4. 手动输入系统参数和数据" << endl; + cout << "请选择:"; + } + + // 显示菜单 + void showMenu() { + cout << "\n=== 银行家算法菜单 ===" << endl; + cout << "1. 显示当前系统状态" << endl; + cout << "2. 安全性检查" << endl; + cout << "3. 资源请求处理" << endl; + cout << "4. 重新选择/输入系统数据" << endl; + cout << "5. 测试推荐资源请求" << endl; + cout << "0. 退出程序" << endl; + cout << "请选择操作:"; + } + + // 提供推荐的测试请求 + void showRecommendedRequests() { + cout << "\n=== 推荐的测试请求 ===" << endl; + + if (n == 5 && m == 3) { + // 测试数据集1的推荐请求 + cout << "当前是测试数据集1,推荐测试请求:" << endl; + cout << "1. P1请求(1,0,2) - 预期:被拒绝(超过可用资源)" << endl; + cout << "2. P4请求(3,3,0) - 预期:被拒绝(超过可用资源)" << endl; + cout << "3. P1请求(0,2,0) - 预期:可能被接受" << endl; + cout << "4. P3请求(0,1,1) - 预期:应该被接受" << endl; + } else if (n == 3 && m == 3) { + // 测试数据集2的推荐请求 + cout << "当前是测试数据集2,推荐测试请求:" << endl; + cout << "1. 任何进程的任何合理请求都会被拒绝,因为系统已经不安全" << endl; + cout << "2. P0请求(1,0,0) - 预期:被拒绝" << endl; + cout << "3. P1请求(0,1,0) - 预期:被拒绝" << endl; + } else if (n == 2 && m == 2) { + // 测试数据集3的推荐请求 + cout << "当前是测试数据集3,推荐测试请求:" << endl; + cout << "1. P0请求(2,2) - 预期:应该被接受" << endl; + cout << "2. P1请求(2,2) - 预期:应该被接受" << endl; + cout << "3. P0请求(1,1) - 预期:应该被接受" << endl; + } else { + cout << "当前是自定义数据,请根据需求矩阵和可用资源设计测试请求。" << endl; + } + } + + // 数据选择和初始化 + void initializeData() { + int choice; + showDataMenu(); + cin >> choice; + + switch (choice) { + case 1: + loadTestData1(); + break; + case 2: + loadTestData2(); + break; + case 3: + loadTestData3(); + break; + case 4: + cout << "请输入进程数量:"; + cin >> n; + cout << "请输入资源类型数量:"; + cin >> m; + + // 重新调整矩阵大小 + allocation.resize(n, vector(m, 0)); + max.resize(n, vector(m, 0)); + need.resize(n, vector(m, 0)); + available.resize(m, 0); + + inputSystemState(); + break; + default: + cout << "无效选择,使用测试数据集1" << endl; + loadTestData1(); + break; + } + } + // 运行银行家算法主程序 + void run() { + cout << "=== 银行家算法死锁避免实验 ===" << endl; + + // 数据选择和初始化 + initializeData(); + + // 显示初始状态 + displaySystemState(); + + int choice; + do { + showMenu(); + cin >> choice; + + switch (choice) { + case 1: { + displaySystemState(); + break; + } + case 2: { + vector safeSequence; + bool isSafe = safetyCheck(safeSequence); + if (isSafe) { + cout << "系统处于安全状态!" << endl; + cout << "安全序列:"; + for (int i = 0; i < safeSequence.size(); i++) { + cout << "P" << safeSequence[i]; + if (i < safeSequence.size() - 1) cout << " -> "; + } + cout << endl; + } else { + cout << "系统处于不安全状态!" << endl; + } + break; + } + case 3: { + int processId; + cout << "请输入请求资源的进程ID(0-" << n-1 << "):"; + cin >> processId; + + if (processId < 0 || processId >= n) { + cout << "无效的进程ID!" << endl; + break; + } + + vector request(m); + cout << "请输入请求的资源向量(" << m << "个值):"; + for (int i = 0; i < m; i++) { + cin >> request[i]; + } + + requestResources(processId, request); + break; + } + case 4: { + initializeData(); + displaySystemState(); + break; + } + case 5: { + showRecommendedRequests(); + break; + } + case 0: { + cout << "感谢使用银行家算法程序!" << endl; + break; + } + default: { + cout << "无效选择,请重新输入!" << endl; + break; + } + } + } while (choice != 0); + } +}; + +int main() { + // 创建银行家算法实例并运行 + BankersAlgorithm banker(0, 0); + banker.run(); + return 0; +} \ No newline at end of file diff --git a/MemoryManager.cpp b/MemoryManager.cpp new file mode 100644 index 0000000..91dc53b --- /dev/null +++ b/MemoryManager.cpp @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include + +using namespace std; + +// 分区结构体 +struct Partition { + int start; // 起始地址 + int size; // 分区大小 + bool allocated; // 是否已分配 + string process; // 进程名称(已分配分区使用) + + Partition(int s, int sz, bool alloc = false, string proc = "") + : start(s), size(sz), allocated(alloc), process(proc) {} +}; + +class MemoryManager { +private: + vector partitions; // 分区列表 + int totalMemory; // 总内存大小 + int nextFitIndex; // 下次适应算法的起始位置 + +public: + // 构造函数,初始化内存管理器 + MemoryManager(int total) : totalMemory(total), nextFitIndex(0) { + // 初始化时整个内存为一个空闲分区 + partitions.push_back(Partition(0, total, false)); + } + + // 首次适应算法分配内存 + bool firstFit(string processName, int size) { + cout << "使用首次适应算法为进程 " << processName << " 分配 " << size << " 单位内存" << endl; + + for (int i = 0; i < partitions.size(); i++) { + // 找到第一个足够大的空闲分区 + if (!partitions[i].allocated && partitions[i].size >= size) { + return allocatePartition(i, processName, size); + } + } + + cout << "分配失败:没有足够的连续空闲空间" << endl; + return false; + } + + // 下次适应算法分配内存 + bool nextFit(string processName, int size) { + cout << "使用下次适应算法为进程 " << processName << " 分配 " << size << " 单位内存" << endl; + + int startIndex = nextFitIndex; + int i = startIndex; + + // 从上次分配位置开始查找 + do { + if (!partitions[i].allocated && partitions[i].size >= size) { + nextFitIndex = i; // 更新下次查找的起始位置 + return allocatePartition(i, processName, size); + } + i = (i + 1) % partitions.size(); // 循环查找 + } while (i != startIndex); + + cout << "分配失败:没有足够的连续空闲空间" << endl; + return false; + } + + // 最佳适应算法分配内存 + bool bestFit(string processName, int size) { + cout << "使用最佳适应算法为进程 " << processName << " 分配 " << size << " 单位内存" << endl; + + int bestIndex = -1; + int minWaste = INT_MAX; + + // 查找最合适的分区(剩余空间最小) + for (int i = 0; i < partitions.size(); i++) { + if (!partitions[i].allocated && partitions[i].size >= size) { + int waste = partitions[i].size - size; + if (waste < minWaste) { + minWaste = waste; + bestIndex = i; + } + } + } + + if (bestIndex != -1) { + return allocatePartition(bestIndex, processName, size); + } + + cout << "分配失败:没有足够的连续空闲空间" << endl; + return false; + } + + // 释放指定进程的内存 + bool deallocate(string processName) { + cout << "释放进程 " << processName << " 的内存" << endl; + + bool found = false; + for (int i = 0; i < partitions.size(); i++) { + if (partitions[i].allocated && partitions[i].process == processName) { + partitions[i].allocated = false; + partitions[i].process = ""; + found = true; + cout << "成功释放进程 " << processName << " 占用的内存" << endl; + } + } + + if (found) { + mergePartitions(); // 合并相邻的空闲分区 + return true; + } + + cout << "释放失败:未找到进程 " << processName << endl; + return false; + } + + // 显示当前内存分配状态 + void displayMemoryStatus() { + cout << "\n===== 当前内存分配状态 =====" << endl; + cout << "起始地址\t大小\t状态\t\t进程名" << endl; + cout << "----------------------------------------" << endl; + + for (const auto& partition : partitions) { + cout << partition.start << "\t\t" << partition.size << "\t"; + if (partition.allocated) { + cout << "已分配\t\t" << partition.process; + } else { + cout << "空闲\t\t---"; + } + cout << endl; + } + + // 统计内存使用情况 + int usedMemory = 0; + int freeMemory = 0; + + for (const auto& partition : partitions) { + if (partition.allocated) { + usedMemory += partition.size; + } else { + freeMemory += partition.size; + } + } + + cout << "----------------------------------------" << endl; + cout << "总内存: " << totalMemory << " 单位" << endl; + cout << "已用内存: " << usedMemory << " 单位" << endl; + cout << "空闲内存: " << freeMemory << " 单位" << endl; + cout << "内存利用率: " << fixed << setprecision(2) + << (double)usedMemory / totalMemory * 100 << "%" << endl; + cout << "===========================\n" << endl; + } + +private: + // 在指定位置分配分区 + bool allocatePartition(int index, string processName, int size) { + Partition& partition = partitions[index]; + + if (partition.size == size) { + // 分区大小正好匹配,直接分配 + partition.allocated = true; + partition.process = processName; + } else { + // 分区大小大于所需大小,需要分割 + int remainingSize = partition.size - size; + + // 修改当前分区为已分配 + partition.size = size; + partition.allocated = true; + partition.process = processName; + + // 在当前分区后插入剩余的空闲分区 + partitions.insert(partitions.begin() + index + 1, + Partition(partition.start + size, remainingSize, false)); + } + + cout << "分配成功:为进程 " << processName << " 分配了 " << size << " 单位内存" << endl; + return true; + } + + // 合并相邻的空闲分区 + void mergePartitions() { + // 按起始地址排序 + sort(partitions.begin(), partitions.end(), + [](const Partition& a, const Partition& b) { + return a.start < b.start; + }); + + // 合并相邻的空闲分区 + for (int i = 0; i < partitions.size() - 1; ) { + if (!partitions[i].allocated && !partitions[i + 1].allocated && + partitions[i].start + partitions[i].size == partitions[i + 1].start) { + + // 合并两个相邻的空闲分区 + partitions[i].size += partitions[i + 1].size; + partitions.erase(partitions.begin() + i + 1); + + // 重置下次适应算法的索引 + if (nextFitIndex > i) { + nextFitIndex--; + } + } else { + i++; + } + } + } +}; + +// 显示菜单 +void displayMenu() { + cout << "\n===== 可变分区内存管理系统 =====" << endl; + cout << "1. 首次适应算法分配内存" << endl; + cout << "2. 下次适应算法分配内存" << endl; + cout << "3. 最佳适应算法分配内存" << endl; + cout << "4. 释放内存" << endl; + cout << "5. 显示内存状态" << endl; + cout << "6. 退出系统" << endl; + cout << "===============================" << endl; + cout << "请选择操作: "; +} + +int main() { + cout << "欢迎使用可变分区内存管理系统!" << endl; + cout << "请输入总内存大小: "; + + int totalMemory; + cin >> totalMemory; + + MemoryManager memManager(totalMemory); + + int choice; + string processName; + int size; + + while (true) { + displayMenu(); + cin >> choice; + + switch (choice) { + case 1: // 首次适应算法 + cout << "请输入进程名: "; + cin >> processName; + cout << "请输入需要分配的内存大小: "; + cin >> size; + memManager.firstFit(processName, size); + break; + + case 2: // 下次适应算法 + cout << "请输入进程名: "; + cin >> processName; + cout << "请输入需要分配的内存大小: "; + cin >> size; + memManager.nextFit(processName, size); + break; + + case 3: // 最佳适应算法 + cout << "请输入进程名: "; + cin >> processName; + cout << "请输入需要分配的内存大小: "; + cin >> size; + memManager.bestFit(processName, size); + break; + + case 4: // 释放内存 + cout << "请输入要释放的进程名: "; + cin >> processName; + memManager.deallocate(processName); + break; + + case 5: // 显示内存状态 + memManager.displayMemoryStatus(); + break; + + case 6: // 退出系统 + cout << "感谢使用可变分区内存管理系统,再见!" << endl; + return 0; + + default: + cout << "无效选择,请重新输入!" << endl; + break; + } + } + + return 0; +} \ No newline at end of file diff --git a/ProcessSync.cpp b/ProcessSync.cpp new file mode 100644 index 0000000..8e59ef9 --- /dev/null +++ b/ProcessSync.cpp @@ -0,0 +1,185 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +// 缓冲区大小 +const int BUFFER_SIZE = 5; +// 生产者数量 +const int PRODUCER_COUNT = 3; +// 消费者数量 +const int CONSUMER_COUNT = 2; +// 每个生产者生产的产品数量 +const int PRODUCTS_PER_PRODUCER = 10; + +// 缓冲区结构 +struct Buffer { + vector data; // 存储产品的数组 + int in; // 生产者插入位置 + int out; // 消费者取出位置 + + Buffer() : data(BUFFER_SIZE, 0), in(0), out(0) {} +}; + +// 全局变量 +Buffer buffer; // 共享缓冲区 +counting_semaphore empty_sem(BUFFER_SIZE); // 空缓冲区数量信号量 +counting_semaphore full_sem(0); // 满缓冲区数量信号量 +mutex buffer_mutex; // 缓冲区互斥锁 +mutex output_mutex; // 输出互斥锁 +int total_produced = 0; // 总生产数量 +int total_consumed = 0; // 总消费数量 + +// 打印缓冲区状态的函数 +void print_buffer_status(const string& operation, int thread_id, int product_id) { + lock_guard lock(output_mutex); + cout << operation << " 线程" << thread_id << " 产品" << product_id << endl; + cout << "缓冲区状态: ["; + for (int i = 0; i < BUFFER_SIZE; i++) { + if (i > 0) cout << ", "; + if ((buffer.out <= buffer.in && i >= buffer.out && i < buffer.in) || + (buffer.out > buffer.in && (i >= buffer.out || i < buffer.in))) { + cout << buffer.data[i]; + } else { + cout << "空"; + } + } + cout << "]" << endl; + cout << "in=" << buffer.in << ", out=" << buffer.out; + cout << ", 已生产=" << total_produced << ", 已消费=" << total_consumed << endl; + cout << "----------------------------------------" << endl; +} + +// 生产者函数 +void producer(int producer_id) { + random_device rd; + mt19937 gen(rd()); + uniform_int_distribution<> dis(100, 999); // 生成三位数产品编号 + + for (int i = 0; i < PRODUCTS_PER_PRODUCER; i++) { + // 生产产品(模拟生产时间) + this_thread::sleep_for(chrono::milliseconds(dis(gen) % 500 + 100)); + + int product = producer_id * 1000 + i + 1; // 产品编号:生产者ID*1000 + 序号 + + // P操作:等待空缓冲区 + empty_sem.acquire(); + + // P操作:获取缓冲区互斥锁 + { + lock_guard lock(buffer_mutex); + + // 将产品放入缓冲区 + buffer.data[buffer.in] = product; + buffer.in = (buffer.in + 1) % BUFFER_SIZE; + total_produced++; + + // 打印生产信息 + print_buffer_status("生产者", producer_id, product); + } + + // V操作:释放满缓冲区信号量 + full_sem.release(); + } + + { + lock_guard lock(output_mutex); + cout << "生产者" << producer_id << " 完成所有生产任务" << endl; + } +} + +// 消费者函数 +void consumer(int consumer_id) { + random_device rd; + mt19937 gen(rd()); + uniform_int_distribution<> dis(100, 999); + + // 计算每个消费者需要消费的产品数量 + int products_to_consume = (PRODUCER_COUNT * PRODUCTS_PER_PRODUCER) / CONSUMER_COUNT; + if (consumer_id < (PRODUCER_COUNT * PRODUCTS_PER_PRODUCER) % CONSUMER_COUNT) { + products_to_consume++; // 处理不能整除的情况 + } + + for (int i = 0; i < products_to_consume; i++) { + // P操作:等待满缓冲区 + full_sem.acquire(); + + int product; + // P操作:获取缓冲区互斥锁 + { + lock_guard lock(buffer_mutex); + + // 从缓冲区取出产品 + product = buffer.data[buffer.out]; + buffer.data[buffer.out] = 0; // 清空该位置 + buffer.out = (buffer.out + 1) % BUFFER_SIZE; + total_consumed++; + + // 打印消费信息 + print_buffer_status("消费者", consumer_id, product); + } + + // V操作:释放空缓冲区信号量 + empty_sem.release(); + + // 消费产品(模拟消费时间) + this_thread::sleep_for(chrono::milliseconds(dis(gen) % 300 + 150)); + } + + { + lock_guard lock(output_mutex); + cout << "消费者" << consumer_id << " 完成所有消费任务" << endl; + } +} + +int main() { + cout << "========== 多生产者多消费者多缓冲区同步实验 ==========" << endl; + cout << "缓冲区大小: " << BUFFER_SIZE << endl; + cout << "生产者数量: " << PRODUCER_COUNT << endl; + cout << "消费者数量: " << CONSUMER_COUNT << endl; + cout << "每个生产者生产产品数: " << PRODUCTS_PER_PRODUCER << endl; + cout << "总产品数量: " << PRODUCER_COUNT * PRODUCTS_PER_PRODUCER << endl; + cout << "========================================" << endl; + + // 创建生产者线程 + vector producers; + for (int i = 0; i < PRODUCER_COUNT; i++) { + producers.emplace_back(producer, i + 1); + } + + // 创建消费者线程 + vector consumers; + for (int i = 0; i < CONSUMER_COUNT; i++) { + consumers.emplace_back(consumer, i + 1); + } + + // 等待所有生产者线程结束 + for (auto& p : producers) { + p.join(); + } + + // 等待所有消费者线程结束 + for (auto& c : consumers) { + c.join(); + } + + cout << "========== 实验结束 ==========" << endl; + cout << "最终统计:" << endl; + cout << "总生产数量: " << total_produced << endl; + cout << "总消费数量: " << total_consumed << endl; + + if (total_produced == total_consumed && + total_produced == PRODUCER_COUNT * PRODUCTS_PER_PRODUCER) { + cout << "实验成功!所有产品都被正确生产和消费。" << endl; + } else { + cout << "实验异常!生产和消费数量不匹配。" << endl; + } + + return 0; +} diff --git a/build/.ninja_deps b/build/.ninja_deps new file mode 100644 index 0000000..465b881 Binary files /dev/null and b/build/.ninja_deps differ diff --git a/build/.ninja_log b/build/.ninja_log new file mode 100644 index 0000000..ff12ad4 --- /dev/null +++ b/build/.ninja_log @@ -0,0 +1,25 @@ +# ninja log v6 +6 141 7728442367360176 CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj.ddi 815eb603b90f847 +7 148 7728442367370069 CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj.ddi c3605bb22267fbaa +3 156 7728442367330182 CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj.ddi 5bb1f5a2099f2054 +142 166 7728442368928283 CMakeFiles/DeadlockAvoid.dir/CXX.dd a68f79387401aa36 +142 166 7728442368928283 D:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/DeadlockAvoid.dir/CXXModules.json a68f79387401aa36 +142 166 7728442368928283 CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj.modmap a68f79387401aa36 +148 168 7728442368948547 CMakeFiles/MemoryManager.dir/CXX.dd 9973a5b84b9e743f +148 168 7728442368948547 D:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/MemoryManager.dir/CXXModules.json 9973a5b84b9e743f +148 168 7728442368948547 CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj.modmap 9973a5b84b9e743f +156 174 7728442369008260 CMakeFiles/CPUScheduler.dir/CXX.dd 93c2c369638ddac +156 174 7728442369008260 D:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/CPUScheduler.dir/CXXModules.json 93c2c369638ddac +156 174 7728442369008260 CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj.modmap 93c2c369638ddac +5 220 7728442367350200 CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj.ddi d1c3ed997e1516bf +220 239 7728442369667015 CMakeFiles/ProcessSync.dir/CXX.dd 2630128d0025735c +220 239 7728442369667015 D:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/ProcessSync.dir/CXXModules.json 2630128d0025735c +220 239 7728442369667015 CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj.modmap 2630128d0025735c +168 803 7728442368988503 CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj 6d95d073bcf8673d +167 905 7728442368968289 CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj 88dd95a480d09c48 +174 916 7728442369050366 CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj e1acfffe2c4a16dd +806 926 7728442375358662 MemoryManager.exe 53c58cc242da530d +905 999 7728442376356262 DeadlockAvoid.exe 8a854c7dcb4b2f5 +917 1026 7728442376466136 CPUScheduler.exe 6ec96ba2dfc6bf80 +240 1402 7728442369697014 CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj 571c4449ee50ccff +1402 1488 7728442381324030 ProcessSync.exe 3901623b6c165673 diff --git a/build/build.ninja b/build/build.ninja new file mode 100644 index 0000000..45e3dfc --- /dev/null +++ b/build/build.ninja @@ -0,0 +1,305 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 4.0 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: Experiment +# Configurations: +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = D$:/Schoolwork/OperatingSystem/Experiment/build/ +# ============================================================================= +# Object build statements for EXECUTABLE target CPUScheduler + + +############################################# +# Order-only phony target for CPUScheduler + +build cmake_object_order_depends_target_CPUScheduler: phony || . + +build CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj.ddi: CXX_SCAN__CPUScheduler_ D$:/Schoolwork/OperatingSystem/Experiment/CPUScheduler.cpp || cmake_object_order_depends_target_CPUScheduler + DEP_FILE = CMakeFiles\CPUScheduler.dir\CPUScheduler.cpp.obj.ddi.d + DYNDEP_INTERMEDIATE_FILE = CMakeFiles\CPUScheduler.dir\CPUScheduler.cpp.obj.ddi + FLAGS = -std=gnu++20 + OBJ_FILE = CMakeFiles\CPUScheduler.dir\CPUScheduler.cpp.obj + PREPROCESSED_OUTPUT_FILE = CMakeFiles\CPUScheduler.dir\CPUScheduler.cpp.obj.ddi.i + +build CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj: CXX_COMPILER__CPUScheduler_scanned_ D$:/Schoolwork/OperatingSystem/Experiment/CPUScheduler.cpp | CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj.modmap || cmake_object_order_depends_target_CPUScheduler CMakeFiles/CPUScheduler.dir/CXX.dd + DEP_FILE = CMakeFiles\CPUScheduler.dir\CPUScheduler.cpp.obj.d + DYNDEP_MODULE_MAP_FILE = CMakeFiles\CPUScheduler.dir\CPUScheduler.cpp.obj.modmap + FLAGS = -std=gnu++20 + OBJECT_DIR = CMakeFiles\CPUScheduler.dir + OBJECT_FILE_DIR = CMakeFiles\CPUScheduler.dir + TARGET_COMPILE_PDB = CMakeFiles\CPUScheduler.dir\ + TARGET_PDB = CPUScheduler.pdb + dyndep = CMakeFiles/CPUScheduler.dir/CXX.dd + +build CMakeFiles/CPUScheduler.dir/CXX.dd | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/CPUScheduler.dir/CXXModules.json CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj.modmap: CXX_DYNDEP__CPUScheduler_ CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj.ddi | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/CPUScheduler.dir/CXXDependInfo.json + + +# ============================================================================= +# Link build statements for EXECUTABLE target CPUScheduler + + +############################################# +# Link the executable CPUScheduler.exe + +build CPUScheduler.exe: CXX_EXECUTABLE_LINKER__CPUScheduler_ CMakeFiles/CPUScheduler.dir/CPUScheduler.cpp.obj + LINK_LIBRARIES = -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 + OBJECT_DIR = CMakeFiles\CPUScheduler.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = CMakeFiles\CPUScheduler.dir\ + TARGET_FILE = CPUScheduler.exe + TARGET_IMPLIB = libCPUScheduler.dll.a + TARGET_PDB = CPUScheduler.pdb + +# ============================================================================= +# Object build statements for EXECUTABLE target ProcessSync + + +############################################# +# Order-only phony target for ProcessSync + +build cmake_object_order_depends_target_ProcessSync: phony || . + +build CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj.ddi: CXX_SCAN__ProcessSync_ D$:/Schoolwork/OperatingSystem/Experiment/ProcessSync.cpp || cmake_object_order_depends_target_ProcessSync + DEP_FILE = CMakeFiles\ProcessSync.dir\ProcessSync.cpp.obj.ddi.d + DYNDEP_INTERMEDIATE_FILE = CMakeFiles\ProcessSync.dir\ProcessSync.cpp.obj.ddi + FLAGS = -std=gnu++20 + OBJ_FILE = CMakeFiles\ProcessSync.dir\ProcessSync.cpp.obj + PREPROCESSED_OUTPUT_FILE = CMakeFiles\ProcessSync.dir\ProcessSync.cpp.obj.ddi.i + +build CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj: CXX_COMPILER__ProcessSync_scanned_ D$:/Schoolwork/OperatingSystem/Experiment/ProcessSync.cpp | CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj.modmap || cmake_object_order_depends_target_ProcessSync CMakeFiles/ProcessSync.dir/CXX.dd + DEP_FILE = CMakeFiles\ProcessSync.dir\ProcessSync.cpp.obj.d + DYNDEP_MODULE_MAP_FILE = CMakeFiles\ProcessSync.dir\ProcessSync.cpp.obj.modmap + FLAGS = -std=gnu++20 + OBJECT_DIR = CMakeFiles\ProcessSync.dir + OBJECT_FILE_DIR = CMakeFiles\ProcessSync.dir + TARGET_COMPILE_PDB = CMakeFiles\ProcessSync.dir\ + TARGET_PDB = ProcessSync.pdb + dyndep = CMakeFiles/ProcessSync.dir/CXX.dd + +build CMakeFiles/ProcessSync.dir/CXX.dd | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/ProcessSync.dir/CXXModules.json CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj.modmap: CXX_DYNDEP__ProcessSync_ CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj.ddi | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/ProcessSync.dir/CXXDependInfo.json + + +# ============================================================================= +# Link build statements for EXECUTABLE target ProcessSync + + +############################################# +# Link the executable ProcessSync.exe + +build ProcessSync.exe: CXX_EXECUTABLE_LINKER__ProcessSync_ CMakeFiles/ProcessSync.dir/ProcessSync.cpp.obj + LINK_LIBRARIES = -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 + OBJECT_DIR = CMakeFiles\ProcessSync.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = CMakeFiles\ProcessSync.dir\ + TARGET_FILE = ProcessSync.exe + TARGET_IMPLIB = libProcessSync.dll.a + TARGET_PDB = ProcessSync.pdb + +# ============================================================================= +# Object build statements for EXECUTABLE target DeadlockAvoid + + +############################################# +# Order-only phony target for DeadlockAvoid + +build cmake_object_order_depends_target_DeadlockAvoid: phony || . + +build CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj.ddi: CXX_SCAN__DeadlockAvoid_ D$:/Schoolwork/OperatingSystem/Experiment/DeadlockAvoid.cpp || cmake_object_order_depends_target_DeadlockAvoid + DEP_FILE = CMakeFiles\DeadlockAvoid.dir\DeadlockAvoid.cpp.obj.ddi.d + DYNDEP_INTERMEDIATE_FILE = CMakeFiles\DeadlockAvoid.dir\DeadlockAvoid.cpp.obj.ddi + FLAGS = -std=gnu++20 + OBJ_FILE = CMakeFiles\DeadlockAvoid.dir\DeadlockAvoid.cpp.obj + PREPROCESSED_OUTPUT_FILE = CMakeFiles\DeadlockAvoid.dir\DeadlockAvoid.cpp.obj.ddi.i + +build CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj: CXX_COMPILER__DeadlockAvoid_scanned_ D$:/Schoolwork/OperatingSystem/Experiment/DeadlockAvoid.cpp | CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj.modmap || cmake_object_order_depends_target_DeadlockAvoid CMakeFiles/DeadlockAvoid.dir/CXX.dd + DEP_FILE = CMakeFiles\DeadlockAvoid.dir\DeadlockAvoid.cpp.obj.d + DYNDEP_MODULE_MAP_FILE = CMakeFiles\DeadlockAvoid.dir\DeadlockAvoid.cpp.obj.modmap + FLAGS = -std=gnu++20 + OBJECT_DIR = CMakeFiles\DeadlockAvoid.dir + OBJECT_FILE_DIR = CMakeFiles\DeadlockAvoid.dir + TARGET_COMPILE_PDB = CMakeFiles\DeadlockAvoid.dir\ + TARGET_PDB = DeadlockAvoid.pdb + dyndep = CMakeFiles/DeadlockAvoid.dir/CXX.dd + +build CMakeFiles/DeadlockAvoid.dir/CXX.dd | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/DeadlockAvoid.dir/CXXModules.json CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj.modmap: CXX_DYNDEP__DeadlockAvoid_ CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj.ddi | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/DeadlockAvoid.dir/CXXDependInfo.json + + +# ============================================================================= +# Link build statements for EXECUTABLE target DeadlockAvoid + + +############################################# +# Link the executable DeadlockAvoid.exe + +build DeadlockAvoid.exe: CXX_EXECUTABLE_LINKER__DeadlockAvoid_ CMakeFiles/DeadlockAvoid.dir/DeadlockAvoid.cpp.obj + LINK_LIBRARIES = -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 + OBJECT_DIR = CMakeFiles\DeadlockAvoid.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = CMakeFiles\DeadlockAvoid.dir\ + TARGET_FILE = DeadlockAvoid.exe + TARGET_IMPLIB = libDeadlockAvoid.dll.a + TARGET_PDB = DeadlockAvoid.pdb + +# ============================================================================= +# Object build statements for EXECUTABLE target MemoryManager + + +############################################# +# Order-only phony target for MemoryManager + +build cmake_object_order_depends_target_MemoryManager: phony || . + +build CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj.ddi: CXX_SCAN__MemoryManager_ D$:/Schoolwork/OperatingSystem/Experiment/MemoryManager.cpp || cmake_object_order_depends_target_MemoryManager + DEP_FILE = CMakeFiles\MemoryManager.dir\MemoryManager.cpp.obj.ddi.d + DYNDEP_INTERMEDIATE_FILE = CMakeFiles\MemoryManager.dir\MemoryManager.cpp.obj.ddi + FLAGS = -std=gnu++20 + OBJ_FILE = CMakeFiles\MemoryManager.dir\MemoryManager.cpp.obj + PREPROCESSED_OUTPUT_FILE = CMakeFiles\MemoryManager.dir\MemoryManager.cpp.obj.ddi.i + +build CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj: CXX_COMPILER__MemoryManager_scanned_ D$:/Schoolwork/OperatingSystem/Experiment/MemoryManager.cpp | CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj.modmap || cmake_object_order_depends_target_MemoryManager CMakeFiles/MemoryManager.dir/CXX.dd + DEP_FILE = CMakeFiles\MemoryManager.dir\MemoryManager.cpp.obj.d + DYNDEP_MODULE_MAP_FILE = CMakeFiles\MemoryManager.dir\MemoryManager.cpp.obj.modmap + FLAGS = -std=gnu++20 + OBJECT_DIR = CMakeFiles\MemoryManager.dir + OBJECT_FILE_DIR = CMakeFiles\MemoryManager.dir + TARGET_COMPILE_PDB = CMakeFiles\MemoryManager.dir\ + TARGET_PDB = MemoryManager.pdb + dyndep = CMakeFiles/MemoryManager.dir/CXX.dd + +build CMakeFiles/MemoryManager.dir/CXX.dd | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/MemoryManager.dir/CXXModules.json CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj.modmap: CXX_DYNDEP__MemoryManager_ CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj.ddi | D$:/Schoolwork/OperatingSystem/Experiment/build/CMakeFiles/MemoryManager.dir/CXXDependInfo.json + + +# ============================================================================= +# Link build statements for EXECUTABLE target MemoryManager + + +############################################# +# Link the executable MemoryManager.exe + +build MemoryManager.exe: CXX_EXECUTABLE_LINKER__MemoryManager_ CMakeFiles/MemoryManager.dir/MemoryManager.cpp.obj + LINK_LIBRARIES = -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 + OBJECT_DIR = CMakeFiles\MemoryManager.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = CMakeFiles\MemoryManager.dir\ + TARGET_FILE = MemoryManager.exe + TARGET_IMPLIB = libMemoryManager.dll.a + TARGET_PDB = MemoryManager.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\Windows\system32\cmd.exe /C "cd /D D:\Schoolwork\OperatingSystem\Experiment\build && C:\msys64\ucrt64\bin\cmake.exe -E echo "No interactive CMake dialog available."" + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\Windows\system32\cmd.exe /C "cd /D D:\Schoolwork\OperatingSystem\Experiment\build && C:\msys64\ucrt64\bin\cmake.exe --regenerate-during-build -SD:\Schoolwork\OperatingSystem\Experiment -BD:\Schoolwork\OperatingSystem\Experiment\build" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build CPUScheduler: phony CPUScheduler.exe + +build DeadlockAvoid: phony DeadlockAvoid.exe + +build MemoryManager: phony MemoryManager.exe + +build ProcessSync: phony ProcessSync.exe + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: D:/Schoolwork/OperatingSystem/Experiment/build + +build codegen: phony + +# ============================================================================= + +############################################# +# Folder: D:/Schoolwork/OperatingSystem/Experiment/build + +build all: phony CPUScheduler.exe ProcessSync.exe DeadlockAvoid.exe MemoryManager.exe + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja D$:/Schoolwork/OperatingSystem/Experiment/build/cmake_install.cmake: RERUN_CMAKE | C$:/msys64/ucrt64/share/cmake/Modules/CMakeCCompiler.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeCCompilerABI.c C$:/msys64/ucrt64/share/cmake/Modules/CMakeCInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeCXXCompiler.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeCXXCompilerABI.cpp C$:/msys64/ucrt64/share/cmake/Modules/CMakeCXXInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeCommonLanguageInclude.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeCompilerIdDetection.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompilerABI.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompilerId.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompilerSupport.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineRCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineSystem.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeFindBinUtils.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeGenericSystem.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeInitializeConfigs.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeLanguageInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeNinjaFindMake.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeParseImplicitIncludeInfo.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeParseImplicitLinkInfo.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeParseLibraryArchitecture.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeRCCompiler.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeRCInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeSystem.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeSystemSpecificInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestCXXCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestCompilerCommon.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestRCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/ADSP-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/ARMCC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/ARMClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/AppleClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Borland-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Bruce-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Clang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Clang-DetermineCompilerInternal.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Compaq-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Cray-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/CrayClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Embarcadero-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Fujitsu-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GHS-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-CXX-CXXImportStd.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/HP-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/HP-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IAR-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Intel-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/LCC-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/MSVC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/NVHPC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/NVIDIA-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/OrangeC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/PGI-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/PathScale-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SCO-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SDCC-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SunPro-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/TI-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/TIClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Tasking-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Watcom-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XL-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XL-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XLClang-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/zOS-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeCLinkerInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeInspectCLinker.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeInspectCXXLinker.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/FeatureTesting.cmake C$:/msys64/ucrt64/share/cmake/Modules/Linker/GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Linker/GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Linker/GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/Windows-GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/Windows-GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/Windows-GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-Determine-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-C-ABI.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-CXX-ABI.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-Initialize.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-windres.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/WindowsPaths.cmake CMakeCache.txt CMakeFiles/4.0.2/CMakeCCompiler.cmake CMakeFiles/4.0.2/CMakeCXXCompiler.cmake CMakeFiles/4.0.2/CMakeRCCompiler.cmake CMakeFiles/4.0.2/CMakeSystem.cmake D$:/Schoolwork/OperatingSystem/Experiment/CMakeLists.txt + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build C$:/msys64/ucrt64/share/cmake/Modules/CMakeCCompiler.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeCCompilerABI.c C$:/msys64/ucrt64/share/cmake/Modules/CMakeCInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeCXXCompiler.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeCXXCompilerABI.cpp C$:/msys64/ucrt64/share/cmake/Modules/CMakeCXXInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeCommonLanguageInclude.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeCompilerIdDetection.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompilerABI.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompilerId.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineCompilerSupport.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineRCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeDetermineSystem.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeFindBinUtils.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeGenericSystem.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeInitializeConfigs.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeLanguageInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeNinjaFindMake.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeParseImplicitIncludeInfo.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeParseImplicitLinkInfo.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeParseLibraryArchitecture.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeRCCompiler.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeRCInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeSystem.cmake.in C$:/msys64/ucrt64/share/cmake/Modules/CMakeSystemSpecificInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestCXXCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestCompilerCommon.cmake C$:/msys64/ucrt64/share/cmake/Modules/CMakeTestRCCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/ADSP-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/ARMCC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/ARMClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/AppleClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Borland-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Bruce-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Clang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Clang-DetermineCompilerInternal.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Compaq-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Cray-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/CrayClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Embarcadero-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Fujitsu-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GHS-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-CXX-CXXImportStd.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/HP-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/HP-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IAR-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Intel-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/LCC-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/MSVC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/NVHPC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/NVIDIA-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/OrangeC-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/PGI-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/PathScale-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SCO-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SDCC-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SunPro-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/TI-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/TIClang-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Tasking-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/Watcom-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XL-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XL-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XLClang-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/zOS-C-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeCLinkerInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeInspectCLinker.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/CMakeInspectCXXLinker.cmake C$:/msys64/ucrt64/share/cmake/Modules/Internal/FeatureTesting.cmake C$:/msys64/ucrt64/share/cmake/Modules/Linker/GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Linker/GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Linker/GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/Windows-GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/Windows-GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Linker/Windows-GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-Determine-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-C-ABI.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-C.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-CXX-ABI.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU-CXX.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-GNU.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-Initialize.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows-windres.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/Windows.cmake C$:/msys64/ucrt64/share/cmake/Modules/Platform/WindowsPaths.cmake CMakeCache.txt CMakeFiles/4.0.2/CMakeCCompiler.cmake CMakeFiles/4.0.2/CMakeCXXCompiler.cmake CMakeFiles/4.0.2/CMakeRCCompiler.cmake CMakeFiles/4.0.2/CMakeSystem.cmake D$:/Schoolwork/OperatingSystem/Experiment/CMakeLists.txt: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all