1、typedef struct jcb /*定义作业控制块JCB ,部分信息省略*/char name10; /作业名/作业大小struct jcb* link; /链指针JCB;typedef structJCB *front,*rear;jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(int size);void createTab();void checkTab();void recycleMemory(int i);void AllocateMemory(int size)int i;for(i=0;isize)parTabi.state=Y
2、;elseprintf(没有空闲分区,无法分配内存!n);void createTab()int i;for( i=1;=NUM;/getPartiTab(PARTITAB);parTabi-1.no=i;parTabi-1.size=20;parTabi-1.firstAddr=21;parTabi-1.state=void checkTab() int i; printf(分区号t大小t起址t状态n%dt,parTabi.no);,parTabi.size);,parTabi.firstAddr);%ct,parTabi.state);void recycleMemory(int i)in
3、t main(int argc, char* argv)nntt*ttntttt实验一 存储管理实验ntttt固定式分区分配存储管理ntt*ttncreateTab();checkTab();请按任意键继续:getchar();每个分区装入一道作业:i+)AllocateMemory(i+1)*3);假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第2分区)nrecycleMemory(2);接着,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为10)nAllocateMemory(10);return 0;dos.hconio.h#define n 10 #de
4、fine m 10 #define minisize 100 structfloat address;float length; 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) 无可用空闲区nreturn;if(free_tablek.length-xk=n) 无表目填写已分分区,错误nif(free_ta
5、blek.flag=0)free_tablek.flag=1;else free_tablek.length=free_tablek.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) 找不到该作业nused_tables.flag=0;S=used_tables.address;L=used_tabl
6、es.length;j=-1;while(im&(j=-1|k=-1)if(free_tablei.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!=-1) /* 上邻空闲区,下邻空闲区,三项合并*/free_tablek.length=free_tablej.length+free_tablek.length+L;free_tablej.flag=0;/*上邻空闲区,下邻非空闲区,与上邻合并*/free_tablek.length=free_
7、tablek.length+L;else if(j!=-1) /*上邻非空闲区,下邻为空闲区,与下邻合并*/free_tablej.address=S;free_tablej.length=free_tablej.length+L;else /*上下邻均为非空闲区,回收区域直接填入*/*在空闲区表中寻找空栏目*/t=0;while(free_tablet.flag=1&t=m) /*空闲区表满,回收空间失败,将已分配表复原*/主存空闲表没有空间,回收空间失败nused_tables.flag=J;free_tablet.address=S;free_tablet.length=L;free_t
8、ablet.flag=1;/*主存回收函数结束*/int main( )tttt实验三 存储管理实验nnttt可变式分区分配 (最佳适应算法)ntt*nint i,a;float xk;char J;/*空闲分区表初始化:*/free_table0.address=10240; /*起始地址假定为10240*/free_table0.length=10240; /*长度假定为10240,即10k*/free_table0.flag=1; /*初始空闲区为一个整体空闲区*/for(i=1;free_tablei.flag=0; /*其余空闲分区表项未被使用*/*已分配表初始化:n;used_ta
9、blei.flag=0; /*初始时均未分配*/while(1)功能选择项:n1。显示主存n2。分配主存n3。回收主存n4。退出n请选择相应功能1-4 :scanf(%d,&a);switch(a)case 4:exit(0); /*a=4程序结束*/case 2: /*a=2分配主存空间*/输入作业名J和作业所需空间xk: %*c%c%fJ,&xk);allocate(J,xk); /*分配主存空间*/break;case 3: /*a=3回收主存空间*/输入要回收分区的作业名%*c%cJ);reclaim(J); /*回收主存空间*/case 1: /*a=1显示主存情况*/*输出空闲区表
10、和已分配表的内容*/输出空闲区表:n起始地址 分区长度 标志n%6.0f%9.0f%6dn,free_tablei.address,free_tablei.length, free_tablei.flag); 按任意键,输出已分配区表ngetch(); 输出已分配区表:if(used_tablei.flag!=0)%6.0f%9.0f%6cn,used_tablei.address,used_tablei.length, used_tablei.flag);default:没有该选项n/*case*/*while*/return 1;iostreamstringusing namespace
11、std;typedef struct Quick 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
12、Stare int ssta;/段表始址 int slen;/段表长度 Stare;Stack ss10;/全局变量Stare st;/全局变量Data work20;/全局变量Quick qu;/全局变量Page page55;bool menuflag=0;int bbs;/内存块大小int bs;/内存大小void menu();void start();void change();int main() menu(); return 0;void menu() coutnntt*ttendl; couttttt实验三 存储管理实验nttt段页式存储管理的地址转换的模拟程序tt* cout
13、menu1; if(menu1!=1&menu1!=2&=3) cout请输入正确的选项 menu(); switch(menu1) case 1: menuflag=1; start(); break; case 2: if(menuflag=0) cout请初始化表 menu(); change(); case 3: return; /switchvoid start()请输入内存大小(K)bs;请输入内存块的大小(k)bbs; int blocknum; blocknum=bs/bbs;内存一共被分为blocknum块,每块bbsk一共bs请输入进程个数 int pn;pn; /下面求所
14、有进程的总段数和段表,并为每段创建页表 int sums=0; for (int pn1=0; pn1 pn1+)请输入第pn1ppn; 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.s
15、sta; st.slen=sums; /初始化内存中物理地址每一块的数据区简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址 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()请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B) int snum,pnum,dnum;snumpnumdnum; /首先查快表 if(snum=qu.qb&pnum=qu.qp)快表命中对应块号是qu.qs该块中作业数据是workpagequ.qbqu.qp.block.str物理地址是qu.qs*bbs*1024+dnum /访问段表寄存器 else快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址