Repo management & code cleanup

This commit is contained in:
Isaac Shoebottom 2023-11-25 22:32:34 -04:00
parent 7a3a6bd256
commit f8cbf9f064
13 changed files with 69 additions and 188 deletions

2
Assignment7/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
student_out\*.out
a.out

View File

@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Test1" type="CLionNativeAppRunConfigurationType" PROGRAM_PARAMS="3" REDIRECT_INPUT="true" REDIRECT_INPUT_PATH="$PROJECT_DIR$/in/algo-check.in" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment7" TARGET_NAME="all" CONFIG_NAME="all" version="1" RUN_PATH="$PROJECT_DIR$/a.out">
<method v="2">
<option name="CLION.COMPOUND.BUILD" enabled="true" />
</method>
</configuration>
</component>

Binary file not shown.

View File

@ -1,72 +1,74 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#define OFFSETBITS 12 #define OFFSETBITS 12
#define PAGESIZE (1 << OFFSETBITS) #define PAGESIZE (1 << OFFSETBITS)
#define PAGETABLEBITS 10 #define PAGETABLEBITS 10
#define ARCH 32 #define ARCH 32
int framesSize; int framesSize;
unsigned int pageFault=0; unsigned int pageFault = 0;
unsigned int pageHits = 0; unsigned int pageHits = 0;
unsigned int pagesSwapped = 0; unsigned int pagesSwapped = 0;
int time = 0; int time = 0;
typedef struct frameEntry {
typedef struct frameEntry{
unsigned int pageNumber; unsigned int pageNumber;
int lastUsed; int lastUsed;
bool dirty; bool dirty;
} frameEntry; } frameEntry;
frameEntry* frames; frameEntry *frames;
int getPageOffsetAddress(unsigned long logicalAddress){ int getPageOffsetAddress(unsigned long logicalAddress) {
// Last 12 bits of logical address // Last 12 bits of logical address
// Page size is 4096 bytes, and we bitwise AND with 4095 (111111111111) to get the last 12 bits // Page size is 4096 bytes, and we bitwise AND with 4095 (111111111111) to get the last 12 bits
return logicalAddress & (PAGESIZE-1); return logicalAddress & (PAGESIZE - 1);
} }
int getPageNumber(unsigned long logicalAddress){ int getPageNumber(unsigned long logicalAddress) {
// First 20 bits of logical address // First 20 bits of logical address
// Bitwise shift right 12 bits to get the first 20 bits, as the last 12 bits are discarded // Bitwise shift right 12 bits to get the first 20 bits, as the last 12 bits are discarded
return logicalAddress >> OFFSETBITS; return logicalAddress >> OFFSETBITS;
} }
void printPhysicalAddress(int frameID, unsigned long logicalAddress){ 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(){ double computeFormula() {
// probabilityOfNoPageFault 10 + probabilityOfMajorPageFaultWithOneCopy 1000 + probabilityOfMajorPageFaultWithTwoCopyOperations 3000 // probabilityOfNoPageFault 10 + probabilityOfMajorPageFaultWithOneCopy 1000 + probabilityOfMajorPageFaultWithTwoCopyOperations 3000
double probabilityOfNoPageFault = 1 - (double)pageFault/(pageFault+pageHits); double probabilityOfNoPageFault = 1 - (double) pageFault / (pageFault + pageHits);
double probabilityOfMajorPageFaultWithOneCopy = (double)pageFault/(pageFault+pageHits)*(1-(double)pagesSwapped/pageFault); double probabilityOfMajorPageFaultWithOneCopy = (double) pageFault / (pageFault + pageHits) * (1 - (double) pagesSwapped / pageFault);
double probabilityOfMajorPageFaultWithTwoCopyOperations = (double)pageFault/(pageFault+pageHits)*(double)pagesSwapped/pageFault; double probabilityOfMajorPageFaultWithTwoCopyOperations = (double) pageFault / (pageFault + pageHits) * (double) pagesSwapped / pageFault;
return probabilityOfNoPageFault*10 + probabilityOfMajorPageFaultWithOneCopy*1000 + probabilityOfMajorPageFaultWithTwoCopyOperations*3000; 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 so we can return the index of the frame if it is in the frames array
int isInFrames(int pageNumber){ int isInFrames(int pageNumber) {
for (int i = 0; i < framesSize; i++){ for (int i = 0; i < framesSize; i++) {
if (frames[i].pageNumber == pageNumber){ if (frames[i].pageNumber == pageNumber) {
return i; return i;
} }
} }
return -1; return -1;
} }
int swapOut(){ // Swap out the least recently used frame
// Returns the index of the frame that was swapped out
int swapOut() {
// Find the least recently used frame // Find the least recently used frame
int leastRecentlyUsed = 0x7FFFFFFF; int leastRecentlyUsed = 0x7FFFFFFF;
int leastRecentlyUsedIndex = -1; int leastRecentlyUsedIndex = -1;
for (int i = 0; i < framesSize; i++){ for (int i = 0; i < framesSize; i++) {
if (frames[i].lastUsed < leastRecentlyUsed){ if (frames[i].lastUsed < leastRecentlyUsed) {
leastRecentlyUsed = frames[i].lastUsed; leastRecentlyUsed = frames[i].lastUsed;
leastRecentlyUsedIndex = i; leastRecentlyUsedIndex = i;
} }
} }
// Swap out is implied, so we increment pageSwapped // Swap out is implied, so we increment pageSwapped
// If the frame is dirty, we need to write it to disk, so we increment pagesSwapped
if (frames[leastRecentlyUsedIndex].dirty) { if (frames[leastRecentlyUsedIndex].dirty) {
pagesSwapped++; pagesSwapped++;
} }
@ -74,10 +76,12 @@ int swapOut(){
return leastRecentlyUsedIndex; return leastRecentlyUsedIndex;
} }
int swapIn(int pageNumber){ // Swap in a page
// Returns the index of the frame that was swapped in
int swapIn(int pageNumber) {
// Find the first empty frame // Find the first empty frame
for (int i = 0; i < framesSize; i++){ for (int i = 0; i < framesSize; i++) {
if (frames[i].pageNumber == -1){ if (frames[i].pageNumber == -1) {
pageFault++; pageFault++;
frames[i].pageNumber = pageNumber; frames[i].pageNumber = pageNumber;
return i; return i;
@ -90,64 +94,63 @@ int swapIn(int pageNumber){
return frameID; return frameID;
} }
// Read from an address
void readFromAddress(unsigned long logicalAddress) {
void readFromAddress(unsigned long logicalAddress){
unsigned int pageNumber = getPageNumber(logicalAddress); unsigned int pageNumber = getPageNumber(logicalAddress);
int frameID = isInFrames(pageNumber); int frameID = isInFrames(pageNumber);
if (isInFrames(pageNumber) == -1){ if (isInFrames(pageNumber) == -1) {
frameID = swapIn(pageNumber); frameID = swapIn(pageNumber);
} } else {
else{
pageHits++; pageHits++;
} }
frames[frameID].lastUsed = time; frames[frameID].lastUsed = time;
printPhysicalAddress(frameID,logicalAddress); printPhysicalAddress(frameID, logicalAddress);
} }
void writeToAddress(unsigned long logicalAddress){ // Write to an address, only difference is that we set the dirty bit to true
void writeToAddress(unsigned long logicalAddress) {
unsigned int pageNumber = getPageNumber(logicalAddress); unsigned int pageNumber = getPageNumber(logicalAddress);
int frameID = isInFrames(pageNumber); int frameID = isInFrames(pageNumber);
if (isInFrames(pageNumber) == -1){ if (isInFrames(pageNumber) == -1) {
frameID = swapIn(pageNumber); frameID = swapIn(pageNumber);
} } else {
else{
pageHits++; pageHits++;
} }
frames[frameID].dirty = true; frames[frameID].dirty = true;
frames[frameID].lastUsed = time; frames[frameID].lastUsed = time;
printPhysicalAddress(frameID,logicalAddress); printPhysicalAddress(frameID, logicalAddress);
} }
int main(int argc, char** argv){ int main(int argc, char **argv) {
//Disable printf buffering //Disable printf buffering for easier debugging
setbuf(stdout, NULL); setbuf(stdout, NULL);
framesSize = atoi(argv[1]); framesSize = atoi(argv[1]);
frames = calloc(framesSize,sizeof(frameEntry)); frames = calloc(framesSize, sizeof(frameEntry));
// Initialize frames to -1, so we can check if a frame is empty // Initialize frames to -1, so we can check if a frame is empty
for (int i = 0; i < framesSize; i++){ for (int i = 0; i < framesSize; i++) {
frames[i].pageNumber = -1; frames[i].pageNumber = -1;
frames[i].lastUsed = -1; frames[i].lastUsed = -1;
frames[i].dirty = false; frames[i].dirty = false;
} }
unsigned long logicalAddress; unsigned long logicalAddress;
char operation; char operation;
printf("Logical addresses -> Physical addresses:\n"); printf("Logical addresses -> Physical addresses:\n");
while(EOF != scanf("%c %lu\n",&operation,&logicalAddress) ) while (EOF != scanf("%c %lu\n", &operation, &logicalAddress)) {
{ if (operation == 'r') {
if (operation == 'r') readFromAddress(logicalAddress);
{ } else {
readFromAddress(logicalAddress); writeToAddress(logicalAddress);
} }
else
{
writeToAddress(logicalAddress);
}
time++; time++;
} }
printf("\nStats:\nmajor page faults = %u\npage hits = %u\npages swapped out = %u\nEffective Access Time = %.3lf\n",pageFault,pageHits,pagesSwapped, computeFormula()); printf("\nStats:\nmajor page faults = %u\npage hits = %u\npages swapped out = %u\nEffective Access Time = %.3lf\n",
return 0; pageFault,
pageHits,
pagesSwapped,
computeFormula()
);
return EXIT_SUCCESS;
} }

View File

@ -1,14 +0,0 @@
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

@ -1,15 +0,0 @@
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

@ -1,15 +0,0 @@
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

@ -1,14 +0,0 @@
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

@ -1,15 +0,0 @@
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

@ -1,15 +0,0 @@
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

@ -1,15 +0,0 @@
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,14 +0,0 @@
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 = 0
Effective Access Time = 858.571

View File

@ -1,14 +0,0 @@
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