Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <mutex>
- #include <thread>
- #include <condition_variable>
- #include <map>
- #include <vector>
- using namespace std;
- using namespace chrono;
- const int OKVIRA_PO_PROCESU = 3;
- mutex m;
- class UpravljacMemorijom {
- private:
- int brOkvira;
- map<int, vector<int>> procesOkviri;
- map<int, vector<bool>> procesFlag;
- map<int, condition_variable> redovi;
- condition_variable cv;
- bool potrebnaZamena;
- bool zamenaUToku;
- int idProcesaMenjaza;
- int stanicaKojuTrazi;
- public:
- UpravljacMemorijom(int okviraPoProcesu) : brOkvira(okviraPoProcesu), potrebnaZamena(false), zamenaUToku(0), idProcesaMenjaza(0), stanicaKojuTrazi(0)
- {
- procesOkviri = map<int, vector<int>>(); procesFlag = map<int, vector<bool>>();
- }
- void izvrsi_proces(int id_procesa, vector<int>& naredbe) //elementi vektora naredbe su indeksi stranica koji se referenciraju u naredbi
- {
- cout << "Proces " << id_procesa << ": krenuo u izvrsavanje!" << endl;
- procesOkviri[id_procesa] = vector<int>(brOkvira);
- procesFlag[id_procesa] = vector<bool>(brOkvira);
- //redovi[id_procesa] = condition_variable;
- for (int n : naredbe)
- {
- cout << "Proces " << id_procesa << ": izvrsava svoju naredbu (" << n << ")" << endl;
- bool found = false;
- for (int i = 0; i < procesOkviri[id_procesa].size(); ++i)
- {
- if (procesOkviri[id_procesa].at(i) != n)
- {
- procesFlag[id_procesa].at(i) = false;
- }
- else
- {
- procesFlag[id_procesa].at(i) = true;
- found = true;
- break;
- }
- }
- if (found) {
- cout << "Proces " << id_procesa << ": vec je imao stranicu ucitanu, krece u izvrsavanje!" << endl;
- this_thread::sleep_for(milliseconds(300));
- }
- else {
- cout << "Proces " << id_procesa << ": nije imao stranicu ucitanu, mora da je pribavi iz memorije!" << endl;
- unique_lock<mutex> l(m);
- while (zamenaUToku) {
- cout << "Proces " << id_procesa << ": ceka na oslobadjanje kontrolera." << endl;
- cv.wait(l);
- }
- cout << "Proces " << id_procesa << ": Salje zahtev kontroleru za dobavljanje stranice" << endl;
- potrebnaZamena = true;
- idProcesaMenjaza = id_procesa;
- stanicaKojuTrazi = n;
- cout << "Proces " << id_procesa << ": ceka da se dobavi stranica" << endl;
- redovi[id_procesa].wait(l);
- cout << "Proces " << id_procesa << ": stranica mu je dobavljena. ona se budi!" << endl;
- l.unlock();
- this_thread::sleep_for(milliseconds(300));
- cout << "Proces " << id_procesa << ": ima sve potrebstine. izvrsava!" << endl;
- }
- }
- }
- void zameniStranicu()
- {
- if (!potrebnaZamena) {
- return;
- }
- cout << "VIRTUELNA MEMORIJA " << ": dobila zahtev od procesa " << idProcesaMenjaza << " i krece da trazi neki kurac (" << stanicaKojuTrazi << ")!" << endl;
- unique_lock<mutex> l(m);
- zamenaUToku = true;
- for (int i = 0; i < procesOkviri.at(idProcesaMenjaza).size(); ++i)
- {
- if (!procesFlag[idProcesaMenjaza].at(i))
- {
- procesOkviri[idProcesaMenjaza].at(i) = stanicaKojuTrazi;
- procesFlag[idProcesaMenjaza].at(i) = true;
- break;
- }
- }
- l.unlock();
- this_thread::sleep_for(milliseconds(300));
- cout << "VIRTUELNA MEMORIJA " << ": unistila se trazeci za proces " << idProcesaMenjaza << " i sada ide na lagani odmor!" << endl;
- l.lock();
- stanicaKojuTrazi = 0;
- zamenaUToku = false;
- potrebnaZamena = false;
- redovi[idProcesaMenjaza].notify_one();
- idProcesaMenjaza = 0;
- cv.notify_one();
- }
- };
- void proces(UpravljacMemorijom& um, int id_procesa, vector<int> naredbe) {
- um.izvrsi_proces(id_procesa, naredbe);
- }
- void vm(UpravljacMemorijom& um) {
- while (true) {
- um.zameniStranicu(); //zamenu stranice uvek vrsi nit vm na zahtev procesa kojem je stranica potrebna
- }
- }
- int main() {
- UpravljacMemorijom um(OKVIRA_PO_PROCESU);
- vector<int> naredbe1 = { 2,3,2,1,5,2,4,5,3,2,5,2 };
- vector<int> naredbe2 = { 1,2,3,4,5,1,2,3,4,5,1,2 };
- thread p1(proces, ref(um), 1, naredbe1);
- thread p2(proces, ref(um), 2, naredbe2);
- thread vm_thread(vm, ref(um));
- vm_thread.detach();
- p1.join();
- p2.join();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement