當前位置:首頁 » 存儲配置 » 頁式存儲管理模擬

頁式存儲管理模擬

發布時間: 2022-07-15 22:22:18

1. 請求調頁存儲管理方式的模擬

整個流程挺清晰的,不過寫成代碼挺長的

2. 跪求模擬頁式存儲管理FIFO的源代碼,具體要求如下 1、 編程組織對內存管理 a) 頁面大小為1K; b) 內存分配

#include"stdio.h"

#include"malloc.h"
#include"conio.h"

#define N 16

#define num 5 /*進程分配物理塊數目*/

int A[N]={1,2,3,4,5,6,7,8,5,2,3,2,7,8,1,4}; /*頁表映像*/

typedef struct page

{ int address; /*頁面地址*/

struct page *next;

}page;

struct page *head,*run,*rear;

void jccreat() /*進程分配物理塊*/

{ int i=1;

page *p,*q;

head=(page *)malloc(sizeof(page)); p=head;

for(i=1;i<=num;i++) { q=(page *)malloc(sizeof(page));

p->next=q; q->address=0; q->next=NULL; p=q; }

rear=p;}int search(int n){

page *p;

int i=0;

p=head;

while(p->next)

{

if(p->next->address==n)

{

printf("Get it at the page %d\n",i+1);

run=p;

return 1;}

p=p->next;

i++;

}

return 0;

}

void changeOPT(int n,int position)

{

int i;

int total=0;

int flag=1;

int distance[num];

int MAX;

int order=0;

page *p,*q;

p=head->next;

q=head->next;

for(i=0;i<num;i++)

distance[i]=100;

i=0;

while(p)

{

if(p->address==0)

{flag=0;

break;}

p=p->next;

i++;

}

if(!flag)

{p->address=n;

printf("Change the page %d\n",i+1);

}

else

{

while(q)

{

for(i=position;i<N;i++)

{if(q->address==A[i])

distance[total]=i-position;}

total++;

q=q->next;

}

MAX=distance[0];

for(i=0;i<num;i++)

{

if(distance[i]>MAX)

{

MAX=distance[i];

order=i;

}

}

printf("Change the page %d\n",order+1);

i=0;

while(p)

{

if(i==order)

p->address=n;

i++;

p=p->next;

}

}

}

void changeLRU(int n)

{

int i=0;

int flag=1;

page *p,*delect;

p=head->next;

while(p)

{

if(p->address==0)

{flag=0;

p->address=n;

printf("Change the page %d\n",i+1);

break;}

p=p->next;

i++;

}

if(flag)

{

delect=head->next;

head->next=delect->next;

printf("Delect from the head, and add new to the end.\n");

delect->address=n;

rear->next=delect;

rear=delect;

rear->next=NULL;

}

}

float OPT()

{

int i;

int lose=0;

float losef;

float percent;

for(i=0;i<N;i++)

{

if(search(A[i])==0)

{

lose++;

changeOPT(A[i],i);

}

}

losef=lose;

percent=1-(losef/N);

return percent;

}

float LRU()

{

int i;

int lose=0;

float losef;

float percent;

page *p;

for(i=0;i<N;i++)

{

if(search(A[i])==0)

{

lose++;

changeLRU(A[i]);

}

else

{

p=run->next;

run->next=p->next;

rear->next=p;

rear=p;

rear->next=NULL;

printf("Move it to end of queue.\n");

}

}

losef=lose;

percent=1-(losef/N);

return percent;

}

main() /*主函數部分*/

{float percent;

int choice;

printf("Select the arithmetic:\n(1)OPT\n(2)LRU\nyour choice is:");

scanf("%d",&choice);/*選擇頁面置換演算法*/

jccreat(); /*創建進程*/

if(choice==1) /*採用OPT演算法置換*/

{percent=OPT();/*計算OPT時的缺頁率*/

printf("The percent of OPT is %f",percent);}

else if(choice==2)/*採用LRU演算法置換*/

{percent=LRU();/*計算LRU時的缺頁率*/

printf("The percent of OPT is %f",percent);}

else printf("Your choice is invalid.");

getch();

}

3. 設計一個請求頁式存儲管理方案,並編寫模擬程序實現之。

#include "utility.h"
#include "lk_queue.h"

//定義頁表結構

