132 lines
2.7 KiB
C++
132 lines
2.7 KiB
C++
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <vector>
|
||
#include <iostream>
|
||
using namespace std;
|
||
struct FF {
|
||
char name[10];
|
||
float address;//起始地址
|
||
float AFFival_time;//没用
|
||
float Service_hours;//没用
|
||
float Process_size;//进程大小
|
||
float size;//在内存中一块一块的值
|
||
float max_size;//内存最大值
|
||
float state;//0为空闲 1为不空闲,别问我为什么不用bool ,因为抄袭只能拿60
|
||
};
|
||
void print_Memory(FF *p,int N);//内存空间打印函数
|
||
void recovery(FF *p,int N);//回收函数,紧凑功能
|
||
void input(FF *p, int N);//输入函数
|
||
void run(FF *p,int N);//交互式界面
|
||
void detelex(FF *p,int N);//结束进程函数
|
||
void input(FF *p, int N) {
|
||
int i;
|
||
int x=0;
|
||
printf("输入系统内存大小");
|
||
scanf("%f",&p[0].max_size);
|
||
printf("\n");
|
||
for(i = 0; i <= N - 1; i++) {
|
||
printf("输入第%d个进程的名字,到达时间,服务时间,进程大小(例如:1 2 1 5):\n", i+1);
|
||
scanf("%s %f %f %f", p[i].name, &p[i].AFFival_time, &p[i].Service_hours,&p[i].Process_size);
|
||
}
|
||
}
|
||
|
||
void print(FF *p,int N){
|
||
for(int i=0;i<=N;i++){
|
||
printf(p[i].name, &p[i].AFFival_time, &p[i].Service_hours,&p[i].Process_size);
|
||
}
|
||
}
|
||
void distribution(FF *p,int N) {
|
||
int i;
|
||
p[0].size=p[0].max_size;
|
||
|
||
for (i=0; i<N; i++) {
|
||
p[i+1].size=p[i].Process_size;
|
||
if(p[0].size>=p[i].Process_size) {
|
||
p[0].size=p[0].size-p[i].Process_size;
|
||
p[i+1].state=1;
|
||
} else {
|
||
printf("第%d个进程进去后导致",i+1);
|
||
printf("马冲我谢谢你,内存不足\n");
|
||
p[i+1].size=p[0].size;
|
||
p[i+1].state=0;
|
||
print_Memory(p, N);
|
||
}
|
||
}
|
||
}
|
||
void recovery(FF *p,int N) {//想拿一百分还不赶快完成这个
|
||
int i;
|
||
for(i=1; i<N; i++) {
|
||
if(p[i].state==0&&p[i+1].state==0) {
|
||
|
||
p[i].size=p[i].size+p[i+1].size;
|
||
p[i+1].size=0;
|
||
}
|
||
}
|
||
printf("\n回收完毕\n");
|
||
}
|
||
void print_Memory(FF *p,int N) {
|
||
int i;
|
||
float q;
|
||
p[0].address=0;
|
||
printf("\n内存的使用状态\n");
|
||
for (i=1; i<=N; i++) {
|
||
printf("起始地址:\t");
|
||
q+=p[i].size;
|
||
p[i].address=q;
|
||
printf("%f\t",p[i-1].address);
|
||
printf("分区大小:\t");
|
||
printf("%f\t",p[i].size);
|
||
if(p[i].state==1) {
|
||
printf("\t正在工作\n");
|
||
} else {
|
||
printf("\t空闲\n");
|
||
}
|
||
}
|
||
printf("剩余内存");
|
||
printf("%f",p[0].size);
|
||
}
|
||
void run(FF *p,int N) {
|
||
int xx=0;
|
||
while(xx!=4) {
|
||
printf("\n释放内存请按1,回收内存请按2,查看内存请按3,退出请按4\n");
|
||
cin>>xx;
|
||
if(xx==1) {
|
||
detelex(p, N);
|
||
print(p,N);
|
||
} else if(xx==2) {
|
||
recovery(p, N);
|
||
} else if(xx==3) {
|
||
print_Memory(p, N);
|
||
}
|
||
}
|
||
}
|
||
void detelex(FF *p,int N) {
|
||
float yy;
|
||
printf("\n输入删除进程的起始地址\n");
|
||
scanf("%f",&yy);
|
||
for(int i =0;i<N;i++){
|
||
if(yy==p[i].address){
|
||
cout<<"已删除"<<"\n";
|
||
p[i+1].state=0;
|
||
}
|
||
};
|
||
}
|
||
void FF_MAIN() {
|
||
int N;
|
||
printf("请输入进程的数量:\n");
|
||
scanf("%d",&N);
|
||
FF *p = new FF[N];
|
||
input(p, N);
|
||
distribution(p,N);
|
||
run (p,N);
|
||
delete [] p;
|
||
}
|
||
int main() {
|
||
FF_MAIN();
|
||
return 0;
|
||
|
||
}
|
||
|