#include "Planista.h" PCB *running; extern PCB *troll; Planista::Planista() { for (int i = 0; i < 8; i++) { kolejka_bool.push_back(false); } r_in_q.push_back(1); } Planista::~Planista() { } void Planista::dodaj_do_kolejki(PCB &x) { if (x.Dynamic_priority == NULL) { x.Dynamic_priority = x.Priority; } int nr = x.Dynamic_priority / 4; mapa_kolejek[nr].push_back(&x); kolejka_bool.at(nr) = true; } void Planista::dzielnik_cpu() { for (int i = 0; i < 8; i++) //pętla sprawdzająca mape kolejek { for (std::list::iterator it = mapa_kolejek[i].begin(); it != mapa_kolejek[i].end(); it++) { if ((*it)->PID == 1) { } else { (*it)->CPU = (*it)->CPU / 2; } } } } void Planista::powrot_do_kolejki(PCB &x) { x.Dynamic_priority = x.Priority + (x.CPU / 2); if (x.Dynamic_priority > 31) { x.Dynamic_priority = 31; } int nr = x.Dynamic_priority / 4; mapa_kolejek[nr].push_back(&x); kolejka_bool.at(nr) = true; } void Planista::run(Tree &t) { std::vector r = t.Ready_processes(); for (int j = 0; j < r.size(); j++) { bool go = true; for (size_t i = 0; i < r_in_q.size(); i++) { if (t.Get_process(r[j]).PID == r_in_q[i]) { go = false; } } if (go == true) { //std::cout << &t.Get_process(r[j]).PID << std::endl; dodaj_do_kolejki((t).Get_process(r[j])); r_in_q.push_back(r[j]); } } int i = 0; while (kolejka_bool.at(i) == false) //sprawdzanie pierwszej dostępnej kolejki w mapie { //sprawdzanie pierwszej dostępnej kolejki w mapie if (kolejka_bool.at(i) == true) //sprawdzanie pierwszej dostępnej kolejki w mapie { //sprawdzanie pierwszej dostępnej kolejki w mapie break; //sprawdzanie pierwszej dostępnej kolejki w mapie } //sprawdzanie pierwszej dostępnej kolejki w mapie i++; if (i==7 && mapa_kolejek.at(i).size()>1 && mapa_kolejek.at(i).front()->PID == 1) { PCB *x = mapa_kolejek[i].front(); mapa_kolejek[i].pop_front(); mapa_kolejek.at(i).push_back(x); } if (i == 8) { return; } } //sprawdzanie pierwszej dostępnej kolejki w mapie //std::cout << &mapa_kolejek[i].front()->PID << "!!!" << std::endl; PCB *x = mapa_kolejek[i].front(); //std::cout << &x->PID << "!!!" << std::endl; //std::cout << &x->PID << " x " << std::endl; mapa_kolejek[i].pop_front(); if (mapa_kolejek[i].empty()) { kolejka_bool[i] = false; } running = x; running->Change_process_state(Running); //std::cout << &running->PID <<" [running run] " <PID << " [running run troll] " << std::endl; } void Planista::make_zombie(PCB &actual, Tree &t, MemoryManager &mm) { actual.Change_process_state(Zombie); actual.Change_process_state(Terminated); running = &actual; int nr = running->Priority / 4; if (mapa_kolejek[nr].empty()) { kolejka_bool[nr] = false; } t.Exit_1(running->PID, mm); } void Planista::check(/*PCB *actual,*/ Tree &t) { //std::cout << &running->PID << " [running check]" << std::endl; //std::cout << actual->PID << " [actual check] " << std::endl; if (troll->State !=Terminated) { troll->Change_process_state(Ready); running = troll; /* running = actual;*/ } //std::cout << &running->PID << " running2 " << std::endl; if (troll->State == Terminated) { running->PID = NULL; } if (running->PID == NULL) { std::cout << "Start Planisty\n"; run(t); *troll = *running; return; } if (running->PID != NULL) { std::cout << "odkladanie procesu\n"; powrot_do_kolejki(*running); dzielnik_cpu(); run(t); *troll = *running; return; } // else // { // //std::cout << "Proces w Procesorze\n"; // actual = running; // return; // } } //void Planista::act(PCB &act) { // act = running; //}