Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. //my queue, we use this to find the victim
  2. private Queue<Integer> q = new LinkedList<>();
  3. //boolean to see if the frame has been filled up (at least once)
  4. private boolean full = false;
  5. //victim page we move around
  6. int victimPage;
  7.  
  8.  
  9.  
  10. public byte read(int logicalAddress) {
  11. byte data;
  12.  
  13. int pageNumber = logicalAddress / PageSize;
  14. int index = logicalAddress % PageSize;
  15.  
  16. if (q.contains(pageNumber)) { //if this page is inside the queue already
  17. q.remove(pageNumber);// remove it from the queue
  18. }
  19. q.offer(pageNumber);//add it back to the queue even if no page fault occurs
  20.  
  21. if (pageTable[pageNumber] == -1) {
  22. pageFaultFIFO(pageNumber);
  23.  
  24. }
  25. int frame = pageTable[pageNumber];
  26. int physicalAddress = frame * PageSize + index;
  27. data = RAM[physicalAddress];
  28.  
  29. //print result
  30. System.out.print("Virtual address: " + logicalAddress);
  31. System.out.print(" Physical address: " + physicalAddress);
  32. System.out.println(" Value: " + data);
  33. return data;
  34. }
  35.  
  36. private void pageFaultFIFO(int pageNumber) {
  37. //if we have gone through FIFO (and filled at least once) we only do the LRU by chosing a victim
  38. if (full) {
  39. pageFaults++;
  40. pageFaultLRU(pageNumber);
  41. }
  42. //if we still have not filled the array in ram at least once!
  43. if (!full) {
  44.  
  45. pageFaults++;
  46.  
  47. for (int i = 0; i < pageTable.length; i++) {
  48. if (pageTable[i] == freePos) {
  49.  
  50.  
  51. //vi har varit här en gång vi mst ersätta
  52. pageTable[i] = -1;
  53.  
  54. }
  55.  
  56. pageTable[pageNumber] = freePos;
  57.  
  58.  
  59. }
  60.  
  61.  
  62. //load page into frame number freePos
  63. try {
  64. //read data from pageFile into RAM
  65. pageFile.seek(pageNumber * PageSize);
  66. for (int b = 0; b < PageSize; b++)
  67. RAM[freePos * PageSize + b] = pageFile.readByte();
  68. } catch (IOException ex) {
  69. Logger.getLogger(MemoryManager.class.getName()).log(Level.SEVERE, null, ex);
  70. }
  71.  
  72.  
  73. freePos++;
  74.  
  75.  
  76. if (freePos == NbrOfFrames) {
  77. freePos = 0;
  78. //now its true! stop doing FIFO
  79. full = true;
  80. }
  81. }
  82.  
  83. }
  84.  
  85. private void pageFaultLRU(int pageNumber) {
  86.  
  87. if (q.contains(pageNumber)) {
  88.  
  89.  
  90. victimPage = q.poll(); // least recently used page number (end of the queue - have been there for the longest)
  91. freePos = pageTable[victimPage]; //the freePos in that victim page
  92. pageTable[victimPage] = -1; // now that we have it saved to freePos we set it to -1 (empty)
  93. pageTable[pageNumber] = freePos;//give the new page the value that the old page (that was in ram) had
  94.  
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement