Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //my queue, we use this to find the victim
- private Queue<Integer> q = new LinkedList<>();
- //boolean to see if the frame has been filled up (at least once)
- private boolean full = false;
- //victim page we move around
- int victimPage;
- public byte read(int logicalAddress) {
- byte data;
- int pageNumber = logicalAddress / PageSize;
- int index = logicalAddress % PageSize;
- if (q.contains(pageNumber)) { //if this page is inside the queue already
- q.remove(pageNumber);// remove it from the queue
- }
- q.offer(pageNumber);//add it back to the queue even if no page fault occurs
- if (pageTable[pageNumber] == -1) {
- pageFaultFIFO(pageNumber);
- }
- int frame = pageTable[pageNumber];
- int physicalAddress = frame * PageSize + index;
- data = RAM[physicalAddress];
- //print result
- System.out.print("Virtual address: " + logicalAddress);
- System.out.print(" Physical address: " + physicalAddress);
- System.out.println(" Value: " + data);
- return data;
- }
- private void pageFaultFIFO(int pageNumber) {
- //if we have gone through FIFO (and filled at least once) we only do the LRU by chosing a victim
- if (full) {
- pageFaults++;
- pageFaultLRU(pageNumber);
- }
- //if we still have not filled the array in ram at least once!
- if (!full) {
- pageFaults++;
- for (int i = 0; i < pageTable.length; i++) {
- if (pageTable[i] == freePos) {
- //vi har varit här en gång vi mst ersätta
- pageTable[i] = -1;
- }
- pageTable[pageNumber] = freePos;
- }
- //load page into frame number freePos
- try {
- //read data from pageFile into RAM
- pageFile.seek(pageNumber * PageSize);
- for (int b = 0; b < PageSize; b++)
- RAM[freePos * PageSize + b] = pageFile.readByte();
- } catch (IOException ex) {
- Logger.getLogger(MemoryManager.class.getName()).log(Level.SEVERE, null, ex);
- }
- freePos++;
- if (freePos == NbrOfFrames) {
- freePos = 0;
- //now its true! stop doing FIFO
- full = true;
- }
- }
- }
- private void pageFaultLRU(int pageNumber) {
- if (q.contains(pageNumber)) {
- victimPage = q.poll(); // least recently used page number (end of the queue - have been there for the longest)
- freePos = pageTable[victimPage]; //the freePos in that victim page
- pageTable[victimPage] = -1; // now that we have it saved to freePos we set it to -1 (empty)
- pageTable[pageNumber] = freePos;//give the new page the value that the old page (that was in ram) had
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement