Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 KB | None | 0 0
  1. // Two Level Page table
  2.  
  3. if(currentEntry->secondLevelPageTable[sndLV].frameNumber != -1) {
  4.         procTable[i].numPageHit++;
  5.  
  6.       } else {
  7.         procTable[i].numPageFault++;
  8.  
  9.         iterFirstPage = oldestFrame->virtualPageNumber  >> (secondLevelBits);
  10.         iterSecondPage = (oldestFrame->virtualPageNumber
  11.                           << (32-secondLevelBits)) >> (32-secondLevelBits);
  12.         iterProcess = oldestFrame->pid;
  13.  
  14.         if(iterProcess != -1) {
  15.           while(procTable[iterProcess].firstLevelPageTable[iterFirstPage].
  16.                 secondLevelPageTable[iterSecondPage].valid == '1') {
  17.             procTable[iterProcess].firstLevelPageTable[iterFirstPage].
  18.               secondLevelPageTable[iterSecondPage].valid = '0';
  19.             oldestFrame = oldestFrame->lruRight;
  20.  
  21.             iterFirstPage = (oldestFrame->virtualPageNumber) >> secondLevelBits;
  22.             iterSecondPage = ((oldestFrame->virtualPageNumber)
  23.                               << (32-secondLevelBits)) >> (32-secondLevelBits);
  24.             iterProcess = oldestFrame->pid;
  25.           }
  26.         }
  27.         if(oldestFrame->virtualPageNumber != -1) {
  28.           procTable[iterProcess].firstLevelPageTable[iterFirstPage].secondLevelPageTable[iterSecondPage].frameNumber = -1;
  29.         }
  30.  
  31.         currentEntry->secondLevelPageTable[sndLV].frameNumber = oldestFrame->number;
  32.         currentEntry->secondLevelPageTable[sndLV].valid = '1';
  33.  
  34.         oldestFrame->pid = i;
  35.         oldestFrame->virtualPageNumber = virtualPageNumber;
  36.  
  37.       }
  38.  
  39.       oldestFrame = oldestFrame->lruRight;
  40.     }
  41.  
  42. // inverted Page Table
  43.  
  44.  
  45.  
  46.       procTable[i].ntraces++;
  47.       access_flag = 0;
  48.  
  49.       virtualPageNumber = addr >> PAGESIZEBITS;
  50.  
  51.       hash_index = (virtualPageNumber + i) % nFrame;
  52.  
  53.       currentEntry = invertedPageTable[hash_index];
  54.       if( currentEntry != NULL )
  55.         procTable[i].numIHTNonNULLAcess++;
  56.       else
  57.         procTable[i].numIHTNULLAccess++;
  58.  
  59.         while(currentEntry != NULL) {
  60.           procTable[i].numIHTConflictAccess++;
  61.           if(virtualPageNumber == currentEntry->virtualPageNumber
  62.              && i == currentEntry->pid) {
  63.             access_flag = 1;
  64.             procTable[i].numPageHit++;
  65.  
  66.             break;
  67.           }
  68.  
  69.           currentEntry = currentEntry->next;
  70.         }
  71.  
  72.       // When Page Fault Occurs
  73.       if (access_flag != 1) {
  74.  
  75.         iterIndex = oldestFrame->virtualPageNumber;
  76.         iterProcess = oldestFrame->pid;
  77.  
  78.         // Applying Clock LRU Algorithm to find candidate
  79.         while(iterIndex != -1 && iterProcess != -1 &&
  80.               procTable[iterProcess].firstLevelPageTable[iterIndex].valid == '1' ) {
  81.  
  82.           procTable[iterProcess].firstLevelPageTable[iterIndex].valid = '0';
  83.  
  84.           oldestFrame = oldestFrame->lruRight;
  85.           iterIndex   = (oldestFrame->virtualPageNumber);
  86.           iterProcess = oldestFrame->pid;
  87.         }
  88.  
  89.         procTable[i].numPageFault++;
  90.  
  91.         // Before allocating frame to another page, we need to eliminate mapping information
  92.         iterIndex = oldestFrame->virtualPageNumber;
  93.         if(iterIndex != -1 && invertedPageTable[iterIndex] != NULL) {
  94.           if( invertedPageTable[iterIndex]->frameNumber == oldestFrame->number ) {
  95.             prevEntry = invertedPageTable[iterIndex];
  96.             invertedPageTable[iterIndex] = invertedPageTable[iterIndex]->next;
  97.             free(prevEntry);
  98.           }
  99.           else {
  100.             currentEntry = invertedPageTable[iterIndex];
  101.             while(currentEntry->frameNumber != oldestFrame->number) {
  102.               prevEntry = currentEntry;
  103.               currentEntry = currentEntry->next;
  104.             }
  105.             prevEntry->next = currentEntry->next;
  106.             free(currentEntry);
  107.           }
  108.         }
  109.  
  110.         //
  111.         currentEntry =
  112.           (struct invertedPageTableEntry*)
  113.           malloc(sizeof(struct invertedPageTableEntry));
  114.  
  115.         currentEntry->pid = i;
  116.         currentEntry->frameNumber = oldestFrame->number;
  117.         currentEntry->virtualPageNumber = virtualPageNumber;
  118.         currentEntry->next = invertedPageTable[hash_index];
  119.         invertedPageTable[hash_index] = currentEntry;
  120.  
  121.         procTable[i].firstLevelPageTable[hash_index].valid = '1';
  122.         oldestFrame->pid = i;
  123.         oldestFrame->virtualPageNumber = hash_index;
  124.       }
  125.    
  126.       oldestFrame = oldestFrame->lruRight;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement