Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <memory>
- using namespace std;
- const int cacheSize = 3;
- const int requestLength = 16;
- char request[] = {'a','a','d','e','b','b','a','c','f','d','e','a','f','b','e','c'};
- char cache[] = {'a','b','c'};
- // for reset
- char originalCache[] = {'a','b','c'};
- // character for empty page
- char emptyPage = 'X';
- class Strategy {
- public:
- Strategy(std::string name) : strategyName(name) {}
- virtual ~Strategy() = default;
- // calculate which cache place should be used
- virtual int apply(int requestIndex) = 0;
- // updates information the strategy needs
- virtual void update(int cachePlace, int requestIndex, bool cacheMiss) = 0;
- const std::string strategyName;
- };
- bool updateCache(int requestIndex, Strategy* strategy)
- {
- // calculate where to put request
- int cachePlace = strategy->apply(requestIndex);
- // proof whether its a cache hit or a cache miss
- bool isMiss = (request[requestIndex] != cache[cachePlace]) && (cache[cachePlace] != emptyPage);
- // update strategy (for example recount distances)
- strategy->update(cachePlace, requestIndex, isMiss);
- // write to cache
- cache[cachePlace] = request[requestIndex];
- return isMiss;
- }
- class FIFO : public Strategy {
- public:
- FIFO() : Strategy("FIFO")
- {
- for (int i=0; i<cacheSize; ++i) age[i] = 0;
- }
- int apply(int requestIndex) override
- {
- int oldest = 0;
- for(int i=0; i<cacheSize; ++i)
- {
- if(cache[i] == request[requestIndex])
- return i;
- else if(age[i] > age[oldest])
- oldest = i;
- }
- return oldest;
- }
- void update(int cachePos, int requestIndex, bool cacheMiss) override
- {
- // nothing changed we dont need to update the ages
- if(!cacheMiss)
- return;
- // all old pages get older, the new one get 0
- for(int i=0; i<cacheSize; ++i)
- {
- if(i != cachePos)
- age[i]++;
- else
- age[i] = 0;
- }
- }
- private:
- int age[cacheSize];
- };
- class LIFO : public Strategy {
- public:
- LIFO() : Strategy("LIFO")
- {
- for (int i=0; i<cacheSize; ++i) age[i] = 0;
- }
- int apply(int requestIndex) override
- {
- int newest = 0;
- for(int i=0; i<cacheSize; ++i)
- {
- if(cache[i] == request[requestIndex])
- return i;
- else if(age[i] < age[newest])
- newest = i;
- }
- return newest;
- }
- void update(int cachePos, int requestIndex, bool cacheMiss) override
- {
- // nothing changed we dont need to update the ages
- if(!cacheMiss)
- return;
- // all old pages get older, the new one get 0
- for(int i=0; i<cacheSize; ++i)
- {
- if(i != cachePos)
- age[i]++;
- else
- age[i] = 0;
- }
- }
- private:
- int age[cacheSize];
- };
- class LRU : public Strategy {
- public:
- LRU() : Strategy("LRU")
- {
- for (int i=0; i<cacheSize; ++i) age[i] = 0;
- }
- // here oldest mean not used the longest
- int apply(int requestIndex) override
- {
- int oldest = 0;
- for(int i=0; i<cacheSize; ++i)
- {
- if(cache[i] == request[requestIndex])
- return i;
- else if(age[i] > age[oldest])
- oldest = i;
- }
- return oldest;
- }
- void update(int cachePos, int requestIndex, bool cacheMiss) override
- {
- // all old pages get older, the used one get 0
- for(int i=0; i<cacheSize; ++i)
- {
- if(i != cachePos)
- age[i]++;
- else
- age[i] = 0;
- }
- }
- private:
- int age[cacheSize];
- };
- class LFU : public Strategy {
- public:
- LFU() : Strategy("LFU")
- {
- for (int i=0; i<cacheSize; ++i) requestFrequency[i] = 0;
- }
- int apply(int requestIndex) override
- {
- int least = 0;
- for(int i=0; i<cacheSize; ++i)
- {
- if(cache[i] == request[requestIndex])
- return i;
- else if(requestFrequency[i] < requestFrequency[least])
- least = i;
- }
- return least;
- }
- void update(int cachePos, int requestIndex, bool cacheMiss) override
- {
- if(cacheMiss)
- requestFrequency[cachePos] = 1;
- else
- ++requestFrequency[cachePos];
- }
- private:
- // how frequently was the page used
- int requestFrequency[cacheSize];
- };
- class LFD : public Strategy {
- public:
- LFD() : Strategy("LFD")
- {
- // precalc next usage before starting to fullfill requests
- for (int i=0; i<cacheSize; ++i) nextUse[i] = calcNextUse(-1, cache[i]);
- }
- int apply(int requestIndex) override
- {
- int latest = 0;
- for(int i=0; i<cacheSize; ++i)
- {
- if(cache[i] == request[requestIndex])
- return i;
- else if(nextUse[i] > nextUse[latest])
- latest = i;
- }
- return latest;
- }
- void update(int cachePos, int requestIndex, bool cacheMiss) override
- {
- nextUse[cachePos] = calcNextUse(requestIndex, cache[cachePos]);
- }
- private:
- int calcNextUse(int requestPosition, char pageItem)
- {
- for(int i = requestPosition+1; i < requestLength; ++i)
- {
- if (request[i] == pageItem)
- return i;
- }
- return requestLength + 1;
- }
- // next usage of page
- int nextUse[cacheSize];
- };
- class FWF : public Strategy {
- public:
- FWF() : Strategy("FWF")
- {
- }
- int apply(int requestIndex) override
- {
- for(int i=0; i<cacheSize; ++i)
- {
- if(cache[i] == request[requestIndex])
- return i;
- // after first empty page all others have to be empty
- else if(cache[i] == emptyPage)
- return i;
- }
- // no free pages
- return 0;
- }
- void update(int cachePos, int requestIndex, bool cacheMiss) override
- {
- // no pages free -> miss -> clear cache
- if(cacheMiss && cachePos == 0)
- {
- for(int i = 1; i < cacheSize; ++i)
- cache[i] = emptyPage;
- }
- }
- };
- int main()
- {
- Strategy* selectedStrategy[] = { new FIFO, new LIFO, new LRU, new LFU, new LFD, new FWF };
- int selectedStrat;
- cout << "Select strategie(FIFO=0,LIFO=1,LRU=2,LFU=3,LFD=4,FWF=5): ";
- cin >> selectedStrat;
- int requestNumber = 0;
- int cntMisses = 0;
- cout <<"\nStrategy: " << selectedStrategy[selectedStrat]->strategyName << endl;
- cout << "\nCache initial: (";
- for (int i=0; i < cacheSize-1; ++i) cout << cache[i] << ",";
- cout << cache[cacheSize-1] << ")\n\n";
- while(requestNumber < requestLength)
- {
- char pageItem;
- cout << "Request pageItem (a-f): ";
- cin >> pageItem;
- if(pageItem != 'a' && pageItem != 'b' && pageItem != 'c' && pageItem != 'd' && pageItem != 'e' && pageItem != 'f')
- cout << "Request ignored, use " << request[requestNumber] << endl;
- else
- request[requestNumber] = pageItem;
- cout << "Request\t";
- for (int i=0; i < cacheSize; ++i) cout << "cache " << i << "\t";
- cout << "cache miss" << endl;
- bool isMiss = updateCache(requestNumber, selectedStrategy[selectedStrat]);
- if (isMiss) ++cntMisses;
- cout << " " << request[requestNumber] << "\t";
- for (int l=0; l < cacheSize; ++l) cout << " " << cache[l] << "\t";
- cout << (isMiss ? " x" : "") << "\n" << endl;
- ++requestNumber;
- }
- cout<< "\nTotal cache misses: " << cntMisses << endl;
- for(int i=0; i<6; ++i) delete selectedStrategy[i];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement