动态分区分配算法

计算机操作系统动态分区磁盘调度算法

一个好的计算机系统不仅要有足够的存储容量,较高的存取速度和稳定可靠的存储器,而且能够合理的分配和使用这些主存空间。当用户提出申请主存空间的要求时,存储管理能够按照一定的策略分析主存的使用情况,找出足够的空间分配给申请者;当作业运行完毕,存储管理要回收作业占用的主存空间。本实验采取可变分区存储管理方法,用常用分区管理算法模拟磁盘管理过程,以加深了解操作系统的存储管理功能。

1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。

2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5. 设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。 6. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。

首次适应算法

将内存中的空闲区按照地址由低到高的顺序形成空闲区表

当一个新作业要求装入主存时,查空闲区表,从中找到第一个满足要求的空闲区,为作业分配主存空间,并将剩余空闲区按照地址由小到大的顺序插入空闲区表的合适位置,修改已分配表

当作业运行结束后,回收作业的主存空间,并与相邻空闲区合并,修改空闲区表和已分配表 每次主存分配和回收后,打印空闲区表和已分配表

详细描述实验设计思想、程序结构及各模块设计思路; 详细描述程序所用数据结构及算法; 明确给出测试用例和实验结果;

为增加程序可读性,在程序中进行适当注释说明;

认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;

#include #include

using namespace std; const int procsize=5; typedef struct Node{ int PId; int Prio; int NeedRunTime; int Room; Node * next; }PCB;

typedef struct{ PCB *front; PCB *rear; }AleadyQueue;

typedef struct Tab{ int CalledId; int TabId; int Size; int StartAdd; char * Status; Tab *next; }Table;

//进程Id //进程优先数

//进程需要运行时间 //进程所需空间大小

//就绪队列中的下个就绪进程的地址

//就绪链式队列结构体

//分区表结构体

//调用该分区的进程Id //分区号 //大小 //始址 //使用状态 //指向下个分区

void CinInfo(PCB P[procsize]){ //输入进程信息

cout>P[j].PId>>P[j].Prio>>P[j].NeedRunTime>>P[j].Room; } }

void Sort(PCB P[procsize]){ //根据优先数由冒泡法对进程进行排序 int i,j,exchange=1; //exchange表示相邻PCB是否调换 PCB Temp; for(i=procsize;i>1&&exchange;i--){ exchange=0; for(j=0;j

} }

}

AleadyQueue InitQueue(){ //就绪队列初始化函数 AleadyQueue Q; Node *p; p=(Node *)malloc(sizeof(PCB)); if(!p) { coutnext=NULL; return Q; } }

void EnQueue(AleadyQueue &Queue,PCB &P){ Node *p; p=(Node *)malloc(sizeof(PCB)); if(!p) coutnext=NULL; Queue.rear->next=p; Queue.rear=p; } }

void EnQueue1(AleadyQueue &Queue,PCB &P){ Node *p; p=(Node *)malloc(sizeof(PCB)); if(!p) coutnext=NULL; Queue.rear->next=p;

//进程入队操作函数

//进程入队操作函数

}

}

Queue.rear=p;

PCB OutQueue(AleadyQueue &Q){ //进程出队操作函数 Node *P; P=(Node *)malloc(sizeof(PCB)); if(Q.front->next!=NULL){ P=Q.front->next; Q.front->next=P->next; } return *P; }

PCB OutQueue1(AleadyQueue &Q){ //进程出队操作函数 Node *P; P=(Node *)malloc(sizeof(PCB)); if(Q.front->next!=NULL){ P=Q.front->next; Q.front->next=P->next; } return *P; }

void printinfo(AleadyQueue Q){ //打印就绪队列的情况 coutnext; while(1){ if(Q.front!=NULL){ coutPIdPrioNeedRunTimeRoomnext; } else break; } }

int chose(){ //选择所选算法 int i;

cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout>i; return i;

}

Table * CreateMMTable(){ Table * FT; Table * R; Table * P; FT=(Table *)malloc(sizeof(Tab)); R=FT; FT->next=NULL; int num=0; int LastAdd=0; int LastSize=1; while(1){ P=(Table *)malloc(sizeof(Tab)); P->CalledId=0; P->TabId=num; P->Size=3*num+1; P->StartAdd=LastAdd+LastSize; P->Status="Free"; num++; LastAdd=P->StartAdd; LastSize=P->Size;

P->next=NULL; R->next=P; R=P;

if(P->StartAdd==93)

break; } return FT; }

Table * CreateUsedTable(){ Table * T; T=(Table *)malloc(sizeof(Tab));

//定义主存分区表 //用尾插入法

//被调用的进程调Id初始化为0 //主存分区号 //分区大小 //分区始址 //分区状态 //分区号加1

//重新定义LastAdd为上次的StartAdd //同上

//内存初始化完毕

//创建已分配表

cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout>i; return i;

}

Table * CreateMMTable(){ Table * FT; Table * R; Table * P; FT=(Table *)malloc(sizeof(Tab)); R=FT; FT->next=NULL; int num=0; int LastAdd=0; int LastSize=1; while(1){ P=(Table *)malloc(sizeof(Tab)); P->CalledId=0; P->TabId=num; P->Size=3*num+1; P->StartAdd=LastAdd+LastSize; P->Status="Free"; num++; LastAdd=P->StartAdd; LastSize=P->Size;

P->next=NULL; R->next=P; R=P;

if(P->StartAdd==93)

break; } return FT; }

Table * CreateUsedTable(){ Table * T; T=(Table *)malloc(sizeof(Tab));

//定义主存分区表 //用尾插入法

//被调用的进程调Id初始化为0 //主存分区号 //分区大小 //分区始址 //分区状态 //分区号加1

//重新定义LastAdd为上次的StartAdd //同上

//内存初始化完毕

//创建已分配表

T->next=NULL; return T; }

void CoutMMTable(Table * FTL){ //打印主存表情况 coutnext; while(1){ coutTabIdStartAddSizeStatusnext; if(FTL->next==NULL) break; } }

void CoutFreeTable(Table * FTL){ //打印空闲区表 coutnext; while(1){ coutTabIdStartAddSizeStatus); FTL=FTL->next; if(FTL->next==NULL) break; } }

void CoutUsedTable(Table * UTL){ //打印已分配表 coutnext; while(1){ if(UTL->Status=="Used"){ coutTabIdStartAddSizeStatus); } UTL=UTL->next; if(UTL->next==NULL) break; } }

int DistribMM(Table * MMTableList,PCB Temp,Table * FTL,Table * UTL){//分配一块一定大小的内存 Table *P;

Table * TempMM; TempMM=MMTableList; Table * TTT;

TTT=MMTableList->next;

//需要改为已分配节点的上一个节点

while(1){ //查找满足大小的分区节点 if(TTT->Size>=Temp.Room && TTT->Status=="Free") break; TTT=TTT->next; if(TTT==NULL){ cout

//以下是内存改为已分配 P=(Table *)malloc(sizeof(Tab)); while(1){ if(TempMM->next==TTT) break; TempMM=TempMM->next; }

P->next=TempMM->next; TempMM->next=P;

P->StartAdd=TTT->StartAdd; P->Size=Temp.Room; P->CalledId=Temp.PId; P->TabId=TTT->TabId; P->Status="Used"; P=P->next;

while(P!=NULL){ (P->TabId)++; P=P->next; }

FTL=FTL->next; while(1){ if(FTL->StartAdd==TTT->StartAdd) break; FTL=FTL->next; }

//将空闲分区对应的首地址更改

}

TTT->StartAdd=FTL->StartAdd=TTT->StartAdd+Temp.Room;//空闲表的首地址=原来+Room TTT->Size=FTL->Size=TTT->Size-Temp.Room; while(FTL!=NULL){ (FTL->TabId)++; FTL=FTL->next; }

return 2;

void ReturnMM(Table * MMTableList,Table * FTL,Table * UTL,PCB &Temp){ MMTableList=MMTableList->next; FTL=FTL->next; Table *TT; while(1){ if(MMTableList->CalledId==Temp.PId) { if(MMTableList->next->Status=="Free"){

//回收一块内存

MMTableList->Status="Free"; //修改内存,相邻的为Free MMTableList->CalledId=0; MMTableList->Size=MMTableList->Size+MMTableList->next->Size; MMTableList->next=MMTableList->next->next; TT=MMTableList; while(FTL!=NULL){ if(FTL->StartAdd==TT->next->StartAdd) break; FTL=FTL->next; } FTL->Size=TT->Size; } if(MMTableList->next->Status!="Free") { MMTableList->Status="Free"; //修改内存,相邻的为USed MMTableList->CalledId=0; while(FTL!=NULL){ if(FTL->StartAdd==TT->next->StartAdd) break; FTL=FTL->next; } FTL->Size=TT->Size; } }

if(MMTableList->next==NULL) break;

MMTableList=MMTableList->next; }//总while cout

int FF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q){ //首次适应算法 PCB Temp;

int i; //记录分配函数的返回值0 int num=0; //记录进程首次分配内存 while(1){ Temp=OutQueue(Q); if(num

} CoutUsedTable(MMTableList); } if(num==4){ } //打印已分配表 cout

cout

Temp.NeedRunTime--; //进程还需运行时间减1

cout

cout

num++;

if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队

cout

cout

if(Temp.PId==5)return 1;

ReturnMM(MMTableList,FTL,UTL,Temp); //回收内存

CoutMMTable(MMTableList); //打印主存情况

CoutFreeTable(FTL); //打印空闲分区表

CoutUsedTable(MMTableList); //打印已分配表

printinfo(Q);

if(Q.front->next==NULL) //判断就绪队列是否为空

break;

}

else

EnQueue(Q,Temp); //运行时间不为0,还需入队等待下一个时间片再次执行

}

return 2;

}

int BF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q2){ //最佳适应算法 PCB P[procsize]; //定义五个进程

CinInfo(P); //输入进程信息

Sort(P); //根据优先数的大小进行排序,形成进程数组P

for(int k=0; k

cout

cout

num++;

if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队

cout

cout

cout

if(Q2.front->next==NULL) //判断就绪队列是否为空

break;

}

else

EnQueue1(Q2,Temp); //运行时间不为0,还需入队等待下一个时间

片再次执行

}

return 1;

}

int WF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q2){ //最坏适应算法 PCB P[procsize]; //定义五个进程

CinInfo(P); //输入进程信息

Sort(P); //根据优先数的大小进行排序,形成进程数组P Q2=InitQueue(); //就绪队列初始化

for(int k=0; k

EnQueue(Q2,P[k]);

int i; //记录分配函数的返回值0 int num=0; PCB Temp; while(1){ Temp=OutQueue1(Q2); if(num

为0,则不再入队

cout

cout

if(Q2.front->next==NULL) break; } else

//判断就绪队列是否为空 EnQueue1(Q2,Temp);

片再次执行

}

return 2;

}

void main(){

AleadyQueue Q1; AleadyQueue Q2; AleadyQueue Q3; //运行时间不为0,还需入队等待下一个时间 //定义一个就绪队列 PCB P[procsize]; CinInfo(P); Sort(P); Q1=InitQueue(); Q2=InitQueue(); Q3=InitQueue(); for(int k=0; k

} int i; int j; while(1){ j=chose(); if(j==1) //记录0,内存不足 //记录所选算法 //判断所选算法,所需操作(FF、BF、WF) i=FF(MM,FreeTableList,UsedTableList,Q1);//首次适应算法 if(i==0) exit(0); //内存不足 if(j==2) i=BF(MM,FreeTableList,UsedTableList,Q2);//最佳适应算法 if(i==0) exit(0); //内存不足 if(j==3) i=WF(MM,FreeTableList,UsedTableList,Q3);//最坏适应算法 if(i==0) exit(0); //内存不足 if(j==4) break; //结束内存分配 } cout

计算机操作系统动态分区磁盘调度算法

一个好的计算机系统不仅要有足够的存储容量,较高的存取速度和稳定可靠的存储器,而且能够合理的分配和使用这些主存空间。当用户提出申请主存空间的要求时,存储管理能够按照一定的策略分析主存的使用情况,找出足够的空间分配给申请者;当作业运行完毕,存储管理要回收作业占用的主存空间。本实验采取可变分区存储管理方法,用常用分区管理算法模拟磁盘管理过程,以加深了解操作系统的存储管理功能。

1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。

2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5. 设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。 6. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。

首次适应算法

将内存中的空闲区按照地址由低到高的顺序形成空闲区表

当一个新作业要求装入主存时,查空闲区表,从中找到第一个满足要求的空闲区,为作业分配主存空间,并将剩余空闲区按照地址由小到大的顺序插入空闲区表的合适位置,修改已分配表

当作业运行结束后,回收作业的主存空间,并与相邻空闲区合并,修改空闲区表和已分配表 每次主存分配和回收后,打印空闲区表和已分配表

详细描述实验设计思想、程序结构及各模块设计思路; 详细描述程序所用数据结构及算法; 明确给出测试用例和实验结果;

为增加程序可读性,在程序中进行适当注释说明;

认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;

#include #include

using namespace std; const int procsize=5; typedef struct Node{ int PId; int Prio; int NeedRunTime; int Room; Node * next; }PCB;

typedef struct{ PCB *front; PCB *rear; }AleadyQueue;

typedef struct Tab{ int CalledId; int TabId; int Size; int StartAdd; char * Status; Tab *next; }Table;

//进程Id //进程优先数

//进程需要运行时间 //进程所需空间大小

//就绪队列中的下个就绪进程的地址

//就绪链式队列结构体

//分区表结构体

//调用该分区的进程Id //分区号 //大小 //始址 //使用状态 //指向下个分区

void CinInfo(PCB P[procsize]){ //输入进程信息

cout>P[j].PId>>P[j].Prio>>P[j].NeedRunTime>>P[j].Room; } }

void Sort(PCB P[procsize]){ //根据优先数由冒泡法对进程进行排序 int i,j,exchange=1; //exchange表示相邻PCB是否调换 PCB Temp; for(i=procsize;i>1&&exchange;i--){ exchange=0; for(j=0;j

} }

}

AleadyQueue InitQueue(){ //就绪队列初始化函数 AleadyQueue Q; Node *p; p=(Node *)malloc(sizeof(PCB)); if(!p) { coutnext=NULL; return Q; } }

void EnQueue(AleadyQueue &Queue,PCB &P){ Node *p; p=(Node *)malloc(sizeof(PCB)); if(!p) coutnext=NULL; Queue.rear->next=p; Queue.rear=p; } }

void EnQueue1(AleadyQueue &Queue,PCB &P){ Node *p; p=(Node *)malloc(sizeof(PCB)); if(!p) coutnext=NULL; Queue.rear->next=p;

//进程入队操作函数

//进程入队操作函数

}

}

Queue.rear=p;

PCB OutQueue(AleadyQueue &Q){ //进程出队操作函数 Node *P; P=(Node *)malloc(sizeof(PCB)); if(Q.front->next!=NULL){ P=Q.front->next; Q.front->next=P->next; } return *P; }

PCB OutQueue1(AleadyQueue &Q){ //进程出队操作函数 Node *P; P=(Node *)malloc(sizeof(PCB)); if(Q.front->next!=NULL){ P=Q.front->next; Q.front->next=P->next; } return *P; }

void printinfo(AleadyQueue Q){ //打印就绪队列的情况 coutnext; while(1){ if(Q.front!=NULL){ coutPIdPrioNeedRunTimeRoomnext; } else break; } }

int chose(){ //选择所选算法 int i;

cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout>i; return i;

}

Table * CreateMMTable(){ Table * FT; Table * R; Table * P; FT=(Table *)malloc(sizeof(Tab)); R=FT; FT->next=NULL; int num=0; int LastAdd=0; int LastSize=1; while(1){ P=(Table *)malloc(sizeof(Tab)); P->CalledId=0; P->TabId=num; P->Size=3*num+1; P->StartAdd=LastAdd+LastSize; P->Status="Free"; num++; LastAdd=P->StartAdd; LastSize=P->Size;

P->next=NULL; R->next=P; R=P;

if(P->StartAdd==93)

break; } return FT; }

Table * CreateUsedTable(){ Table * T; T=(Table *)malloc(sizeof(Tab));

//定义主存分区表 //用尾插入法

//被调用的进程调Id初始化为0 //主存分区号 //分区大小 //分区始址 //分区状态 //分区号加1

//重新定义LastAdd为上次的StartAdd //同上

//内存初始化完毕

//创建已分配表

cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout算法为进程分配内存!\n"; cout>i; return i;

}

Table * CreateMMTable(){ Table * FT; Table * R; Table * P; FT=(Table *)malloc(sizeof(Tab)); R=FT; FT->next=NULL; int num=0; int LastAdd=0; int LastSize=1; while(1){ P=(Table *)malloc(sizeof(Tab)); P->CalledId=0; P->TabId=num; P->Size=3*num+1; P->StartAdd=LastAdd+LastSize; P->Status="Free"; num++; LastAdd=P->StartAdd; LastSize=P->Size;

P->next=NULL; R->next=P; R=P;

if(P->StartAdd==93)

break; } return FT; }

Table * CreateUsedTable(){ Table * T; T=(Table *)malloc(sizeof(Tab));

//定义主存分区表 //用尾插入法

//被调用的进程调Id初始化为0 //主存分区号 //分区大小 //分区始址 //分区状态 //分区号加1

//重新定义LastAdd为上次的StartAdd //同上

//内存初始化完毕

//创建已分配表

T->next=NULL; return T; }

void CoutMMTable(Table * FTL){ //打印主存表情况 coutnext; while(1){ coutTabIdStartAddSizeStatusnext; if(FTL->next==NULL) break; } }

void CoutFreeTable(Table * FTL){ //打印空闲区表 coutnext; while(1){ coutTabIdStartAddSizeStatus); FTL=FTL->next; if(FTL->next==NULL) break; } }

void CoutUsedTable(Table * UTL){ //打印已分配表 coutnext; while(1){ if(UTL->Status=="Used"){ coutTabIdStartAddSizeStatus); } UTL=UTL->next; if(UTL->next==NULL) break; } }

int DistribMM(Table * MMTableList,PCB Temp,Table * FTL,Table * UTL){//分配一块一定大小的内存 Table *P;

Table * TempMM; TempMM=MMTableList; Table * TTT;

TTT=MMTableList->next;

//需要改为已分配节点的上一个节点

while(1){ //查找满足大小的分区节点 if(TTT->Size>=Temp.Room && TTT->Status=="Free") break; TTT=TTT->next; if(TTT==NULL){ cout

//以下是内存改为已分配 P=(Table *)malloc(sizeof(Tab)); while(1){ if(TempMM->next==TTT) break; TempMM=TempMM->next; }

P->next=TempMM->next; TempMM->next=P;

P->StartAdd=TTT->StartAdd; P->Size=Temp.Room; P->CalledId=Temp.PId; P->TabId=TTT->TabId; P->Status="Used"; P=P->next;

while(P!=NULL){ (P->TabId)++; P=P->next; }

FTL=FTL->next; while(1){ if(FTL->StartAdd==TTT->StartAdd) break; FTL=FTL->next; }

//将空闲分区对应的首地址更改

}

TTT->StartAdd=FTL->StartAdd=TTT->StartAdd+Temp.Room;//空闲表的首地址=原来+Room TTT->Size=FTL->Size=TTT->Size-Temp.Room; while(FTL!=NULL){ (FTL->TabId)++; FTL=FTL->next; }

return 2;

void ReturnMM(Table * MMTableList,Table * FTL,Table * UTL,PCB &Temp){ MMTableList=MMTableList->next; FTL=FTL->next; Table *TT; while(1){ if(MMTableList->CalledId==Temp.PId) { if(MMTableList->next->Status=="Free"){

//回收一块内存

MMTableList->Status="Free"; //修改内存,相邻的为Free MMTableList->CalledId=0; MMTableList->Size=MMTableList->Size+MMTableList->next->Size; MMTableList->next=MMTableList->next->next; TT=MMTableList; while(FTL!=NULL){ if(FTL->StartAdd==TT->next->StartAdd) break; FTL=FTL->next; } FTL->Size=TT->Size; } if(MMTableList->next->Status!="Free") { MMTableList->Status="Free"; //修改内存,相邻的为USed MMTableList->CalledId=0; while(FTL!=NULL){ if(FTL->StartAdd==TT->next->StartAdd) break; FTL=FTL->next; } FTL->Size=TT->Size; } }

if(MMTableList->next==NULL) break;

MMTableList=MMTableList->next; }//总while cout

int FF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q){ //首次适应算法 PCB Temp;

int i; //记录分配函数的返回值0 int num=0; //记录进程首次分配内存 while(1){ Temp=OutQueue(Q); if(num

} CoutUsedTable(MMTableList); } if(num==4){ } //打印已分配表 cout

cout

Temp.NeedRunTime--; //进程还需运行时间减1

cout

cout

num++;

if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队

cout

cout

if(Temp.PId==5)return 1;

ReturnMM(MMTableList,FTL,UTL,Temp); //回收内存

CoutMMTable(MMTableList); //打印主存情况

CoutFreeTable(FTL); //打印空闲分区表

CoutUsedTable(MMTableList); //打印已分配表

printinfo(Q);

if(Q.front->next==NULL) //判断就绪队列是否为空

break;

}

else

EnQueue(Q,Temp); //运行时间不为0,还需入队等待下一个时间片再次执行

}

return 2;

}

int BF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q2){ //最佳适应算法 PCB P[procsize]; //定义五个进程

CinInfo(P); //输入进程信息

Sort(P); //根据优先数的大小进行排序,形成进程数组P

for(int k=0; k

cout

cout

num++;

if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队

cout

cout

cout

if(Q2.front->next==NULL) //判断就绪队列是否为空

break;

}

else

EnQueue1(Q2,Temp); //运行时间不为0,还需入队等待下一个时间

片再次执行

}

return 1;

}

int WF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q2){ //最坏适应算法 PCB P[procsize]; //定义五个进程

CinInfo(P); //输入进程信息

Sort(P); //根据优先数的大小进行排序,形成进程数组P Q2=InitQueue(); //就绪队列初始化

for(int k=0; k

EnQueue(Q2,P[k]);

int i; //记录分配函数的返回值0 int num=0; PCB Temp; while(1){ Temp=OutQueue1(Q2); if(num

为0,则不再入队

cout

cout

if(Q2.front->next==NULL) break; } else

//判断就绪队列是否为空 EnQueue1(Q2,Temp);

片再次执行

}

return 2;

}

void main(){

AleadyQueue Q1; AleadyQueue Q2; AleadyQueue Q3; //运行时间不为0,还需入队等待下一个时间 //定义一个就绪队列 PCB P[procsize]; CinInfo(P); Sort(P); Q1=InitQueue(); Q2=InitQueue(); Q3=InitQueue(); for(int k=0; k

} int i; int j; while(1){ j=chose(); if(j==1) //记录0,内存不足 //记录所选算法 //判断所选算法,所需操作(FF、BF、WF) i=FF(MM,FreeTableList,UsedTableList,Q1);//首次适应算法 if(i==0) exit(0); //内存不足 if(j==2) i=BF(MM,FreeTableList,UsedTableList,Q2);//最佳适应算法 if(i==0) exit(0); //内存不足 if(j==3) i=WF(MM,FreeTableList,UsedTableList,Q3);//最坏适应算法 if(i==0) exit(0); //内存不足 if(j==4) break; //结束内存分配 } cout


相关内容

  • 可重定向动态分区分配算法
  • 组号 成绩 计算机操作系统 课程设计报告 题目内存的连续分配算法 基于动态分区分配的内存管理的模拟设计与实现 专业: 班级: 学号+姓名: 指导教师: 2016年12月 22 日 一.设计目的 掌握内存的连续分配方式的各种分配算法. 二.设计内容 本系统模拟操作系统内存分配算法的实现,实现动态分区分 ...

  • 动态分区存储管理
  • 动态分区存储管理方式的主存分配回收 一.实验目的 深入了解动态分区存储管理方式主存分配回收的实现. 二.实验预备知识 存储管理中动态分区的管理方式. 三.实验内容 编写程序完成动态分区存储管理方式的主存分配回收的实现.实验具体包括:首先确定主存空间分配表:然后采用最优适应算法完成主存空间的分配和回收 ...

  • 广工操作系统2015实验报告
  • 实 验 报 告 课程名称操作系统实验 学生学院计算机学院 专业班级计算机科学与技术 学 号 学生姓名 指导教师 孙为军 2015 年12月30日 实验一 进程调度 一.实验目的 编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.实验内容 1. 采用"短进程优先 ...

  • 动态分区式存储管理
  • 可变分区存储管理 设计思路: 整体思路: 可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区.当作业要求装入内存时,根据作业需要内存空间的大小 查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作 ...

  • 操作系统实验五
  • 暨南大学本科实验报告专用纸 课程名称 <操作系统原理实验> 成绩评定 实验项目名称 进程控制 指导教师 戴红 实验项目编号 0806002904 实验项目类型 综合型实验地点 学生姓名 岑江斌 学号 2008051584 学院 电气信息学院 系 计算机科学系 专业 软件工程 实验时间 年 ...

  • 用C语言模拟内存分区分配管理的最佳适应算法
  • [摘要]本文用C语言程序设计中链表的思想,模拟了操作系统课程存储管理的最佳适应算法,其运行结果形象地展示了动态内存分配与回收的过程.这不仅能激发学生学习枯燥的操作系统,还有助于学生更好地掌握C语言知识的综合应用,提高学生的编程能力. 中国论文网 http://www.xzbu.com/8/view- ...

  • OS练习题带答案1
  • 操作系统练习题-习题加答案 注:本答案只提供参考只用,中间不免有些错误,可以QQ或当面大家交流,也希望不要把这个当成期末的宝贝,只背答案是不行的,能理解尽量理解的了,加油!!! 1~3章(引论.处理机管理) 1.现代操作系统的特征是: 并发 . 共享 . 虚拟 . 异步 . 2.进程与进程控制块(P ...

  • 操作系统模拟题
  • 计算机操作系统模拟试题一 一.选择题(选择最确切的一个答案,将其代码填入括号中,每空2分,共20分) 1.把逻辑地址转变为内存的物理地址的过程称做( ). A. 编译 B.连接 C. 运行 D. 重定位 2.进程和程序的一个本质区别是( ). A. 前者分时使用CPU ,后者独占CPU B .前者存 ...

  • 实验四最先适应算法
  • 综合实验报告 ( 2011-- 2012 年度第 1 学期) 名 称:操作系统原理综合实验B 题 目:院 系:班 级: 网络工程0902 学 号: [1**********]1 学生姓名:指导教师:设计周数: 1周 成 绩: 日期: 2011年 11月 26 日 一.综合实验的目的与要求 1.实验目 ...