一:题目7-1 内存分区分配–首次适应算法 (100 分) 宝 今天你看我博客了吗
输入内存的大小和阈值minsize,按照首次适应算法进行连续的分区分配。在划分时,若剩余的内存小于等于minsize,则将整块内存分配给该进程不再进行划分。 根据菜单选择相应的操作:
1.初始化:输入内存的大小和阈值minsize,初始状态下空闲分区名字为“void”。
2.分配:输入申请进程的名字、大小。
若可以分配,显示“分配成功!”; 若剩余空间不足,显示不分配原因“剩余空间不足,不予分配。”; 若剩余的空间通过紧凑技术,可以再分配,提示“是否通过紧凑技术,重新划分?(Y/N)”若选择“Y”,通过紧凑技术重新划分并分配,成功后,显示“分配成功!”若选择“N”,则输出“没有合适的剩余空间,不予分配。” 3.回收:输入回收进程的名字,若有相邻空闲分区,需要合并,并输出“回收成功!”;若输入错误,提示“查无此分区!” 4.显示:显示当前内存的分配状态。
0.退出
其他:输出“输入错误,请重新输入。”
输入格式: 先进行初始化后,按照菜单进行相应的操作。
输出格式: 菜单只显示一次,按照相应的选择输出。 输入样例1: 在这里给出一组输入。例如:
1
1024 5
4
0
结尾无空行 输出样例1: 在这里给出相应的输出。例如:
1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分区号 分区 起始地址 结束地址 大小 当前状态
1 void 0 1023 1024 空闲
结尾无空行
输入样例2:
在这里给出一组输入。例如:
1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 95
4
0
结尾无空行 输出样例2: 在这里给出相应的输出。例如:
1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
分区号 分区 起始地址 结束地址 大小 当前状态
1 A 0 99 100 已分配
2 B 100 299 200 已分配
3 C 300 449 150 已分配
4 D 450 699 250 已分配
5 E 700 899 200 已分配
6 F 900 999 100 已分配
结尾无空行 输入样例3: 在这里给出一组输入。例如:
1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 150
4
0
结尾无空行
输出样例3: 在这里给出相应的输出。例如:
1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
剩余空间不足,不予分配。
分区号 分区 起始地址 结束地址 大小 当前状态
1 A 0 99 100 已分配
2 B 100 299 200 已分配
3 C 300 449 150 已分配
4 D 450 699 250 已分配
5 E 700 899 200 已分配
6 void 900 999 100 空闲
结尾无空行 输入样例4: 在这里给出一组输入。例如:
1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 150
3
A
4
0
结尾无空行 输出样例4: 在这里给出相应的输出。例如:
1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
剩余空间不足,不予分配。
回收成功!
分区号 分区 起始地址 结束地址 大小 当前状态
1 void 0 99 100 空闲
2 B 100 299 200 已分配
3 C 300 449 150 已分配
4 D 450 699 250 已分配
5 E 700 899 200 已分配
6 void 900 999 100 空闲
结尾无空行 输入样例5: 在这里给出一组输入。例如:
1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 150
3
A
2
X 150
Y
4
0
结尾无空行 输出样例5: 在这里给出相应的输出。例如:
1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
剩余空间不足,不予分配。
回收成功!
是否通过紧凑技术,重新划分?(Y/N)
分配成功!
分区号 分区 起始地址 结束地址 大小 当前状态
1 B 0 199 200 已分配
2 C 200 349 150 已分配
3 D 350 599 250 已分配
4 E 600 799 200 已分配
5 X 800 949 150 已分配
6 void 950 999 50 空闲
二:思路
思路: 1.解释算法:动态分区分配-首次适应算法: <1>:动态分区分配是根据进程的实际需要,动态的为之分配内存的空间, <2>:那么首次适应算法首次适应算法,要求空闲分区链以地址递增的次序链接, 在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的 空闲分区为止,然后再按照作业的大小, 从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中。 2.写码思路:先将整个框架写好,然后挨个写功能 3.选择数据结构:因为每组数据有多个,所以我们选择结构体数组
4.输入的要求 <1>.初始化:输入内存的大小和阈值minsize,初始状态下空闲分区名字为“void”。 <2>.分配:输入申请进程的名字、大小。
若可以分配,显示“分配成功!”; 若剩余空间不足,显示不分配原因“剩余空间不足,不予分配。”; 若剩余的空间通过紧凑技术,可以再分配,提示“是否通过紧凑技术, 重新划分?(Y/N)”若选择“Y”,通过紧凑技术重新划分并分配,成功后, 显示“分配成功!”若选择“N”,则输出“没有合适的剩余空间,不予分配。” <3>.回收:输入回收进程的名字,若有相邻空闲分区,需要合并,并输出“回收成功!”; 若输入错误,提示“查无此分区!” <4>.显示:显示当前内存的分配状态。 <0>.退出 其他:输出“输入错误,请重新输入。”
5.注意如果输入的进程没有占满内存,需要将剩下的内存也得输出来 并表示为空闲状态;
三:演示流程
四:debug(贴心杰的建议方式)
1:每实现一个功能就测试,不要等都写完了在去测试
2:整个码都码完了,那就挨个测试给出的示例,
3:如果上方还为未测试出你的bug,那么你就还是用给出的示例 但有一点,每当我们测试完一个用例后,不要退出,直接用功能 3 回收各个进程,然后再测试下一个用例
4:如果还没有,那就用PTA自带的测试用例,可以测你的格式是否正确,这道题最狗的还有是你输出的一定要跟样例一样,包括标点符号
五:上码(有些没用的注解 懒得删了 嘻嘻)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int id;
string partition = "void";
int start;
int end;
int size;
string state = "空闲";
}node[1000];
int cnt = 0;
int memory,minsize;
int sumSize = 0;
void Initialize(){
cin >> memory >> minsize;
node[cnt].id = 1;
node[cnt].start = 0;
node[cnt].end = memory - 1;
node[cnt].size = memory;
}
void distribution(){
string processName;
int processSize;
cin >> processName >> processSize;
if(cnt == 0){
node[cnt].end = -1;
}
int temp1 = memory - node[cnt].end - 1;
int temp2 = memory - sumSize;
int temp3 = temp1 - processSize;
if(temp3 <= minsize && temp3 >= 0){
processSize = temp1;
}
if(temp1 >= processSize){
cnt++;
node[cnt].id = cnt;
node[cnt].partition = processName;
if(cnt == 1){
node[cnt].start = 0;
}else{
node[cnt].start = node[cnt-1].start + node[cnt-1].size;
}
node[cnt].end = node[cnt].start + processSize - 1;
node[cnt].size = processSize;
node[cnt].state = "已分配";
sumSize += processSize;
cout << "分配成功!" << endl;
}else if(temp2 >= processSize){
cout << "是否通过紧凑技术,重新划分?(Y/N)" << endl;
char ch;
cin >> ch;
if(ch == 'Y'){
for(int i = 1; i <= cnt; i++) {
if(node[i].partition == "void"){
int value = node[i].size;
int j = i;
bool temp = false;
for( ; j < cnt; j++){
node[j].id = j;
node[j].partition = node[j+1].partition;
node[j].start = node[j+1].start - value;
node[j].end = node[j+1].end - value;
node[j].size = node[j+1].size;
node[j].state = node[j+1].state;
temp = true;
}
cnt--;
i = 0;
if(temp == false)
break;
}
}
int laterTemp1 = memory - node[cnt].end - 1;
int laterTemp3 = laterTemp1 - processSize;
if(laterTemp3 <= minsize){
processSize = laterTemp1;
}
cnt++;
node[cnt].id = cnt;
node[cnt].partition = processName;
if(cnt == 1){
node[cnt].start = 0;
}else{
node[cnt].start = node[cnt-1].start + node[cnt-1].size;
}
node[cnt].end = node[cnt].start + processSize - 1;
node[cnt].size = processSize;
node[cnt].state = "已分配";
sumSize += processSize;
cout << "分配成功!" << endl;
}else if (ch == 'N'){
cout << "没有合适的剩余空间,不予分配。" << endl;
}
}else{
cout << "剩余空间不足,不予分配。" << endl;
}
}
void recycling(){
string processName;
int flag = 0;
cin >> processName;
for(int i = 1; i <= cnt; i++) {
if(processName == node[i].partition){
node[i].partition = "void";
node[i].state = "空闲";
sumSize -= node[i].size;
flag = 1;
break;
}
}
if(flag == 1){
cout << "回收成功!" << endl;
for(int i = 1; i < cnt; i++){
if(node[i].partition == "void" && node[i+1].partition == "void"){
node[i].size += node[i+1].size;
node[i].end = node[i+1].end;
int j = i+2;
for( ; j <= cnt; j++){
node[j-1].id = j - 1;
node[j-1].partition = node[j].partition;
node[j-1].start = node[j].start;
node[j-1].end = node[j].end;
node[j-1].size = node[j].size;
node[j-1].state = node[j].state;
}
cnt--;
i = 0;
}
}
}else{
cout << "查无此分区!" << endl;
}
}
void show(){
cout << "分区号 分区 起始地址 结束地址 大小 当前状态" << endl;
if (cnt == 0) {
for(int i = 0; i <= cnt; i++){
cout << node[i].id << ' '
<< node[i].partition << ' '
<< node[i].start << ' '
<< node[i].end << ' '
<< node[i].size << ' '
<< node[i].state;
}
} else {
int remainTemp = memory - node[cnt].end - 1;
if(remainTemp > 0){
cnt++;
node[cnt].id = cnt;
node[cnt].partition = "void";
if(cnt == 1){
node[cnt].start = 0;
}else{
node[cnt].start = node[cnt-1].start + node[cnt-1].size;
}
node[cnt].end = node[cnt].start + remainTemp - 1;
node[cnt].size = remainTemp;
node[cnt].state = "空闲";
}
for(int i = 1; i <= cnt; i++){
cout << node[i].id << ' '
<< node[i].partition << ' '
<< node[i].start << ' '
<< node[i].end << ' '
<< node[i].size << ' '
<< node[i].state << endl;
}
}
}
void menu(){
cout << "1.初始化" << endl;
cout << "2.分配" << endl;
cout << "3.回收" << endl;
cout << "4.显示" << endl;
cout << "0.退出" << endl;
cout << "请选择:" << endl;
}
int main(){
bool flag = true;
menu();
while(flag){
int option;
cin >> option;
switch(option){
case 1: Initialize();
break;
case 2: distribution();
break;
case 3: recycling();
break;
case 4: show();
break;
case 0 : flag = false;
break;
default: cout << "输入错误,请重新输入。" << endl;
}
}
}
宝贝!!我让你把你不喜欢的博主取关了,你咋还把我给取关了呢!! 赶紧嘚,给我关注回来,我天天给你写博客看!!!
|