Repo management & code cleanup
This commit is contained in:
parent
7a3a6bd256
commit
f8cbf9f064
2
Assignment7/.gitignore
vendored
Normal file
2
Assignment7/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
student_out\*.out
|
||||||
|
a.out
|
7
Assignment7/.idea/runConfigurations/Test1.xml
Normal file
7
Assignment7/.idea/runConfigurations/Test1.xml
Normal 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.
@ -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,44 +94,42 @@ 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;
|
||||||
@ -135,19 +137,20 @@ int main(int argc, char** argv){
|
|||||||
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);
|
readFromAddress(logicalAddress);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
writeToAddress(logicalAddress);
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
Loading…
Reference in New Issue
Block a user