#include #include #include struct Process { int PID; int processState; //0=virgin, 1=running, 2=waiting, 3=ready, 4=terminated; std::string name; Process* parent; //procesy przedstawiają drzewo, gdzie rodzic jest procesem macierzystym std::vector children; //a dzieci jego procesami potomnymi int regA; // 4 wartości rejestrów procesora int regB; int regC; int regD; int programCounter; //wskazuje następną instrukcję do wykonania std::string programData; //kod programu //std::string programText; //kod programu Process* programPosition; bool processBlocked; Process(int ID, Process* father, std::string processName) //konstruktor procesu; { processState = 0; processBlocked = false; PID = ID; parent = father; name = processName; } }; struct Karuzela { std::vector karuzela; void AddProcess(Process* process) { karuzela.push_back(process); } }; //struct RAM //przykładowa tablica pamięci RAM //{ // int Ram[128]; // void WriteToMemory(Process* process); //}; struct ProcessManagment { Process* init = new Process(0, nullptr, "name"); //proces, który wytwarza się przy startowaniu systemu //RAM* Ram = new RAM; //tablica pamięci od zarządzania pamiecią Karuzela* Karuzela; ProcessManagment() { init->PID = 0; //uzupełnianie procesu inicjijącego init->name = "name"; init->parent = nullptr; } Process* FindProcess(int ID, Process* init) //funkcja przeszukująca drzewo procesów { if (init->PID == ID) //jeżeli ID procesu się zgadza z szukanym { return init; //koniec rekurencji, zwraca znaleziony proces w postaci wskaźnika } else { int i = 0; while(init->children[i]) //jeżeli dzieci istnieją { i++; return FindProcess(ID, init->children[i]); //wykonaj rekurencje } return nullptr; } } int FindID() //znajdywanie wolnego ID { int ID=0; while (FindProcess(ID, init)) //sprawdzanie czy ID jest juz używane { ID++; } return ID; } void AddProcess(std::string processName, int parentID = 0) { Process* virgin = new Process(FindID(), FindProcess(parentID, init), processName); //tworzenie procesu virgin->processState = 3; //status na ready FindProcess(parentID, init)->children.push_back(virgin); //dodawanie do listy potomków dla rodzimego procesu Karuzela->AddProcess(virgin); //dodawanie do kolejki dla zarządzania procesami //Ram->WriteToMemory(virgin); //wywoływanie pamięci, orzepisuje program } int Fork(Process* parent) //dodaj proces potomny { Process* child = new Process(FindID(), parent, parent->name); child->regA = parent->regA; //potomek, jest kopią procesu macierzystego, ale ma inny ID child->regB = parent->regB; child->regC = parent->regC; child->regD = parent->regD; child->programCounter = parent->programCounter; parent->children.push_back(child); Karuzela->AddProcess(child); //Ram->WriteToMemory(child); } void KillProcess(int ID) { delete FindProcess(ID, init); //usuwanie wskaźnika do procesu w drzewie } void ChangeState(int ID, int newstate) { FindProcess(ID, init)->processState = newstate; //szukanie w drzewie procesu i zmiana jego stanu } void PrintProcess(int ID) { std::cout << "Process " <PID << ": with parent ID " << FindProcess(ID, init)->parent << std::endl; } void PrintAllProcesses(int ID) { if (init->PID == ID) //jeżeli ID procesu się zgadza z szukanym { std::cout << "Process " << FindProcess(ID, init)->PID << ": with parent ID " << FindProcess(ID, init)->parent << std::endl; } else { int i = 0; while (init->children[i]) //jeżeli dzieci istnieją { std::cout << "Process " << FindProcess(init->children[i]->PID, init)->PID << ": with parent ID " << FindProcess(ID, init)->parent << std::endl; i++; } } } }; int main() { ProcessManagment list; list.AddProcess("amelia", 0); return 0; }