課程設(shè)計(jì):三種存儲(chǔ)管理方式的地址換算_第1頁(yè)
課程設(shè)計(jì):三種存儲(chǔ)管理方式的地址換算_第2頁(yè)
課程設(shè)計(jì):三種存儲(chǔ)管理方式的地址換算_第3頁(yè)
課程設(shè)計(jì):三種存儲(chǔ)管理方式的地址換算_第4頁(yè)
課程設(shè)計(jì):三種存儲(chǔ)管理方式的地址換算_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

摘要分頁(yè)存儲(chǔ)管理是將一個(gè)進(jìn)程的邏輯地址空間分成若干個(gè)大小相等的片,稱為頁(yè)面或頁(yè),并為各頁(yè)加以編號(hào),從0開(kāi)始,相應(yīng)地,也把內(nèi)存空間分成與頁(yè)面相同大小的若干個(gè)存儲(chǔ)塊,稱為(物理)塊或頁(yè)框(frame),也同樣為它們加以編號(hào)。在分段存儲(chǔ)管理方式中,作業(yè)的地址空間被劃分為若干個(gè)段,每個(gè)段定義了一組邏輯信息。每個(gè)段都從0開(kāi)始編址,并采用一段連續(xù)的地址空間。段的長(zhǎng)度由相應(yīng)的邏輯信息組的長(zhǎng)度決定,因而各段長(zhǎng)度不等。整個(gè)作業(yè)的地址空間由于是分成多個(gè)段,因而是二維的,亦即,其邏輯地址由段號(hào)(段名)和段內(nèi)地址所組成。段頁(yè)式系統(tǒng)的基本原理,是基本分段存儲(chǔ)管理方式和基本分頁(yè)存儲(chǔ)管理方式原理的結(jié)合,即先將用戶程序分成若干個(gè)段,再把每個(gè)段分成若干個(gè)頁(yè),并為每一個(gè)段賦予一個(gè)段名。

