Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Two Level Page table
- if(currentEntry->secondLevelPageTable[sndLV].frameNumber != -1) {
- procTable[i].numPageHit++;
- } else {
- procTable[i].numPageFault++;
- iterFirstPage = oldestFrame->virtualPageNumber >> (secondLevelBits);
- iterSecondPage = (oldestFrame->virtualPageNumber
- << (32-secondLevelBits)) >> (32-secondLevelBits);
- iterProcess = oldestFrame->pid;
- if(iterProcess != -1) {
- while(procTable[iterProcess].firstLevelPageTable[iterFirstPage].
- secondLevelPageTable[iterSecondPage].valid == '1') {
- procTable[iterProcess].firstLevelPageTable[iterFirstPage].
- secondLevelPageTable[iterSecondPage].valid = '0';
- oldestFrame = oldestFrame->lruRight;
- iterFirstPage = (oldestFrame->virtualPageNumber) >> secondLevelBits;
- iterSecondPage = ((oldestFrame->virtualPageNumber)
- << (32-secondLevelBits)) >> (32-secondLevelBits);
- iterProcess = oldestFrame->pid;
- }
- }
- if(oldestFrame->virtualPageNumber != -1) {
- procTable[iterProcess].firstLevelPageTable[iterFirstPage].secondLevelPageTable[iterSecondPage].frameNumber = -1;
- }
- currentEntry->secondLevelPageTable[sndLV].frameNumber = oldestFrame->number;
- currentEntry->secondLevelPageTable[sndLV].valid = '1';
- oldestFrame->pid = i;
- oldestFrame->virtualPageNumber = virtualPageNumber;
- }
- oldestFrame = oldestFrame->lruRight;
- }
- // inverted Page Table
- procTable[i].ntraces++;
- access_flag = 0;
- virtualPageNumber = addr >> PAGESIZEBITS;
- hash_index = (virtualPageNumber + i) % nFrame;
- currentEntry = invertedPageTable[hash_index];
- if( currentEntry != NULL )
- procTable[i].numIHTNonNULLAcess++;
- else
- procTable[i].numIHTNULLAccess++;
- while(currentEntry != NULL) {
- procTable[i].numIHTConflictAccess++;
- if(virtualPageNumber == currentEntry->virtualPageNumber
- && i == currentEntry->pid) {
- access_flag = 1;
- procTable[i].numPageHit++;
- break;
- }
- currentEntry = currentEntry->next;
- }
- // When Page Fault Occurs
- if (access_flag != 1) {
- iterIndex = oldestFrame->virtualPageNumber;
- iterProcess = oldestFrame->pid;
- // Applying Clock LRU Algorithm to find candidate
- while(iterIndex != -1 && iterProcess != -1 &&
- procTable[iterProcess].firstLevelPageTable[iterIndex].valid == '1' ) {
- procTable[iterProcess].firstLevelPageTable[iterIndex].valid = '0';
- oldestFrame = oldestFrame->lruRight;
- iterIndex = (oldestFrame->virtualPageNumber);
- iterProcess = oldestFrame->pid;
- }
- procTable[i].numPageFault++;
- // Before allocating frame to another page, we need to eliminate mapping information
- iterIndex = oldestFrame->virtualPageNumber;
- if(iterIndex != -1 && invertedPageTable[iterIndex] != NULL) {
- if( invertedPageTable[iterIndex]->frameNumber == oldestFrame->number ) {
- prevEntry = invertedPageTable[iterIndex];
- invertedPageTable[iterIndex] = invertedPageTable[iterIndex]->next;
- free(prevEntry);
- }
- else {
- currentEntry = invertedPageTable[iterIndex];
- while(currentEntry->frameNumber != oldestFrame->number) {
- prevEntry = currentEntry;
- currentEntry = currentEntry->next;
- }
- prevEntry->next = currentEntry->next;
- free(currentEntry);
- }
- }
- //
- currentEntry =
- (struct invertedPageTableEntry*)
- malloc(sizeof(struct invertedPageTableEntry));
- currentEntry->pid = i;
- currentEntry->frameNumber = oldestFrame->number;
- currentEntry->virtualPageNumber = virtualPageNumber;
- currentEntry->next = invertedPageTable[hash_index];
- invertedPageTable[hash_index] = currentEntry;
- procTable[i].firstLevelPageTable[hash_index].valid = '1';
- oldestFrame->pid = i;
- oldestFrame->virtualPageNumber = hash_index;
- }
- oldestFrame = oldestFrame->lruRight;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement