《操作系统分区内存管理(共11页).doc》由会员分享,可在线阅读,更多相关《操作系统分区内存管理(共11页).doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上洛阳理工学院实验报告系别计算机系班级学号姓名课程名称计算机操作系统实验日期2015/10/26实验名称分区内存管理成绩实验目的: 过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。实验条件:计算机一台,软件vc+6.0一、实验目的通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。二、实验原理设计程序模拟内存的动态分区内存管理方法。内存分区使用分区(说明)表进行管理,采用最先适应算法从分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲区的合并。假定系统的内存共640K,初始状态为操作系统本身占用40K。t1时刻,为作业
2、A、B、C分配80K、60K、100K、的内存空间;t2时刻作业B完成;t3时刻为作业D分配50K的内存空间;t4时刻作业C、A完成;t5时刻作业D完成。要求编程序分别输出t1、t2、t3、t4、t5时刻内存的空闲分区。三、实验内容#include#include#include#include#define maxPCB 10#define maxPart 10#define TRUE 1#define FALSE 0typedef struct PCB_type char name; /进程名int address, len, valid; /进程所占分区起止、长度、该PCB有效标识(1有
3、效,0无效)PCB;typedef struct seqlist PCB PCBelemmaxPCB; / maxPCB为系统中允许的最多进程数 int total; /系统中实际的进程数 PCBseql;typedef struct Partitionint address, len, valid; /分区起址、长度、有效标识(1空闲,0已分配) Part;typedef struct Partlist Part PartelemmaxPart; / maxPart为系统中可能的最多分区数 int sum; /系统中实际的分区数Partseql;int length = 640 ;/系统有6
4、40 的空闲 PCBseql *pcbl;Partseql *partl;void initpcb(PCBseql *vpcbl,int adr); /初始化进程表vpcblvoid getprint(); void initpart(); /初始化分区表vpartlvoid request (char name, int len); /进程name请求len大小的内存void release(char name); /回收name进程所占内存空间void print(); /输出内存空闲分区/*void printp()int i;for(i=0;itotal);i+) printf(%cn
5、,pcbl-PCBelemi.name); */void initpcb(PCBseql *vpcbl,int adr) /初始化进程表vpcbl int i=1; PCB *pcbelem; int tel; char c; pcbelem=vpcbl-PCBelem; while(TRUE) printf(请输入第%d进程名称,i+); vpcbl-total+; scanf(%c,&(pcbelem-name); printf(请输入进程所需内存); scanf(%d,&tel); pcbelem-len=tel; pcbelem-address=adr+tel; pcbelem-val
6、id=1; pcbelem+; printf(是否要继续输入进程(Enter-是 Esc-否)n); fflush(stdin); c = getch(); fflush(stdin); if(c=27) break; void initpart() char c,name; int len; printf(请输入你的操作 R.请求内存;P.输出空闲分区; S. 强制进程结束;(N/n).退出n); fflush(stdin); c= getchar(); fflush(stdin); while(c!=N|c!=n) if(c=R|c=r) fflush(stdin); /做输入的时候要清空
7、缓冲区 printf(请输入请求内存进程的名称,长度); scanf(%c,%d,&name,&len); request(name,len); /进程请求内存 else if(c=P|c=p) printf(t*VIEW begin*n); getprint(); printf(t*VIEW end *n); else if(c=S|c=s) printf(请输入想要回收的进程名称n); scanf(%c,&name); release(name); printf(请输入你的操作R.请求内存;P.输出空闲分区; S.强制进程结束 n); fflush(stdin); c= getchar()
8、; fflush(stdin); void init4IOS(int tem) Part *newPart = &partl-Partelem0; tem = tem0?(temaddress = 0; newPart-len = tem ; newPart-valid = 1; partl-sum+; printf(-已为操作系统分配了%d kb内存n,tem); newPart = &partl-Partelem1; newPart-address = tem ; length=tem = length -tem; tem = temlen = tem ; newPart-valid =
9、0; partl-sum+; printf(-为操作系统分配后剩余的内存%d kb内存n,tem); int getTagByPcb(char name) int i=0; for(;itotal);i+) if(name = pcbl-PCBelemi.name) return i; return pcbl-total+1; /分配出去就会产生一个碎片 将元素后移动一位 void ArrayToRightOne(int i) int leng=partl-sum; while(lengi) partl-Partelemleng.address = partl-Partelemleng-1.a
10、ddress; partl-Partelemleng.len = partl-Partelemleng-1.len; partl-Partelemleng.valid = partl-Partelemleng-1.valid; leng-; partl-sum+; int findBylen(int len) int i=0; while(isum) if (partl-Partelemi.valid=0) if (lenPartelemi.len) return i; i+; return 0; void request(char name,int len) char tem; int i;
11、 /是name进程的下标 int temBylen; int temByPcb ; temByPcb=getTagByPcb(name); while (temByPcbpcbl-total) printf(找不到进程%c,重新输入Y/N,name); fflush(stdin); tem = getchar(); if(tem=Y) fflush(stdin); /做输入的时候要清空缓冲区 printf(请输入请求内存进程的名称,长度); scanf(%c,%d,&name,&len); if (lenpcbl-PCBelemtemByPcb.len) printf(您请求的容量大于您进程最
12、大要求量%d,pcbl-PCBelemtemByPcb.len); return; if (tem=N) return ; /找到一块len内存 if(findBylen(len)=0) /sort2part(); /收集内存 代码没写 if(i=findBylen(len)=0) printf(警告内存已满无法分配n); /分配出去就会产生一个碎片 将元素后移动一位 10 / 16 ArrayToRightOne(i); /直接对partl-Partelemi赋值 并加入一个碎片 temBylen = partl-Partelemi.len-len; partl-Partelemi.len
13、= len; partl-Partelemi.valid = 1; /新的碎片 partl-Partelemi+1.address = partl-Partelemi.address+partl-Partelemi.len; partl-Partelemi+1.len =temBylen; partl-Partelemi+1.valid=0; /更新pcb的状态和容量 pcbl-PCBelemtemByPcb.address = partl-Partelemi.address; pcbl-PCBelemtemByPcb.len = pcbl-PCBelemtemByPcb.len-len ;/
14、更新pcb的len pcbl-PCBelemtemByPcb.valid = 1 ; void release(char name) int i=0; int adress,len; if( getTagByPcb(name)PCBelemgetTagByPcb(name).valid=0) printf(%c还没有运行请先运行n,name); printf(现在正回收%c的内存n,name); adress = pcbl-PCBelemgetTagByPcb(name).address; len = pcbl-PCBelemgetTagByPcb(name).len; while (isum
15、) if (adress=partl-Partelemi.address) partl-Partelemi.valid=0; i+; void getprint() int i; printf(-空闲分区begin-n); for (i=0;isum;i+) if (partl-Partelemi.valid=0) printf(第%d块空闲内存起止为%d,容量为%dn,i,partl-Partelemi.address,partl-Partelemi.len); printf(-空闲分区end-n); void main() char tem; int OSsize = 40; const int M=25; pcbl=(PCBseql*)malloc(sizeof(PCBseql);partl=(Partseql*)malloc(sizeof(Partseql); partl-sum=0; pcbl-total=0; init4IOS(OSsize); /为进程分配内存 initpcb(pcbl,OSsize); initpart(); scanf(%c,&tem); 实验结果: 专心-专注-专业
限制150内