目錄1概述 4(一) 分頁(yè)存儲(chǔ)管理方式的作用: 4(二) 分段存儲(chǔ)管理方式的作用: 4(三) 段頁(yè)式存儲(chǔ)管理方式的作用 42.課程設(shè)計(jì)任務(wù)及要求 52.1設(shè)計(jì)任務(wù) 52.2設(shè)計(jì)要求 5(一) 分頁(yè)方式的地址換算。具體要求: 5隨機(jī)生成頁(yè)面大小,但一定為2的冪,系統(tǒng)隨機(jī)生成一個(gè)至少有10行的頁(yè)表,頁(yè)號(hào)、塊號(hào)從0開(kāi)始。 5分段方式的地址換算。具體要求: 5(二) 段頁(yè)式的地址換算。具體要求: 53.算法及數(shù)據(jù)結(jié)構(gòu) 63.1算法的總體思想 63.2數(shù)據(jù)結(jié)構(gòu)模塊 63.3分頁(yè)方式的地址換算模塊 73.4分段方式的地址換算模塊 93.5段頁(yè)方式的地址換算模塊 103.6主函數(shù)模塊 124.程序設(shè)計(jì)與實(shí)現(xiàn) 144.1程序流程圖 145.結(jié)論 246.收獲、體會(huì)和建議 257.參考文獻(xiàn) 261概述分頁(yè)存儲(chǔ)管理方式的作用:頁(yè)表的功能可以由一組專(zhuān)門(mén)的寄存器來(lái)實(shí)現(xiàn)。一個(gè)頁(yè)表項(xiàng)用一個(gè)寄存器。由于寄存器具有較高的訪問(wèn)速度,因而有利于提高地址變換的速度;在分頁(yè)系統(tǒng)中,選擇過(guò)小的頁(yè)面大小,可以減少內(nèi)存碎片,起到減少內(nèi)存碎片總空間的作用,有利于內(nèi)存利用率的提高。分段存儲(chǔ)管理方式的作用:方便編程信息共享在實(shí)現(xiàn)對(duì)程序和數(shù)據(jù)的共享時(shí),是以信息的邏輯單位為基礎(chǔ)的。段是信息的邏輯單位。由此可知,為了實(shí)現(xiàn)段的共享,希望存儲(chǔ)管理能與用戶程序分段的組織方式相適應(yīng)。信息保護(hù)信息保護(hù)同樣是對(duì)信息的邏輯單位進(jìn)行保護(hù),因此,分段管理方式能更有效和方便地實(shí)現(xiàn)信息保護(hù)功能。動(dòng)態(tài)增長(zhǎng)在實(shí)際應(yīng)用中,往往有些段,特別是數(shù)據(jù)段,在使用過(guò)程中會(huì)不斷地增長(zhǎng),而事先又無(wú)法確切地知道數(shù)據(jù)段會(huì)增長(zhǎng)到多大。分段存儲(chǔ)管理方式能較好地解決這一問(wèn)題。動(dòng)態(tài)鏈接動(dòng)態(tài)鏈接是指在作業(yè)運(yùn)行之前,并不把幾個(gè)目標(biāo)程序段鏈接起來(lái)。要運(yùn)行時(shí),先將主程序所對(duì)應(yīng)的目標(biāo)程序裝入內(nèi)存并啟動(dòng)運(yùn)行,當(dāng)運(yùn)行過(guò)程中又需要調(diào)用某段時(shí),才將該段(目標(biāo)程序)調(diào)入內(nèi)存并進(jìn)行鏈接??梢?jiàn),動(dòng)態(tài)鏈接也要求以段作為管理的單位。段頁(yè)式存儲(chǔ)管理方式的作用分頁(yè)系統(tǒng)以頁(yè)面作為內(nèi)存分配的基本單位,能夠有效地提高內(nèi)存利用率,而分段系統(tǒng)以段作為內(nèi)存分配的基本單位,他能夠更好地滿足用戶多方面的需要。如果能對(duì)兩種存儲(chǔ)管理方式“各取所長(zhǎng)”,則可形成一種新的存儲(chǔ)器管理方式——段頁(yè)式存儲(chǔ)管理方式。這種新的系統(tǒng)既具有分段系統(tǒng)的便于實(shí)現(xiàn)、分段可共享、易于保護(hù)、可動(dòng)態(tài)鏈接等一系列優(yōu)點(diǎn),又能像分頁(yè)系統(tǒng)那樣,很好地解決內(nèi)存的外部碎片問(wèn)題。

