循环首次适应算法
#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<stdlib.h>
string bai="○";
string hei="●";
class process
{
public:
int name;
int psize;//进程大小
int a;//第几个位置
process(int name,int psize,int a){
this->name=name;
this->psize=psize;
this->a=a;
}
};
class area
{
public:
int asize;//分区大小
int x;//物理位置
area(int asize,int x){
this->asize=asize;
this->x=x;
}
};
vector<string> mycin(int x)
{
vector<string> v;
for(int i=0;i<x;i++){
v.push_back(bai);
}
return v;
}
void mycout(vector<string> v)
{
cout<<"内存占用情况如下:"<<endl;
for(int i=0;i<v.size();i++){
if(i%20==0&&i!=0){
cout<<endl;
}
cout<<v[i];
}
}
process getroom(vector<string>& v,int& s,int k)
{
int x;
vector<string> vv=v;
int ss=s;
cout<<endl<<"请输入进程"<<k<<"所需的内存空间"<<endl;
cin>>x;
int m=1;
for(int i=0;i<v.size();i++){
m=1;
for(int j=0;j<x;j++){
int g=0;
if(v[s]==bai){
v[s]=hei;
s++;i++;g++;
if(s>=v.size()){//判断是否超出空间
s%=v.size();
}
}
else{
if(g==x-1)
m=1;
else{
m=0;v=vv;
}
break;
}
}
if(m==1){
break;
}
while(v[s]!=bai&&i<v.size()){
s++;i++;
if(s>=v.size()){//判断是否超出空间
s%=v.size();
}
}
}
if(m==1){//分配成功
int g=s;
if(g<=0){
g+=v.size();
}
int o=g-x;
if(o<0){
o+=v.size();
}
process p(k,x,o);
return p;
}
else{
s=ss;v=vv;m=0;
cout<<"内存不够,分配失败"<<endl;
process p(-1,0,0);
return p;
}
}
vector<process> cinprocess(vector<string>& v,int& s,int &k,vector<process> p)//输入进程
{
while(1){
mycout(v);
p.push_back(getroom(v,s,k));
if(p[p.size()-1].name==-1)
p.pop_back();
k++;
if(k%3==0){
cout<<"是否继续输入进程:"<<endl;
cout<<"1----是 2----否"<<endl;
int m;cin>>m;
system("cls");
if(m==2) break;
}
}
return p;
}
void coutprocess(vector<process> p)//查看进程情况
{
cout<<endl<<"各进程情况如下:"<<endl;
for(int i=0;i<p.size();i++){
cout<<"进程"<<p[i].name<<" 占用大小:"<<p[i].psize<<" 起始位置是:"<<p[i].a<<endl;
}
}
vector<area> getarea(vector<string> v)//得到分区
{
vector<area> a;
int x=0;
for(int j=0;j<v.size();j++){
if(v[j]==bai){
x++;
if(j==v.size()-1){
area aa(x,j-x+1);
a.push_back(aa);
x=0;
}
}
else{
if(x!=0){
area aa(x,j-x);
a.push_back(aa);
x=0;
}
}
}
return a;
}
void coutarea(vector<area> a)
{
cout<<endl<<"空闲分区情况表如下:"<<endl;
for(int i=0;i<a.size();i++){
cout<<"空闲分区"<<i<<" 长度是"<<a[i].asize<<" 起始地址在 "<<a[i].x<<"位置"<<endl;
}
cout<<endl;
}
void deleteprocess(vector<string> &v,vector<process> &p)//删除进程
{
while(1){
int name,m=0;
process pp(0,0,0);
cout<<endl<<"请输入想要删除的进程名:"<<endl;
cin>>name;
//vector<process>::iterator t=p.begin();
for(int i=0;i<p.size();i++){
if(p[i].name==name){
pp.a=p[i].a;pp.name=p[i].name;pp.psize=p[i].psize;
p.erase(p.begin()+i);
m=1;
break;
}
}
for(int i=0;i<pp.psize;i++){
v[pp.a+i]=bai;
}
if(m==0){
cout<<"未找到该进程,删除失败"<<endl;
}
system("cls");
coutprocess(p);//输出进程
mycout(v);
cout<<endl<<"进程"<<name<<"删除成功,是否继续删除进程:"<<endl;
cout<<"1----是 2----否"<<endl;
int x;cin>>x;
if(x==2) break;
}
}
int main()
{
int k=0,s=0;//进程总数 物理磁盘指针
vector<string> v=mycin(100);//创建物理磁盘
vector<process> p;//创建进程
vector<area> a;//创建分区
//进入菜单
int num=0;
do{
cout<<"1------------调用进程,申请内存------------"<<endl;
cout<<"2------------结束进程,释放内存------------"<<endl;
cout<<"3-------查看进程,磁盘,空闲分区情况-------"<<endl;
cout<<"4-----------------退出系统-----------------"<<endl;
cout<<"请选择:"<<endl;
cin>>num;
switch(num)
{
case 1:
system("cls");
p=cinprocess(v,s,k,p);//得到进程
break;
case 2:
system("cls");
coutprocess(p);//输出进程
mycout(v);
deleteprocess(v,p);
break;
case 3:
system("cls");
a=getarea(v);//得到分区
mycout(v);
coutprocess(p);//输出进程
coutarea(a);//输出分区
break;
case 4:
cout<<"系统成功退出"<<endl;
break;
default:
cout<<"选择错误,请重新选择!"<<endl;
}
}while(num!=4);
}