struct table
{
int no; //頁號
int state; //狀態位(1 表示在內存,0 表示不在內存)
int block_no; //塊號
};
void main()
{
int loc[10]; //直接用的是十進制的邏輯地址
int i,j,e;
table page_table[64];
LinkQueue <int> bno;
//隨機邏輯地址並顯示出來
cout<<"十進制的邏輯地址:";
for( i=0;i<10;i++)
{
loc[i]=rand()%640000;
cout<<loc[i]<<" ";
}
cout<<endl<<endl;
//初始化頁表
for( i=0;i<64;i++)
{
page_table[i].no=i;
page_table[i].state=0;
page_table[i].block_no=-1;
}
int a[2];
for( i=0;i<10;i++)
{
a[0]=loc[i]/1024; //計算出的頁號
a[1]=loc[i]%1024; //計算出的頁內偏移量
//找到頁表中的該頁
for( j=0;j<64;j++)
{
if(page_table[j].no==a[0]) break;
}

//該頁在內存
if(page_table[j].state==1)
{
bno.Traverse(Write); // 輸出隊列里的頁面
cout<<endl;
cout<<page_table[j].no<<' '<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl; // 輸出頁表信息
}

//該頁不在內存,FIFO演算法
if(page_table[j].state==0)
{
//內存有空閑
if(bno.Length()<5)
{
page_table[j].state=1;
page_table[j].block_no=i+10;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
cout<<endl;
cout<<page_table[j].no<<' '<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
//內存沒有空閑
else if(bno.Length()==5)
{
bno.OutQueue(e);
page_table[e].state=0;
page_table[j].state=1;
page_table[j].block_no=page_table[e].block_no;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
cout<<endl;
cout<<page_table[j].no<<』'<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
}
}
}

4. 為什麼說請求頁式管理可以實現虛擬存儲器

請求分頁式存儲管理的基本思想是:操作系統按照存儲塊的尺寸,把用戶作業地址空間劃分成頁,全部存放在磁碟上。作業運行時,只先裝入若干頁。運行過程中遇到不在內存的頁時,操作系統就把它從磁碟調入內存。這樣一來,用戶的作業地址空間無需顧及內存的大小。這與虛擬存儲器的思想是完全吻合的。所以,請求分頁式存儲管理能夠向用戶提供虛擬存儲器。

5. 操作系統:請求頁式存儲管理中頁面置換演算法的模擬設計

srand()——獲取運算隨機數(數據類型:double);
getpid()——獲取當前進程識別碼(long);
srand(10*getpid())就是產生一個10陪的隨機數。該隨機函數的種子參數是getpid(),少了10意義就不一樣了,所以不行

s=(float)319*rand()/32767/32767/2+1,是一個算術式,rand()函數是產生隨機數的一個隨機函數,float是一種數據類型,為浮點數,S就是一個隨機數乘以319除以32767/32767/2+1的值,32767是2的(16-1)次方,為什麼要減1,因為是從0開始,0到15,2的0次方是1,一直算下去,2的(16-1)次方是32767,把(float)319*rand()/32767/32767/2+1所得的值存儲在S變數里

希望採納

6. 模擬分頁式存儲管理 怎麼做

http://www.happycampus.com.cn/pages/2004/11/10/D153924.html

http://desktop.nju.e.cn/czxt/Courseware/Upload_Book/N18/200407121823/OSPPT/OSMemory/OS4page.ppt

看下以上網址

7. 請求調頁存儲管理方式的模擬,謝謝,急 啊 !

這可是hen寶貴的啊
#include <iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#define Bsize 4

typedef struct BLOCK//聲明一種新類型——物理塊類型
{
int pagenum;//頁號
int accessed;//訪問欄位,其值表示多久未被訪問

}BLOCK;

int pc;//程序計數器,用來記錄指令的序號
int n;//缺頁計數器,用來記錄缺頁的次數
static int temp[320];//用來存儲320條隨機數
BLOCK block[Bsize]; //定義一大小為4的物理塊數組
//*************************************************************
void init( ); //程序初始化函數
int findExist(int curpage);//查找物理塊中是否有該頁面
int findSpace( );//查找是否有空閑物理塊
int findReplace( );//查找應予置換的頁面
void display ( );//顯示
void suijishu( );//產生320條隨機數,顯示並存儲到temp[320]
void pagestring( );//顯示調用的頁面隊列
void OPT( );//OPT演算法
void LRU( );// LRU演算法
void FIFO( );//FIFO演算法
//*************************************************************
void init( )
{
for(int i=0;i<Bsize;i++)
{
block[i].pagenum=-1;
block[i].accessed=0;
pc=n=0;
}
}
//-------------------------------------------------------------
int findExist(int curpage)
{

for(int i=0; i<Bsize; i++)
{
if(block[i].pagenum == curpage )
return i;//檢測到內存中有該頁面,返回block中的位置
}
return -1;
}
//-------------------------------------------------------------
int findSpace( )
{
for(int i=0; i<Bsize; i++)
{
if(block[i].pagenum == -1)
return i;//找到空閑的block,返回block中的位置
}

return -1;
}
//-------------------------------------------------------------
int findReplace( )
{
int pos = 0;
for(int i=0; i<Bsize; i++)
{
if(block[i].accessed >block[pos].accessed)
pos = i;//找到應予置換頁面,返回BLOCK中位置
}
return pos;
}
//-------------------------------------------------------------
void display( )
{
for(int i=0; i<Bsize; i++)
{
if(block[i].pagenum != -1)
{ printf(" %02d",block[i].pagenum);}
}
cout<<endl;
}
//-------------------------------------------------------------
void suijishu( )
{ int flag=0;
cin>>pc;
cout<<"******按照要求產生的320個隨機數:*******"<<endl;
for(int i=0;i<320;i++)
{
temp[i]=pc;
if(flag%2==0) pc=++pc%320;
if(flag==1) pc=rand( )% (pc-1);
if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)));
flag=++flag%4;
printf(" %03d",temp[i]);
if((i+1)%10==0) cout<<endl;
}
}
//-------------------------------------------------------------
void pagestring( )
{
for(int i=0;i<320;i++)
{
printf(" %02d",temp[i]/10);
if((i+1)%10==0) cout<<endl;
}

}
//-------------------------------------------------------------
void OPT( )
{
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
{
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
{
space = findSpace ( );
if(space != -1)
{
block[space].pagenum = curpage;
display( );
n=n+1;
}
else
{
for(int k=0;k<Bsize;k++)
{
for(int j=i;j<320;j++)
{
if(block[k].pagenum!= temp[j]/10)
{
block[k].accessed = 1000;
}//將來不會用,設置為一個很大數
else
{
block[k].accessed = j;
break;

}
}
}
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;

}
}
}
cout<<"缺頁次數:"<<n<<endl;
cout<<"缺頁率:"<<(n/320.0)*100<<"%"<<endl;
}
//-------------------------------------------------------------
void LRU( )
{
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
{
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
{
space = findSpace( );
if(space != -1)
{
block[space].pagenum = curpage;
display( );
n=n+1;
}
else
{
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;

}
}
else block[exist].accessed = -1;//恢復存在的並剛訪問過的BLOCK中頁面accessed為-1
for(int j=0; j<4; j++)
{block[j].accessed++;}

}
cout<<"缺頁次數:"<<n<<endl;
cout<<"缺頁率:"<<(n/320.0)*100<<"%"<<endl;
}
//-------------------------------------------------------------
void FIFO( )
{
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
{
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;

exist = findExist(curpage);
if(exist==-1)

{
space = findSpace( );
if(space != -1)
{
block[space].pagenum = curpage;
display( );
n=n+1;
}
else
{
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
block[position].accessed--;
}
}
for(int j=0; j<Bsize; j++)
block[j].accessed++;

}
cout<<"缺頁次數:"<<n<<endl;
cout<<"缺頁率:"<<(n/320.0)*100<<"%"<<endl;
}
//*************************************************************
void main( )
{
int select;
cout<<"請輸入第一條指令號(0~320):";
suijishu( );
cout<<"*****對應的調用頁面隊列*******"<<endl;
pagestring( );
do
{
cout<<"****************************************"<<endl;
cout<<"------1:OPT 2:LRU 3:FIFO 4:退出-----"<<endl;
cout<<"****************************************"<<endl;
cout<<" 請選擇一種頁面置換演算法:";
cin>>select;
cout<<"****************************************"<<endl;
init( );

switch(select)
{
case 1:cout<<"最佳置換演算法OPT:"<<endl;
cout<<"*****************"<<endl;
OPT( );
break;
case 2:cout<<"最近最久未使用置換演算法LRU:"<<endl;
cout<<"**************************"<<endl;
LRU( );
break;
case 3:cout<<"先進先出置換演算法FIFO:"<<endl;
cout<<"*********************"<<endl;
FIFO( );
break;

default: ;
}

}while(select!=4);

}
你試試可以不,應該沒問題的
要注意這是用C++編寫的,你改一下就可以用了

熱點內容
華為電腦伺服器系統進不去提示 發布:2024-10-08 00:13:42 瀏覽:490
登錄密碼如何獲取 發布:2024-10-07 23:58:40 瀏覽:424
王者榮耀人機腳本 發布:2024-10-07 23:58:33 瀏覽:807
地標建築腳本 發布:2024-10-07 23:48:51 瀏覽:242
sqlorderby 發布:2024-10-07 23:42:13 瀏覽:958
qq秒源碼 發布:2024-10-07 23:41:37 瀏覽:471
51單片機編譯器 發布:2024-10-07 23:28:04 瀏覽:798
安卓手機陌陌封設備了怎麼搞 發布:2024-10-07 23:17:00 瀏覽:180
sql管理系統代碼 發布:2024-10-07 23:00:51 瀏覽:524
安卓什麼瀏覽器可以打開 發布:2024-10-07 23:00:51 瀏覽:121