1、typedef struct partiTab PARTITAB;typedef struct jcb char name10; struct jcb* link; JCB;typedef struct JCB *front,*rear; jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(int size);void createTab();void checkTab();void recycleMemory(int i);void AllocateMemory(int size) int i; int n=0; for(i=0; isize) pa
2、rTabi.state=Y; n=1; break; if (n=0) printf(内存大小是%dt,size);无法分配内存!n); else装入内存成功!void createTab() parTab0.no=0; parTab0.size=12; parTab0.firstAddr=20; parTab0.state= parTab1.no=1; parTab1.size=32; parTab1.firstAddr=32; parTab1.state= parTab2.no=2; parTab2.size=64; parTab2.firstAddr=64; parTab2.state=
3、 parTab3.no=3; parTab3.size=128; parTab3.firstAddr=128; parTab3.state=void checkTab()分区号t大小t起址t状态n%dt,parTabi.no);,parTabi.size);,parTabi.firstAddr);%ct,parTabi.state);void recycleMemory(int i) parTabi-1.state=int main(int argc, char* argv) int k=1+rand()%100;*固定式分区分配存储管理*n createTab(); checkTab();请
4、按任意键继续: getchar();一次装入多个作业: AllocateMemory(k); k=1+rand()%100;若继续装入作业n若有一个作业完成n k=rand()%4; recycleMemory(2);继续装入作业n return 0;截图显示为:2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。对分区的管理法可以是下面三种算法之一:首次适应算法 循环首次适应算法 最佳适应算法 dos.hconio.h#define n 10#define m 10#define minisize 100structfloat address;float length;
5、int flag;used_tablen;free_tablem;void allocate(char J,float xk) int i,k; float ad; k=-1;i=xk&free_tablei.flag=1) if(k=-1|free_tablei.lengthfree_tablek.length) k=i; if(k=-1)无可用空闲区n return; if(free_tablek.length-xk=n)无表目填写已分分区,错误n if(free_tablek.flag=0) free_tablek.flag=1; free_tablek.length=free_tabl
6、ek.length+xk; used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J;void reclaim(char J) int i,k,j,s,t; float S,L; s=0; while(used_tables.flag!=J|used_tables.flag=0)&s找不到该作业n used_tables.flag=0; S=used_tables.address; L=used_tables.length; j=-1;k=-1;i=0; while(im&(j=-1|k=-1) if(free_tabl
7、ei.flag=1) if(free_tablei.address+free_tablei.length=S)k=i; if(free_tablei.address=S+L)j=i; if(k!=-1) if(j! free_tablek.length=free_tablej.length+free_tablek.length+L; free_tablej.flag=0; free_tablek.length=free_tablek.length+L; free_tablej.address=S; free_tablej.length=free_tablej.length+L; t=0; wh
8、ile(free_tablet.flag=1&t=m)主存空闲表没有空间,回收空间失败n used_tables.flag=J; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1;int main( ) int i,a,b=4; float xk; char J; free_table0.address=10240; free_table0.length=10240; free_table0.flag=1; for(i=1; free_tablei.flag=0;n; used_tablei.flag=0; whil
9、e(b=4)请选择功能项:0、退出!1、分配主存!2、回收主存!3、显示主存! n选择功项(03) : scanf(%d,&a); switch(a) case 0: exit(0); case 1:输入作业名 作业所需长度: %*c%c%fJ,&xk); allocate(J,xk); case 2:输入要回收分区的作业名%*c%cJ); reclaim(J); case 3:输出空闲区表:n起始地址 分区长度 标志n%6.0f%9.0f%6dn,free_tablei.address,free_tablei.length, free_tablei.flag); 按任意键,输出已分配区表n
10、getch(); 输出已分配区表: if(used_tablei.flag!=0)%6.0f%9.0f%6cn,used_tablei.address,used_tablei.length, used_tablei.flag); default:printf(没有该选项n截图得:3、编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。iostreamstringusing namespace std;typedef struct Quick
11、 int qs;/快表段号 int qp;/快表页号 int qb; Quick;typedef struct Data int num; string str; Data;typedef struct Page int flag; int block; Page;typedef struct Stack int plen; int psta; Stack;typedef struct Stare int ssta; int slen; Stare;Stack ss10;Stare st;Data work20;Quick qu;Page page55;bool menuflag=0;int
12、bbs;int bs;void menu();void start();void change();void menu() coutmenu1; if(menu1!=1&menu1!=2&=3)请输入正确的选项 menu(); switch(menu1) menuflag=1; start(); if(menuflag=0)请初始化表 change(); /switchvoid start()请输入内存大小(K)bs;请输入内存块的大小(k)bbs; int blocknum; blocknum=bs/bbs;内存一共被分为blocknum块,每块bbsk一共bs请输入进程个数 int pn;
13、pn; int sums=0; for (int pn1=0; pn1 pn1+)请输入第pn1个进程的段数 int ppn;ppn; sums+=ppn; for(int ss1=0; ss1sums; ss1+)请输入段表第ss1ssss1.flagssss1.plenssss1.psta;请初始化第段的页表. for(int sss1=0; sss1ssss1.plen; sss1+) pagess1sss1.num=sss1;请输入该页表第sss1pagess1sss1.flagpagess1sss1.block;初始化段表寄存器的段表始址st.ssta; st.slen=sums;我
14、们对物理地址的每一块用字符串进行简单的初始化 for (int bn=0; bnblocknum; bn+) workbn.num=bn;bnqu.qp; while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1)该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号 qu.qs=pagequ.qbqu.qp.block;void change()请输入要转化的逻辑地址,段号,段内页号,页内偏移地址 int snum,pnum,dnum;snumpnumdnum; if(snum=qu.qb&pnum=qu.qp)快表命中对应块号是qu.qs该块
15、中作业数据是workpagequ.qbqu.qp.block.str物理地址是qu.qs*bbs*1024+dnumst.slen-1)越界中断ssnumssssnum.plen-1)缺页中断pnum=ssssnum.plen-1) if(pagessnumpnum.flag=0)找到该页查询页表后对应块号pagessnumpnum.block该块内存的数据是workpagessnumpnum.block.str转化得到的物理地址是:pagessnumpnum.block*bbs*1024+dnum此时将此项内容添加到快表里面int main()截图可以得到:四实验总结这次的实验对于我来说还是比较难的,几乎每次都是这样,看书的时候能够理解书上的讲解,也大概了解存储管理的过程和原理,但是在编写代码的时候却总是一团迷雾,不知道从哪里下手才好,我从网上找了代码,然后阅读理解了,但是代码里面有很多错误,而且有的过程也是错的,我就改正了一下。就比如说第一题来说,网上代码是将分区说明表是采取循环的方式进行设置,但是我觉得不太好,所以就以四个为例逐个的进行设置,虽然比较麻烦而且代码比较冗余,但是这样可以设置不同大小的固定
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1