⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 段页式1.cpp

📁 LRU最近最少使用算法
💻 CPP
字号:
// 段页式1.cpp : Defines the entry point for the console application.
//

// 段页.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
void pvisit();
void neicun();
void insertprogram();
void dch();
void dct();
int pro=0; 





struct duantable1
{       int daddress;
	    int dstate;
		int visit;
		int dlenght;
	    int pdaddress;
	};  




struct duantable3
{

	struct duantable1  duantable2[1000];

};


struct duantable3 duanstor[100];
	




struct storage
{ 
   int styple;
   int a[10];
   int size;
   int restsize;
 
};

struct storage stor[10000];










struct program
{   
	int paddress;
	int length;
	
};

struct program programnum[100];
 


struct ppages
{       int paddress;
		int pstate;
		int pused;
		int spage;

};

 struct ppduans
{ 
	struct ppages ppage1[10];   
};


struct pagetables
{  struct ppduans pduan1[256];
	};
struct pagetables pages[100];












int main(int argc, char* argv[])
{
 int choice,i,j;
    
  for(i=0;i<10000;i++)
  {  stor[i].restsize=10;
     stor[i].size=0;
	 stor[i].styple=0;
	 for(j=0;j<10;j++)
		 stor[i].a[j]=0;
  }

for(i=0;i<100;i++)
{programnum[i].length=0;
 programnum[i].paddress=0;  
}




  for(i=0;i<100;i++)
	  for(j=0;j<1000;j++)
	  {
       duanstor[i].duantable2[j].daddress=0;
       duanstor[i].duantable2[j].dlenght=0;
	   duanstor[i].duantable2[j].dstate=0;
	   duanstor[i].duantable2[j].pdaddress=0;
	   duanstor[i].duantable2[j].visit=0;
	  }

 do
 {printf("  ***************************段页式内存管理***************************\n");
  printf("          1:添加新的程序!                     2:查询当前的内存使用情况!\n");
  printf("          3:查询当前的段表基址寄存器使用情况!\n");
  printf("          4:查询当前段表的使用情况!\n");
  
  printf("          5:对某道程序进行访问!               0:退出!\n");

  printf("请选择操作:");
  scanf("%d",&choice);
  switch(choice)
  {case 1:
         insertprogram();
         break;
   case 2:
         neicun();
	     break;
   case 3:
	     dct();
	     break;
   case 4:
	     dch();
	     break;
   case 5:
	     pvisit();
	     break;
   case 0:
	     printf("退出出操作!\n");
	     break;
   default :printf("\n非法输入操作类型!请确认!\n");

  }
 }while(choice!=0);
	
 return 0;
}

