資源簡介
編程演示三種存儲管理方式的地址換算過程:1、分頁方式的地址換算2、分段方式的地址換算3、段頁式的地址換算

代碼片段和文件信息
#include???
#include?
int?page(int?Aint?L?);
int?Segment(int?snint?sl);
int?SegPagt(int?snint?pnint?pd);
typedef?struct?segtable?
{
int?segf[256];
int?segl[256];
}segtable;
struct?segtable?st;
typedef?struct?segpagt
{
int?segf[256];
int?segl[256];
int?ptl[256];
int?pt[256];
int?pf[256];
int?pl;
}segpagt;
struct?segpagt?sp;
int?main()
{
?int?code;
?int?plpasnsdpdpn;
?//const?int?ptl?;
?int?temp;
?do{
??printf(“?????????成員:歐劍明,陳羽,任家躍\n“);
??printf(“----------------地址換算過程----------------------------\n\n“);
??printf(“??1.分頁式地址換算\n“);
??printf(“??2.分段式地址換算\n“);
??printf(“??3.段頁式地址換算\n“);
??printf(“??4.結(jié)束運行\(zhòng)n\n“);
?printf(“----------------------------------------------------------\n“);
?printf(“請輸入您的選擇:“);
?
??scanf(“%d“&code);
??switch(code)
??{
??case?1:{
???printf(“注意:請演示設(shè)定頁表長度小于256\n“);
???printf(“請輸入換算的邏輯地址:\n“);
???scanf(“%d“&pa);
???printf(“頁面大小(B):\n“);
???scanf(“%d“&pl);
??????page(papl);
??????}break;
??case?2:{
???printf(“請演示設(shè)定段表長度小于256\n“);
???printf(“請輸入邏輯地址的段號:\n“);
???scanf(“%d“&sn);
???printf(“段內(nèi)地址:\n“);
???scanf(“%d“&sd);
???Segment(snsd);
???????}break;
??case?3:{
??????
??????printf(“預(yù)設(shè)定段表長為256頁面大小為256\n“);
??printf(“請輸入邏輯地址的段號:\n“);
??????scanf(“%d“&sn);
??????printf(“頁號:\n“);
??????scanf(“%d“&pn);
??????printf(“頁內(nèi)地址:\n“);
??????scanf(“%d“&pd);
??????SegPagt(snpnpd);
??????}break;
??case?4:{}break;
??}
?}while?(code<4);
}
int?page(int?Aint?L)
{
?int?dPkdi;
?int?WD;
?int?PT[256];
?for(i=1;i<256;i++)
?{
?PT[i]=rand()?%512;//定義隨機產(chǎn)生的快號在1到512之間
?}
?P=A/L;//頁號等于邏輯地址/頁面大小
?d=A%L;//頁內(nèi)地址=邏輯地址%頁面大小
?if(P>L)?printf(“頁號大于頁表長度越界中斷\n\n“);//如果頁號大于頁表長度,輸出越界中段
?else?{
????printf(“頁號=邏輯地址/頁面大小=%d頁內(nèi)地址=邏輯地址%頁面大小=%d\n“Pd);//輸出頁號和頁內(nèi)地址
????kd=PT[P];//根據(jù)頁號隨機產(chǎn)生快號
????printf(“根據(jù)頁號%d得到塊號%d\n“Pkd);
????WD=kd*L+d;//計算物理地址的公式
????printf(“物理地址=塊號%d*頁面大小%d+頁內(nèi)地址%d\n“kdLd);//輸出物理地址=塊號*頁面大小+頁內(nèi)地址
????printf(“邏輯地址%d換算后的物理地址為%d\n\n“AWD);//輸出物理地址的結(jié)果
????return?(0);
?}
?}
int?Segment(int?snint?sd)
{
int?iwd;
for(i=0;i<255;i++)
{
st.segf[i]=rand()%255;//定義隨機產(chǎn)生段首地址為1到255之間
st.segl[i]=rand()%2048;//定義隨機產(chǎn)生段長度為1到2048之間
}
if(sn>256)?printf(“段號%d大于段表長度256越界中斷\n\n“sn);//如果段號大于段表長度,輸出越界中斷
else?if(sd>st.segl[sn])?printf(“段內(nèi)地址%d大于段長度%d越界中斷\n“sdst.segl[sn]);//如果段內(nèi)地址大于段長度,輸出越界中斷
else{
printf(“根據(jù)段號找到段首地址%d\n“st.segf[sn]);
???printf(“物理地址=段首地址%d+段內(nèi)地址%d\n“st.segf[sn]sd);?//輸出物理地址=段首地址+段內(nèi)地址
?wd=st.segf[sn]+sd;//計算物理地址的算法
?printf(“換算得到的物理地址為:%d\n\n“wd);//輸出物理地址
}
?????return?(0);
}
int?SegPagt(int?snint?pnint?pd)
{
int?iwd;
sp.pl=256;
for(i=0;i<255;i++)
{
sp.pf[i]=sp.segf[i]=rand()%26624;//定義隨機產(chǎn)生的數(shù)在1到26624之間
sp.ptl[i]=sp.segl[i]=rand()%512;//定義隨機產(chǎn)生的數(shù)在1到512之間
sp.pt[i]=rand()%256;//定義隨機產(chǎn)生的數(shù)在1到256之間
}
if(sn>256)?printf(“段號%d大于段表長度256越界中斷\n\n“sn);//如果段號大于段表長度256輸出越界中斷
else?if(pn>sp.ptl[pn])?printf(“頁號%d大于頁表長度%d越界中斷\n“pnsp.ptl[pn]);//如果頁號大于頁表長度輸出越界中斷
else?if(pd>sp.pl)?prin
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4035??2008-06-10?12:38??三種存儲管理方式的地址換算過程\play.c
?????目錄??????????0??2008-06-07?19:44??三種存儲管理方式的地址換算過程
-----------?---------??----------?-----??----
?????????????????4035????????????????????2
評論
共有 條評論