This commit is contained in:
Isaac Shoebottom 2023-11-25 22:12:41 -04:00
parent 29e6cbb041
commit 7a3a6bd256
11 changed files with 243 additions and 8 deletions

Binary file not shown.

View File

@ -9,19 +9,129 @@ int framesSize;
unsigned int pageFault=0;
unsigned int pageHits = 0;
unsigned int pagesSwapped = 0;
int time = 0;
typedef struct frameEntry{
unsigned int pageNumber;
int lastUsed;
bool dirty;
} frameEntry;
frameEntry* frames;
int getPageOffsetAddress(unsigned long logicalAddress){
// Last 12 bits of logical address
// Page size is 4096 bytes, and we bitwise AND with 4095 (111111111111) to get the last 12 bits
return logicalAddress & (PAGESIZE-1);
}
int getPageNumber(unsigned long logicalAddress){
// First 20 bits of logical address
// Bitwise shift right 12 bits to get the first 20 bits, as the last 12 bits are discarded
return logicalAddress >> OFFSETBITS;
}
void printPhysicalAddress(int frameID, unsigned long logicalAddress){
// printf("%lu -> %i\n",logicalAddress,frameID*PAGESIZE+getPageOffsetAddress(logicalAddress));
printf("%lu -> %i\n",logicalAddress,frameID*PAGESIZE+getPageOffsetAddress(logicalAddress));
}
double computeFormula(){
// TODO work on that
return 0.0f;
// probabilityOfNoPageFault 10 + probabilityOfMajorPageFaultWithOneCopy 1000 + probabilityOfMajorPageFaultWithTwoCopyOperations 3000
double probabilityOfNoPageFault = 1 - (double)pageFault/(pageFault+pageHits);
double probabilityOfMajorPageFaultWithOneCopy = (double)pageFault/(pageFault+pageHits)*(1-(double)pagesSwapped/pageFault);
double probabilityOfMajorPageFaultWithTwoCopyOperations = (double)pageFault/(pageFault+pageHits)*(double)pagesSwapped/pageFault;
return probabilityOfNoPageFault*10 + probabilityOfMajorPageFaultWithOneCopy*1000 + probabilityOfMajorPageFaultWithTwoCopyOperations*3000;
}
// Int so we can return the index of the frame if it is in the frames array
int isInFrames(int pageNumber){
for (int i = 0; i < framesSize; i++){
if (frames[i].pageNumber == pageNumber){
return i;
}
}
return -1;
}
int swapOut(){
// Find the least recently used frame
int leastRecentlyUsed = 0x7FFFFFFF;
int leastRecentlyUsedIndex = -1;
for (int i = 0; i < framesSize; i++){
if (frames[i].lastUsed < leastRecentlyUsed){
leastRecentlyUsed = frames[i].lastUsed;
leastRecentlyUsedIndex = i;
}
}
// Swap out is implied, so we increment pageSwapped
if (frames[leastRecentlyUsedIndex].dirty) {
pagesSwapped++;
}
return leastRecentlyUsedIndex;
}
int swapIn(int pageNumber){
// Find the first empty frame
for (int i = 0; i < framesSize; i++){
if (frames[i].pageNumber == -1){
pageFault++;
frames[i].pageNumber = pageNumber;
return i;
}
}
// If no empty frames, swap out a frame
int frameID = swapOut();
frames[frameID].pageNumber = pageNumber;
pageFault++;
return frameID;
}
void readFromAddress(unsigned long logicalAddress){
unsigned int pageNumber = getPageNumber(logicalAddress);
int frameID = isInFrames(pageNumber);
if (isInFrames(pageNumber) == -1){
frameID = swapIn(pageNumber);
}
else{
pageHits++;
}
frames[frameID].lastUsed = time;
printPhysicalAddress(frameID,logicalAddress);
}
void writeToAddress(unsigned long logicalAddress){
unsigned int pageNumber = getPageNumber(logicalAddress);
int frameID = isInFrames(pageNumber);
if (isInFrames(pageNumber) == -1){
frameID = swapIn(pageNumber);
}
else{
pageHits++;
}
frames[frameID].dirty = true;
frames[frameID].lastUsed = time;
printPhysicalAddress(frameID,logicalAddress);
}
int main(int argc, char** argv){
//Disable printf buffering
setbuf(stdout, NULL);
framesSize = atoi(argv[1]);
frames = calloc(framesSize,sizeof(frameEntry));
// Initialize frames to -1, so we can check if a frame is empty
for (int i = 0; i < framesSize; i++){
frames[i].pageNumber = -1;
frames[i].lastUsed = -1;
frames[i].dirty = false;
}
unsigned long logicalAddress;
char operation;
printf("Logical addresses -> Physical addresses:\n");
@ -29,12 +139,13 @@ int main(int argc, char** argv){
{
if (operation == 'r')
{
// readFromAddress(logicalAddress);
readFromAddress(logicalAddress);
}
else
{
// writeToAddress(logicalAddress);
writeToAddress(logicalAddress);
}
time++;
}
printf("\nStats:\nmajor page faults = %u\npage hits = %u\npages swapped out = %u\nEffective Access Time = %.3lf\n",pageFault,pageHits,pagesSwapped, computeFormula());

View File

@ -0,0 +1,14 @@
Logical addresses -> Physical addresses:
1124955998 -> 1886
794845611 -> 4523
1540976830 -> 8382
1081961846 -> 3446
1124957700 -> 7684
794845440 -> 8448
1540976645 -> 5
Stats:
major page faults = 7
page hits = 0
pages swapped out = 0
Effective Access Time = 1000.000

View File

@ -0,0 +1,15 @@
Logical addresses -> Physical addresses:
1622650073 -> 3289
1144108930 -> 1922
101027544 -> 3800
1784484492 -> 652
823378840 -> 920
197493099 -> 363
1954899097 -> 1177
530511967 -> 2143
Stats:
major page faults = 8
page hits = 0
pages swapped out = 0
Effective Access Time = 1000.000

View File

@ -0,0 +1,15 @@
Logical addresses -> Physical addresses:
1622650073 -> 3289
1144108930 -> 6018
101027544 -> 3800
1784484492 -> 4748
823378840 -> 920
197493099 -> 4459
1954899097 -> 1177
530511967 -> 6239
Stats:
major page faults = 8
page hits = 0
pages swapped out = 0
Effective Access Time = 1000.000

View File

@ -0,0 +1,14 @@
Logical addresses -> Physical addresses:
1124955998 -> 1886
794845611 -> 4523
1540976830 -> 8382
1081961846 -> 3446
1124957700 -> 7684
794845440 -> 8448
1540976645 -> 5
Stats:
major page faults = 7
page hits = 0
pages swapped out = 1
Effective Access Time = 1285.714

View File

@ -0,0 +1,15 @@
Logical addresses -> Physical addresses:
1622650073 -> 3289
1144108930 -> 1922
101027544 -> 3800
1784484492 -> 652
823378840 -> 920
197493099 -> 363
1954899097 -> 1177
530511967 -> 2143
Stats:
major page faults = 8
page hits = 0
pages swapped out = 7
Effective Access Time = 2750.000

View File

@ -0,0 +1,15 @@
Logical addresses -> Physical addresses:
1622650073 -> 3289
1144108930 -> 6018
101027544 -> 3800
1784484492 -> 4748
823378840 -> 920
197493099 -> 4459
1954899097 -> 1177
530511967 -> 6239
Stats:
major page faults = 8
page hits = 0
pages swapped out = 6
Effective Access Time = 2500.000

View File

@ -0,0 +1,15 @@
Logical addresses -> Physical addresses:
1725896583 -> 1927
1725896583 -> 1927
1725898287 -> 3631
1725894961 -> 305
1725896008 -> 1352
1725898705 -> 4049
1725898485 -> 3829
1725897033 -> 2377
Stats:
major page faults = 1
page hits = 7
pages swapped out = 0
Effective Access Time = 133.750

View File

@ -1,7 +1,14 @@
Logical addresses -> Physical addresses:
1124955998 -> 1886
794845611 -> 4523
1540976830 -> 8382
1124957700 -> 3588
1081961846 -> 7542
794845440 -> 8448
1540976645 -> 5
Stats:
major page faults = 0
page hits = 0
major page faults = 6
page hits = 1
pages swapped out = 0
Effective Access Time = 0.000
Effective Access Time = 858.571

View File

@ -0,0 +1,14 @@
Logical addresses -> Physical addresses:
1124955998 -> 1886
794845611 -> 4523
1540976830 -> 8382
1124957700 -> 3588
1081961846 -> 7542
794845440 -> 8448
1540976645 -> 5
Stats:
major page faults = 6
page hits = 1
pages swapped out = 3
Effective Access Time = 1715.714