#include
#include
#include
#include
#include
using namespace std;
struct frame{
int page[8];
int count;
public:
frame(){
for(int i=0;i<8;i++){
page[i]=-1;
}
count=0;
}
bool full(){
return count==8;
}
void print(){
int i=0;
cout<
while(page[i]>=0 && i<8){
cout<
i++;
}
}
int find(int i){
for(int l=0;l<8;l++){
if(page[l]==i){
return l;
}
}
return -1;
}
int request(int i){
int k=find(i);
if(k==-1){
cout<
return push(i);
}
else{
cout<
return k;
}
print();cout<
}
int push(int i){
if(full()){
cout<
for(int l=0;l<7;l++){
page[l]=page[l+1];
}
page[7]=i;
return 7;
}
else{
cout<
page[count]=i;
count++;
return count-1;
}
}
};
struct table_node{
int page;
bool present;
};
struct table{
table_node start[16];
bool matrix[16][16];
void set_0(int i){
for(int k=0;k<16;k++){
matrix[k][i]=0;
}
}
void set_1(int i){
for(int k=0;k<16;k++){
matrix[i][k]=1;
}
}
void set(int i){
set_1(i);set_0(i);
}
table(){
for(int i=0;i<16;i++){
start[i].page=0;start[i].present=0;
}
start[0].page=2;start[0].present=1;
start[1].page=1;start[1].present=1;
start[2].page=6;start[2].present=1;
start[3].page=0;start[3].present=1;
start[4].page=4;start[4].present=1;
start[5].page=3;start[5].present=1;
start[9].page=5;start[9].present=1;
start[11].page=7;start[11].present=1;
for(i=0;i<16;i++){
for(int j=0;j<16;j++){
matrix[i][j]=0;
}
}
set(0);set(1);set(2);set(3);set(4);set(5);set(9);set(11);
}
bool isInPage(int i){
return start[i].present;
}
int line_to_int(int i){
bitset<16> temp;
for(int l=0;l<16;l++){
temp[15-l]=matrix[i][l];
}
return temp.to_ulong();
}
int find_least(){
int least=1000000;int line=0;
for(int i=0;i<16;i++){
if(start[i].present==1){
if(line_to_int(i)
line=i;least=line_to_int(i);
}
}
}
return line;
}
int request(int i){
if(isInPage(i)){
cout<
set(i);
return start[i].page;
}
else{
int release=find_least();
cout<
start[i].page=start[release].page;
start[i].present=1;
start[release].page=0;start[release].present=0;
cout<
set(i);
return start[i].page;
}
}
void print(){
for(int i=0;i<16;i++){
if(isInPage(i)){
cout<
}
}
cout<
}
};
struct node{
int pf;
bool r;
};
struct Clock{
node start[8];
int pointer;
Clock(){
for(int i=0;i<8;i++)
start[i].r=1;
start[0].pf=3;start[1].pf=1;start[2].pf=0;start[3].pf=5;start[4].pf=4;start[5].pf=9;start[6].pf=2;start[7].pf=11;
pointer=0;
}
int find(int i){
for(int l=0;l<8;l++){
if(start[l].pf==i)
return l;
}
return -1;
}
int next(int pointer){
return (pointer+1)%8;
}
int request(int i){
if(find(i)!=-1){
cout<
start[find(i)].r=1;
return find(i);
}
else{
while(start[pointer].r==1){
start[pointer].r=0;
pointer=next(pointer);
}
cout<
start[pointer].pf=i;start[pointer].r=1;
return pointer;
}
}
void print(){
for(int i=0;i<8;i++){
cout<
}
cout<
}
};
int main(){
srand(time(NULL));
cout<
int ii;cin>>ii;
int i;frame f;table t;Clock c;
switch(ii){
case 1:
cout<
for(i=0;i<30;i++){
bitset<16> b(rand());b[15]=(bool)(rand()%2);
cout<
bitset<4> bb;bb[0]=b[12];bb[1]=b[13];bb[2]=b[14];bb[3]=b[15];
int logicalAddress=bb.to_ulong();
cout<
bitset<3> head(f.request(logicalAddress));
bitset<15> reality;
for(int j=0;j<12;j++){
reality[j]=b[j];
}
for(int k=0;k<3;k++){
reality[k+12]=head[k];
}
cout<
f.print();cout<
cout<
}
break;
case 2:
cout<
for(i=0;i<30;i++){
bitset<16> b(rand());b[15]=(bool)(rand()%2);
cout<
bitset<4> bb;bb[0]=b[12];bb[1]=b[13];bb[2]=b[14];bb[3]=b[15];
int logicalAddress=bb.to_ulong();
cout<
bitset<3> head(t.request(logicalAddress));
bitset<15> reality;
for(int j=0;j<12;j++){
reality[j]=b[j];
}
for(int k=0;k<3;k++){
reality[k+12]=head[k];
}
cout<
t.print();cout<
cout<
}
break;
case 3:
cout<
for(i=0;i<30;i++){
bitset<16> b(rand());b[15]=(bool)(rand()%2);
cout<
bitset<4> bb;bb[0]=b[12];bb[1]=b[13];bb[2]=b[14];bb[3]=b[15];
int logicalAddress=bb.to_ulong();
cout<
bitset<3> head(c.request(logicalAddress));
bitset<15> reality;
for(int j=0;j<12;j++){
reality[j]=b[j];
}
for(int k=0;k<3;k++){
reality[k+12]=head[k];
}
cout<
c.print();cout<
cout<
}
break;
}
return 0;
}