2.課程設(shè)計(jì)任務(wù)及要求2.1設(shè)計(jì)任務(wù)日期陳國(guó)毅盧耀榮星期三下午閱讀書(shū)本關(guān)于3種算法轉(zhuǎn)換閱讀書(shū)本關(guān)于3種算法轉(zhuǎn)換星期四上午在網(wǎng)上查閱相關(guān)資料參考網(wǎng)上相關(guān)資料星期四下午開(kāi)始嘗試編寫(xiě)分頁(yè)方式地址換算開(kāi)始嘗試編寫(xiě)分段方式地址換算星期五上午和隊(duì)員討論,開(kāi)始實(shí)現(xiàn)完整的分頁(yè)方式算法編寫(xiě)且繼續(xù)查閱相關(guān)資料,并一起研究編寫(xiě)段頁(yè)式方式的換算算法編寫(xiě)和隊(duì)員討論,開(kāi)始實(shí)現(xiàn)完整的分段方式算法編寫(xiě)且繼續(xù)查閱相關(guān)資料,并一起研究編寫(xiě)段頁(yè)式方式的換算算法編寫(xiě)星期五下午討論和修改相關(guān)代碼,優(yōu)化算法,得到最終代碼,并共同編寫(xiě)文檔討論和修改相關(guān)代碼,并且優(yōu)化算法,得到最終代碼并共同編寫(xiě)文檔,2.2設(shè)計(jì)要求分頁(yè)方式的地址換算。具體要求:隨機(jī)生成頁(yè)面大小,但一定為2的冪,系統(tǒng)隨機(jī)生成一個(gè)至少有10行的頁(yè)表,頁(yè)號(hào)、塊號(hào)從0開(kāi)始。用戶給定一個(gè)邏輯地址,首先顯示此地址的頁(yè)號(hào)和頁(yè)內(nèi)地址,然后顯示是第幾塊,最后顯示其物理地址。分段方式的地址換算。具體要求:由系統(tǒng)隨機(jī)生成5個(gè)左右的段,并隨機(jī)生成一個(gè)段表并顯示。由用戶給定一個(gè)邏輯地址,包括段號(hào)和段內(nèi)地址,最后顯示其物理地址。段頁(yè)式的地址換算。具體要求:先由系統(tǒng)隨機(jī)生成5個(gè)左右的段,然后再由系統(tǒng)隨機(jī)生成頁(yè)面大小,但一定為2的冪。然后生成段表和頁(yè)表。由用戶給定一個(gè)邏輯地址,包括段號(hào)和段內(nèi)地址,最后顯示其物理地址。3.算法及數(shù)據(jù)結(jié)構(gòu)3.1算法的總體思想3.2數(shù)據(jù)結(jié)構(gòu)模塊3.2.1功能進(jìn)程的結(jié)構(gòu)體聲明與函數(shù)的聲明3.2.2數(shù)據(jù)結(jié)構(gòu)intflag;//分配狀態(tài),1為已分配,0為未分配intallo;//頁(yè)數(shù)intr;//隨機(jī)數(shù)intl_addr;//邏輯地址intp_addr;//物理地址intpnum,mnum;//頁(yè)號(hào)、內(nèi)存塊號(hào)intaddr;//頁(yè)內(nèi)地址intmemsize;//內(nèi)存容量 intz;//隨機(jī)數(shù)Memory*memory;//內(nèi)存地址PageTable*page;//頁(yè)表地址intnum;//段表長(zhǎng)intl_addr;//段內(nèi)編移intp_addr;//物理地址intsnum;//段號(hào)SegTable*seg;//段表地址3.3分頁(yè)方式的地址換算模塊3.3.1功能隨機(jī)生成頁(yè)面大小,但一定為2的冪,系統(tǒng)隨機(jī)生成一個(gè)至少有10行的頁(yè)表,頁(yè)號(hào)、塊號(hào)從0開(kāi)始。用戶給定一個(gè)邏輯地址,首先顯示此地址的頁(yè)號(hào)和頁(yè)內(nèi)地址,然后顯示是第幾塊,最后顯示其物理地址。3.3.2數(shù)據(jù)結(jié)構(gòu)voidpageTra()//分頁(yè)方式的地址換算3.3.3算法voidpageTra()//分頁(yè)方式的地址換算{intallo;//頁(yè)數(shù)inti;intr;//隨機(jī)數(shù)intl_addr;//邏輯地址intp_addr;//物理地址intpnum,mnum;//頁(yè)號(hào)、內(nèi)存塊號(hào)intaddr;//頁(yè)內(nèi)地址intmemsize;//內(nèi)存容量 intz;//隨機(jī)數(shù)Memory*memory;//內(nèi)存地址PageTable*page;//頁(yè)表地址 z=6+rand()%8;//隨機(jī)數(shù)Z的范圍6到8memsize=pow(2,z);//2的Z次冪運(yùn)算得出大小為2的冪printf("自動(dòng)生成頁(yè)面的大小為:%d\n",memsize);allo=11;//進(jìn)程數(shù)為11if(allo>memsize)//判斷{printf("超出內(nèi)存容量,無(wú)法分配!\n");return;}memory=malloc(memsize*sizeof(Memory));//分配內(nèi)存page=malloc(allo*sizeof(PageTable));//分配內(nèi)存給頁(yè)表initMem(memory,memsize);//內(nèi)存for(i=0;i<allo;i++)//隨機(jī)生成頁(yè)表{r=rand()%memsize;while(memory[r].flag)r=(r+1)%memsize;page[i].addr=r;//頁(yè)表地址memory[r].flag=1;}printf("******************頁(yè)表內(nèi)容**************\n");printf("頁(yè)號(hào)\t塊號(hào)\n");//輸出頁(yè)表for(i=0;i<allo;i++)//輸出頁(yè)表printf("%d\t%d\n",i,page[i].addr);//輸出頁(yè)表printf("****************************************\n");while(1){printf("請(qǐng)輸入邏輯地址:");scanf("%d",&l_addr);//邏輯地址賦值pnum=l_addr/BLOCK;//求頁(yè)號(hào)if(pnum>=allo)//判斷是否越界printf("地址越界!\n");else{addr=l_addr%BLOCK;//取余,得出頁(yè)內(nèi)地址mnum=page[pnum].addr;//內(nèi)存塊號(hào)p_addr=mnum*memsize+addr;//計(jì)算物理地址printf("邏輯地址%d所在頁(yè)號(hào)是%d,頁(yè)內(nèi)地址是%d,內(nèi)存塊號(hào)是%d,物理地址是%d\n",l_addr,pnum,addr,mnum,p_addr);//輸出物理地址break;}}}3.4分段方式的地址換算模塊3.4.1功能由系統(tǒng)隨機(jī)生成5個(gè)左右的段,并隨機(jī)生成一個(gè)段表并顯示。由用戶給定一個(gè)邏輯地址,包括段號(hào)和段內(nèi)地址,最后顯示其物理地址。3.4.2數(shù)據(jù)結(jié)構(gòu)voidsegTra()//分段方式的地址換算模塊3.4.3算法voidsegTra()//分段方式的地址換算模塊{intnum;//段表長(zhǎng)inti=0;intl_addr;//段內(nèi)編移intp_addr;//物理地址intsnum;//段號(hào)SegTable*seg;//段表地址num=5;//段的數(shù)目5seg=malloc(num*sizeof(SegTable));//分配內(nèi)存//initSeg(seg,num);seg[0].len=1+rand()%20;//隨機(jī)生成第0段的大小seg[0].addr=1+rand()%20;//隨機(jī)生成第0段的基址seg[1].len=1+rand()%20;//隨機(jī)生成第1段的大小seg[1].addr=21+rand()%40;//隨機(jī)生成第1段的基址seg[2].len=1+rand()%20;//隨機(jī)生成第2段的大小seg[2].addr=41+rand()%60;//隨機(jī)生成第2段的基址seg[3].len=1+rand()%20;//隨機(jī)生成第3段的大小seg[3].addr=61+rand()%80;//隨機(jī)生成第3段的基址seg[4].len=1+rand()%20;//隨機(jī)生成第4段的大小seg[4].addr=81+rand()%100;//隨機(jī)生成第4段的基址printf("***********************段表內(nèi)容*************************\n");printf("段號(hào)\t段長(zhǎng)\t基址\n");for(i=0;i<num;i++)printf("%d\t%d\t%d\n",i,seg[i].len,seg[i].addr);printf("***********************Hetiu***************************\n");while(1){printf("請(qǐng)輸入段號(hào)和段內(nèi)地址(#:#):");//輸入段號(hào)和段內(nèi)地址scanf("%d:%d",&snum,&l_addr);//賦值段號(hào)和段內(nèi)地址if(snum>=num||snum<0||seg[snum].len<l_addr)//檢驗(yàn)是否越界printf("地址越界!\n");else{p_addr=seg[snum].addr+l_addr;//計(jì)算物理地址printf("邏輯地址%d:%d的物理地址是%d\n",snum,l_addr,p_addr);//輸出物理地址break;}}}3.5段頁(yè)方式的地址換算模塊3.5.1功能先由系統(tǒng)隨機(jī)生成5個(gè)左右的段,然后再由系統(tǒng)隨機(jī)生成頁(yè)面大小,但一定為2的冪。然后生成段表和頁(yè)表。由用戶給定一個(gè)邏輯地址,包括段號(hào)和段內(nèi)地址,最后顯示其物理地址。3.5.2數(shù)據(jù)結(jié)構(gòu)voidsegPageTra()//段頁(yè)式的地址換算3.5.2算法voidsegPageTra()//段頁(yè)式的地址換算{inti,j,count=0;intr;//隨機(jī)數(shù)intl_addr;//邏輯地址intp_addr;//物理地址intnum,snum,pnum,mnum;//段表長(zhǎng)、段號(hào)、頁(yè)號(hào)、內(nèi)存塊號(hào)intaddr;//頁(yè)內(nèi)地址intmemsize;//內(nèi)存容量intz;Memory*memory;//內(nèi)存地址Segment*seg;//段表地址z=6+rand()%8;//Z隨機(jī)數(shù),范圍6到8memsize=pow(2,z);//頁(yè)表大小,2的冪num=5;//段的數(shù)目5seg=malloc(num*sizeof(Segment));//分配內(nèi)存給段表memory=malloc(memsize*sizeof(Memory));//分配內(nèi)存大小initMem(memory,memsize);//初始化內(nèi)存和大小i=0;seg[0].len=1+rand()%5;//隨機(jī)分配第0段表的段的數(shù)目1到5seg[1].len=1+rand()%5;//隨機(jī)分配第1段表的段的數(shù)目1到5seg[2].len=1+rand()%5;//隨機(jī)分配第2段表的段的數(shù)目1到5seg[3].len=1+rand()%5;//隨機(jī)分配第3段表的段的數(shù)目1到5seg[4].len=1+rand()%5;//隨機(jī)分配第4段表的段的數(shù)目1到5initSegment(seg,num);//初始化段頁(yè)表for(i=0;i<num;i++)//隨機(jī)分配內(nèi)存塊for(j=0;j<seg[i].len;j++){r=rand()%memsize;while(memory[r].flag)r=(r+1)%memsize;seg[i].page[j].addr=r;memory[r].flag=1;}printf("********************段頁(yè)表內(nèi)容******************************\n");printf("段號(hào)\t段內(nèi)頁(yè)表號(hào)\t塊號(hào)\n");for(i=0;i<num;i++)//用FOR循環(huán)輸出段頁(yè)表{printf("%d",i);for(j=0;j<seg[i].len;j++)printf("\t%d\t\t%d\n",j,seg[i].page[j].addr);//輸出段號(hào),段內(nèi)頁(yè)表,塊號(hào)printf("\n");}printf("***********************************************************\n");printf("自動(dòng)生成頁(yè)面的大小為:%d\n",memsize);//輸出頁(yè)面的大小while(1){printf("請(qǐng)輸入段號(hào)和段內(nèi)地址(#:#):");//提示用戶輸入段號(hào)和段內(nèi)地址scanf("%d:%d",&snum,&l_addr);//賦值段號(hào)和段內(nèi)地址pnum=l_addr/BLOCK;//根據(jù)邏輯地址的段內(nèi)地址和塊的大小來(lái)獲得對(duì)應(yīng)頁(yè)的頁(yè)表項(xiàng)位置addr=l_addr%BLOCK;//取余,求得頁(yè)表始址if(snum>=num||snum<0||seg[snum].len<pnum)//檢驗(yàn)是否越界printf("地址越界!\n");else{mnum=seg[snum].page[pnum].addr;//再獲取物理塊號(hào)p_addr=seg[snum].page[pnum].addr*memsize+addr;//計(jì)算物理地址printf("邏輯地址%d:%d所在頁(yè)號(hào)是%d,內(nèi)存塊號(hào)是%d,頁(yè)內(nèi)地址是%d,物理地址是%d\n",snum,l_addr,pnum,mnum,addr,p_addr);break;}}}3.6主函數(shù)模塊3.6.1功能用于程序與用戶的交互操作,由用戶選擇算法,并執(zhí)行相應(yīng)的算法。3.6.2數(shù)據(jù)結(jié)構(gòu)voidmain()//主函數(shù)3.6.3算法voidmain()//主函數(shù){intselect;MENU:system("cls");printf("**************************三種存儲(chǔ)管理方式的地址換算**********************\n");printf("1.分頁(yè)方式的地址換算\n");printf("2.分段方式的地址換算\n");printf("3.段頁(yè)方式的地址換算\n");printf("*********************計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)——盧耀榮、陳國(guó)毅**************\n");//以上是界面printf("請(qǐng)選擇:");scanf("%d",&select);//輸入,選擇功能模塊switch(select)//swithch函數(shù){case1:pageTra();//分頁(yè)方式的地址換算模塊system("pause");gotoMENU;break;case2:segTra();//分段方式的地址換算模塊system("pause");gotoMENU;break;case3:segPageTra();//段頁(yè)方式的地址換算模塊system("pause");gotoMENU;break;default:gotoMENU;break;}}4.程序設(shè)計(jì)與實(shí)現(xiàn)4.1程序流程圖4.2程序代碼#include<stdio.h>//表頭文件#include<windows.h>//表頭文件#include<stdlib.h>//表頭文件#include<time.h>//表頭文件#include<math.h>//表頭文件#defineBLOCK512//默認(rèn)塊大小為512BtypedefstructMEMORY//內(nèi)存塊{intflag;//分配狀態(tài),1為已分配,0為未分配}Memory;typedefstructPAGETABLE//頁(yè)表{//intflag;//狀態(tài)intaddr;//物理地址}PageTable;typedefstructSEGTABLE//段表{//intflag;//狀態(tài)intlen;//段長(zhǎng)intaddr;//段基址}SegTable;typedefstructSEGMENT//段頁(yè)表{//intflag;//狀態(tài)intlen;//段長(zhǎng)PageTable*page;//頁(yè)表地址}Segment;//voidinitMem(Memory*men,intmemsize);//初始化內(nèi)存//voidinitPage(PageTable*page,intsize);//初始化頁(yè)表//voidinitSeg(SegTable*seg,intsize);//初始化段表voidinitSegment(Segment*seg,intsize);//初始化段頁(yè)表voidpageTra();//分頁(yè)方式的地址換算voidsegTra();//分段方式的地址換算voidsegPageTra();//段頁(yè)方式的地址換算voidmain()//主函數(shù){intselect;MENU:system("cls");printf("**************************三種存儲(chǔ)管理方式的地址換算**********************\n");printf("1.分頁(yè)方式的地址換算\n");printf("2.分段方式的地址換算\n");printf("3.段頁(yè)方式的地址換算\n");printf("*********************計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)——盧耀榮、陳國(guó)毅**************\n");//以上是界面printf("請(qǐng)選擇:");scanf("%d",&select);//輸入,選擇功能模塊switch(select)//swithch函數(shù){case1:pageTra();//分頁(yè)方式的地址換算模塊system("pause");gotoMENU;break;case2:segTra();//分段方式的地址換算模塊system("pause");gotoMENU;break;case3:segPageTra();//段頁(yè)方式的地址換算模塊system("pause");gotoMENU;break;default:gotoMENU;break;}}voidinitMem(Memory*mem,intmemsize)//初始化內(nèi)存{inti;for(i=0;i<memsize;i++)mem[i].flag=0;}/*voidinitPage(PageTable*page,intsize)//初始化頁(yè)表{inti;for(i=0;i<size;i++)page[i].flag=0;}voidinitSeg(SegTable*seg,intsize)//初始化段表{inti;for(i=0;i<size;i++)seg[i].flag=0;}*/voidinitSegment(Segment*seg,intsize)//初始化段頁(yè)表{inti;for(i=0;i<size;i++)seg[i].page=malloc(seg[i].len*sizeof(PageTable));}/*功能:分頁(yè)方式的地址換算輸入:邏輯地址輸出:物理地址*/voidpageTra()//分頁(yè)方式的地址換算{intallo;//進(jìn)程大小inti;intr;//隨機(jī)數(shù)intl_addr;//邏輯地址intp_addr;//物理地址intpnum,mnum;//頁(yè)號(hào)、內(nèi)存塊號(hào)intaddr;//頁(yè)內(nèi)地址intmemsize;//內(nèi)存塊 intz;Memory*memory;//內(nèi)存地址PageTable*page;//頁(yè)表地址 z=6+rand()%8;//隨機(jī)數(shù)Z的范圍6到8memsize=pow(2,z);//2的Z次冪運(yùn)算得出大小為2的冪printf("自動(dòng)生成頁(yè)面的大小為:%d\n",memsize);allo=11;//頁(yè)號(hào)數(shù)為11if(allo>memsize){printf("超出內(nèi)存容量,無(wú)法分配!\n");return;}memory=malloc(memsize*sizeof(Memory));//分配內(nèi)存page=malloc(allo*sizeof(PageTable));//頁(yè)表initMem(memory,memsize);//內(nèi)存for(i=0;i<allo;i++)//隨機(jī)生成頁(yè)表{r=rand()%memsize;while(memory[r].flag)r=(r+1)%memsize;page[i].addr=r;memory[r].flag=1;}printf("******************頁(yè)表內(nèi)容**************\n");printf("頁(yè)號(hào)\t塊號(hào)\n");//輸出頁(yè)表for(i=0;i<allo;i++)//輸出頁(yè)表printf("%d\t%d\n",i,page[i].addr);//輸出頁(yè)表printf("****************************************\n");while(1){printf("請(qǐng)輸入邏輯地址:");scanf("%d",&l_addr);//邏輯地址賦值pnum=l_addr/BLOCK;//求頁(yè)號(hào)if(pnum>=allo)//判斷是否越界printf("地址越界!\n");else{addr=l_addr%BLOCK;//取余,得出頁(yè)內(nèi)地址mnum=page[pnum].addr;//內(nèi)存塊號(hào)p_addr=mnum*memsize+addr;//計(jì)算物理地址printf("邏輯地址%d所在頁(yè)號(hào)是%d,頁(yè)內(nèi)地址是%d,內(nèi)存塊號(hào)是%d,物理地址是%d\n",l_addr,pnum,addr,mnum,p_addr);//輸出物理地址break;}}}/*功能:分段方式的地址換算輸入:邏輯地址輸出:物理地址*/voidsegTra()//分段方式的地址換算模塊{intnum;//段表長(zhǎng)inti=0;intl_addr;//段內(nèi)編移intp_addr;//物理地址intsnum;//段號(hào)SegTable*seg;//段表地址num=5;//段的數(shù)目5seg=malloc(num*sizeof(SegTable));//分配內(nèi)存//initSeg(seg,num);seg[0].len=1+rand()%20;//隨機(jī)生成第0段的大小seg[0].addr=1+rand()%20;//隨機(jī)生成第0段的基址seg[1].len=1+rand()%20;//隨機(jī)生成第1段的大小seg[1].addr=21+rand()%40;//隨機(jī)生成第1段的基址seg[2].len=1+rand()%20;//隨機(jī)生成第2段的大小seg[2].addr=41+rand()%60;//隨機(jī)生成第2段的基址seg[3].len=1+rand()%20;//隨機(jī)生成第3段的大小seg[3].addr=61+rand()%80;//隨機(jī)生成第3段的基址seg[4].len=1+rand()%20;//隨機(jī)生成第4段的大小seg[4].addr=81+rand()%100;//隨機(jī)生成第4段的基址printf("***********************段表內(nèi)容*************************\n");printf("段號(hào)\t段長(zhǎng)\t基址\n");for(i=0;i<num;i++)printf("%d\t%d\t%d\n",i,seg[i].len,seg[i].addr);printf("***********************Hetiu***************************\n");while(1){printf("請(qǐng)輸入段號(hào)和段內(nèi)地址(#:#):");//輸入段號(hào)和段內(nèi)地址scanf("%d:%d",&snum,&l_addr);//賦值段號(hào)和段內(nèi)地址if(snum>=num||snum<0||seg[snum].len<l_addr)//檢驗(yàn)是否越界printf("地址越界!\n");else{p_addr=seg[snum].addr+l_addr;//計(jì)算物理地址printf("邏輯地址%d:%d的物理地址是%d\n",snum,l_addr,p_addr);//輸出物理地址break;}}}/*功能:段頁(yè)式的地址換算輸入:邏輯地址輸出:物理地址*/voidsegPageTra()//段頁(yè)式{inti,j,count=0;intr;//隨機(jī)數(shù)intl_addr;//邏輯地址intp_addr;//物理地址intnum,snum,pnum,mnum;//段表長(zhǎng)、段號(hào)、頁(yè)號(hào)、內(nèi)存塊號(hào)intaddr;//頁(yè)內(nèi)地址intmemsize;//內(nèi)存容量intz;Memory*memory;//內(nèi)存地址Segment*seg;//段表地址z=6+rand()%8;//Z隨機(jī)數(shù),范圍6到8memsize=pow(2,z);//頁(yè)表大小,2的冪num=5;//段的數(shù)目5seg=malloc(num*sizeof(Segment));//分配內(nèi)存給段表memory=malloc(memsize*sizeof(Memory));//分配內(nèi)存大小initMem(memory,memsize);//初始化內(nèi)存和大小i=0;seg[0].len=1+rand()%5;//隨機(jī)分配第0段表的段的數(shù)目1到5seg[1].len=1+rand()%5;//隨機(jī)分配第1段表的段的數(shù)目1到5seg[2].len=1+rand()%5;//隨機(jī)分配第2段表的段的數(shù)目1到5seg[3].len=1+rand()%5;//隨機(jī)分配第3段表的段的數(shù)目1到5seg[4].len=1+rand()%5;//隨機(jī)分配第4段表的段的數(shù)目1到5initSegment(seg,num);//初始化段頁(yè)表for(i=0;i<num;i++)//隨機(jī)分配內(nèi)存塊for(j=0;j<seg[i].len;j++){r=rand()%memsize;while(memory[r].flag)r=(r+1)%memsize;seg[i].page[j].addr=r;memory[r].flag=1;}printf("********************段頁(yè)表內(nèi)容******************************\n");printf("段號(hào)\t段內(nèi)頁(yè)表號(hào)\t塊號(hào)\n");for(i=0;i<num;i++)//用FOR循環(huán)輸出段頁(yè)表{printf("%d",i);for(j=0;j<seg[i].len;j++)printf("\t%d\t\t%d\n",j,seg[i].page[j].addr);//輸出段號(hào),段內(nèi)頁(yè)表,塊號(hào)printf("\n");}printf("***********************************************************\n");printf("自動(dòng)生成頁(yè)面的大小為:%d\n",memsize);//輸出頁(yè)面的大小while(1){printf("請(qǐng)輸入段號(hào)和段內(nèi)地址(#:#):");//提示用戶輸入段號(hào)和段內(nèi)地址scanf("%d:%d",&snum,&l_addr);//賦值段號(hào)和段內(nèi)地址pnum=l_addr/BLOCK;//根據(jù)邏輯地址的段內(nèi)地址和塊的大小來(lái)獲得對(duì)應(yīng)頁(yè)的頁(yè)表項(xiàng)位置addr=l_addr%BLOCK;//取余,求得頁(yè)表始址if(snum>=num||snum<0||seg[snum].len<pnum)//檢驗(yàn)是否越界printf("地址越界!\n");else{mnum=seg[snum].page[pnum].addr;//再獲取物理塊號(hào)p_addr=seg[snum].page[pnum].addr*memsize+addr;//計(jì)算物理地址printf("邏輯地址%d:%d所在頁(yè)號(hào)是%d,內(nèi)存塊號(hào)是%d,頁(yè)內(nèi)地址是%d,物理地址是%d\n",snum,l_addr,pnum,mnum,addr,p_addr);break;}}}

4.3實(shí)驗(yàn)結(jié)果(1)進(jìn)程初始化:(2)分頁(yè)方式的地址換算(3)分段方式的地址換算(4)段頁(yè)方式的地址換算

5.結(jié)論:頁(yè)表的功能可以由一組專(zhuān)門(mén)的寄存器來(lái)實(shí)現(xiàn)。一個(gè)頁(yè)表項(xiàng)用一個(gè)寄存器

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論