void insertprogram()
{   int i,j,flag,flag1,k,h,st,big,sum,st1,p,k1;
	int psize,duancount,psize1;
	st=0;
	sum=0;
	printf("Please insert the size of program:");
	scanf("%d",&psize);
	printf("\n");
    psize1=psize;
    duancount=psize/100;///////////////////计算段数
	if(psize%100!=0)
		duancount=duancount+1;

    programnum[pro].length=duancount;
   
       
       

/////////////////////存放段///////////////////////////////
           flag1=0;flag=0;
		   
		for(i=0,flag=0;i<10000;i++)	//////////////查找足够的空间或最大的//////////
			 {  
				for(j=i;;j++)
				if(stor[j].restsize==10)
				{
					
					flag=flag+10;
                    
					if(flag>=duancount)
						break;
				}
				else
					break;

				if(flag>=duancount)
				{	flag1=flag;st=i;st1=j;break;}

				if(flag1<flag)
				{flag1=flag;st=i;st1=j;}
				    flag=0;
				    i=j;
			       
			 }

        
          programnum[pro].paddress=st;
                
              //////////////////////// 存储各个段/////////////////
        
               

			  
              
			   /////////////////////////对于足空间的段的存储//////////////
                 





            if(flag1>10)   
		    for(i=st;i<=st1;i++,st++)
			{    
				   for(j=0,k=0;j<10;j++)
				   {
			       stor[i].a[j]=1;
				    duancount--;
                      duanstor[pro].duantable2[k].daddress=st;
					  
					 if(duancount==0&&(psize%100)!=0)
					  {   big=( psize%100)/10;
					      if((( psize%100)%10)!=0)
							  big++;
						  duanstor[pro].duantable2[k].dlenght=big;
					  }
						  else
					    duanstor[pro].duantable2[k].dlenght=10;
					  duanstor[pro].duantable2[k].dstate=1;
					  duanstor[pro].duantable2[k].pdaddress=0;
					  duanstor[pro].duantable2[k].visit=0;
					  k++;
				    if(duancount==0)
						break;
				     
				   }
				   if(j!=10)
					   j++;
				   stor[i].size=j;
				   stor[i].restsize=10-j;
				   stor[i].styple=1;
				   if(duancount==0)
						break;
			   }
           else
		   { 
              for(j=0,k=0;j<10;j++)
				   {
			       stor[st].a[j]=1;
				    duancount--;
                      duanstor[pro].duantable2[k].daddress=st;
					  
					  if(duancount==0&&(psize%100)!=0)
					  {   big=( psize%100)/10;
					      if((( psize%100)%10)!=0)
							  big++;
						  duanstor[pro].duantable2[k].dlenght=big;
					  }
						  else
					    duanstor[pro].duantable2[k].dlenght=10;

					  duanstor[pro].duantable2[k].dstate=1;
					  duanstor[pro].duantable2[k].pdaddress=0;
					  duanstor[pro].duantable2[k].visit=0;
					  k++;
				    if(duancount==0)
						break;
				     
				   }
				   stor[st].size=j+1;
				   stor[st].restsize=10-j-1;
				   stor[st].styple=1;
				   
		   }
                 
			    
///////////////////cha ru ye biao /////////////////////////
               k=psize/10;
			   if(psize%10!=0)
				   k++;
			   
			         k1=k;
					    
              for(i=0,p=0,flag=0,sum=0,h=0;i<10000&&k!=0;i++,k1=k)
			   if(stor[i].styple==0)
			   if(k<10)
			   {for(j=0;j<k1;j++)
			    { sum++;
                   
                 pages[pro].pduan1[p].ppage1[j].paddress=i+j;
				 pages[pro].pduan1[p].ppage1[j].pstate=1;
				 pages[pro].pduan1[p].ppage1[j].pused=0;
				 k--;
				 stor[i].a[h]=1;
                 h++;
                
				}
			    
                stor[i].size=j;
				stor[i].restsize=10-j;
				stor[i].styple=2;
				
			   }
               else
               {
                for(j=0;j<10;j++)
			    { sum++;
                     
                 pages[pro].pduan1[p].ppage1[j].paddress=i+j;
				 pages[pro].pduan1[p].ppage1[j].pstate=1;
				 pages[pro].pduan1[p].ppage1[j].pused=0;
				 k--;
				 stor[i].a[h]=1;
                 h++;
				}
                stor[i].size=10;
				stor[i].restsize=0;
				stor[i].styple=2;
                  
       
			   }


               
/////////////////////shi ye////////////////////////////
                  sum=psize/10;
			   for(i=0,k=0,p=0;i<10000&&sum!=0;i++)
			   { if(stor[i].restsize==10)
			   {
                  pages[pro].pduan1[k].ppage1[p].pused=1;
				   pages[pro].pduan1[k].ppage1[p].spage=i;
				  stor[i].size=10;
				  stor[i].restsize=0;
				  stor[i].styple=3;
				  sum--;
                  
			   
			   if(p==9)
			   {
                 k++;p=0;

			   }
			    p++;
			   }
			   }
			   if(psize%10!=0)
			   {
                 for( ;i<10000;i++)
                     if(stor[i].restsize==10)
					 {  
                           pages[pro].pduan1[k].ppage1[p].pused=1;
				           pages[pro].pduan1[k].ppage1[p].spage=i;
				           stor[i].size=psize%10;
				           stor[i].restsize=10-psize%10;
				           stor[i].styple=3;
						   break;
				          

					 } 




			   }
                 
////////////////////////////////////////////////////////
pro++;

}



void neicun()
{int i;
 printf("类型                   已用内存                剩余内存\n");
  for(i=0;i<10000;i++)
  {
   if(stor[i].styple!=0)
   printf("%d                      %d                       %d  \n",stor[i].styple ,stor[i].size , stor[i].restsize);
   
  }

}


void dch()
{ int i;
  int p;
  printf("请输入要查询的程序号:");
  scanf("%d",&p);
  if(p>pro)
	 { printf("内存中无此程序号!\n");return;}
  printf("段地址       段表长度      段表是否装入\n");
  for(i=0;i<10000;i++)
   if(duanstor[p].duantable2[i].dlenght!=0)
    printf("%d            %d             %d\n ",duanstor[p].duantable2[i].daddress,duanstor[p].duantable2[i].dlenght,duanstor[p].duantable2[i].dstate);
	  
}



void dct()
{int i;

printf("程序号    段的首地址    段长度\n");
  for(i=0;i<100;i++)
	  if(programnum[i].length!=0)
	  printf("%d          %d             %d\n",i,programnum[i].paddress,programnum[i].length);


}


void pvisit()
{  int use,dnum,pnum,position, saddress;
  printf("请输入用户标志!段号!叶号!叶内位移!\n");
  scanf("%d%d%d%d",&use,&dnum,&pnum,&position);
  if(use>pro)
	 { printf("内存中没有此相关的的用户!出现调入新的程序!\n");return;}
  if(dnum>programnum[use].length)
     { printf("发生缺段!\n");return;}
  if(pages[use].pduan1[dnum].ppage1[pnum].pused==0)
     { printf("发生缺叶中断!\n");return;}
  if(position>10)
	   { printf("发生越界错误!\n");return;}
  else
  {    printf("%d\n",pages[use].pduan1[dnum].ppage1[pnum].paddress);
	  saddress=pages[use].pduan1[dnum].ppage1[pnum].spage*10+position;
    printf("该逻辑地址映象到的物理地址为:%d\n",saddress);

  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -