嘿我回来啦!我现在在中国西南第一大港防成港!
带来了一个问题,最佳页面置换算法。
部分的页面在虚拟内存,部分在物理内存,操作系统需要访问的页面在物理内存找不到则会把物理内存的某个页面置换下来,最佳置换算法的解决方法就是看物理内存中的哪一个页面在将来最迟需要访问,就置换它。
如物理内存里是0,7,6,访问到5时产生缺页中断,检查物理内存,发现0在将来第14个访问到,显然置换0是最佳方案!我的苦恼是Optimal()函数里的循环只做了一次就退出了,见鬼。
using namespace std;
#include <iostream>
#define MAX 20
int arr[MAX]={0,7,6,5,7,4,7,3,5,4,7,4,5,6,5,7,6,0,7,6};
int tarr[MAX];
int Num=0;class Templist
{
friend class Opclass;
private:
Templist* next;
int data;
int count;
public:
Templist(){next=NULL;}
Templist(int data){this->data=data;next=NULL;}
~Templist(){}
public:
int GetCount(){return count;}
int GetData(){return data;}
Templist* GetNext(){return next;}
};class Opclass
{
private:
Templist* head;
public:
Opclass()
{
head=new Templist;
}
Opclass(int size)
{
head=new Templist;
for(int i=0;i<size;i++)
{
Templist* newnode=new Templist;
newnode->data=-1;
newnode->next=head->next;
head->next=newnode;
}
}
~Opclass(){}
void Optimal();
int Count(int data,int n);
void Display(Templist* temp);
};int Opclass::Count(int data,int n)
{
int count=0;
for(int i=n;i<MAX;i++)
{
count++;
if(arr[i]==data)
break;
}
return count;
}
void Opclass::Optimal()
{
int Max=0;
bool bl=false;
Templist *temp=head->next,*p=NULL;
for(int i=0;i<MAX;i++)
{
if(temp==NULL)
{
p=head->next;
while(p!=NULL)
{
if(p->data==arr[i])
{
bl=true;
break;
}
p=p->next;
}
if(bl==true)
continue;
p=head->next;
while(p!=NULL)
{
p->count=Count(p->data,i+1);
if(Max<p->count)
Max=p->count;
p=p->next;
}
p=head->next;
while(p!=NULL)
{
if(p->count==Max)
{
p->data=arr[i];
tarr[Num++]=i+1;
break;
}
}
}
else
{
temp->data=arr[i];
temp=temp->next;
}
cout<<\"物理块状态:\";
p=head->next;
Display(p);
}
}void Opclass::Display(Templist* temp)
{
while(temp!=NULL)
{
cout<<temp->data<<\" \";
temp=temp->next;
}
cout<<endl;
}
int main(int argc, _TCHAR* argv[])
{
Opclass opclass(3);
cout<<\"分配了3个物理块\"<<endl;
cout<<\"页面访问顺序:\";
for(int i=0;i<MAX;i++)
cout<<\"第\"<<i+1<<\":\"<<arr[i]<<\" \";
cout<<endl;
opclass.Optimal();
for(int i=0;i<Num;i++)
cout<<\"在访问第\"<<tarr[i]<<\"个页面:\"<<arr[tarr[i]-1]<<\"时发生缺页中断。\"<<endl;
cout<<\"共发生\"<<Num<<\"次页面置换!\"<<endl;
return 0;
}
[此贴子已经被作者于2007-7-11 16:19:40编辑过]