📄 job.cpp
字号:
#include"job.h"
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
PID Job::pidIndex=PID();
BlockTable btable;//已分配表
FreeTable ftable; //空闲分区表
int JobSize=3000;
int randInt(int low,int high,int base)//产生low-high范围内是base整数倍的整数
{
if(base==0)
base=1;
low=(low+base-1)/base;
high/=base;
double b=((double)rand())/RAND_MAX;
return ((int)(b*(high-low)+low))*base;
}
BlockItem::BlockItem(int sAddr,int len,PID pid)
{
this->sAddr=sAddr;
this->len=len;
this->pid=pid;
}
int BlockItem::output()
{
cout<<setw(10)<<sAddr<<setw(20)<<len<<setw(20)<<pid<<endl;
return 1;
}
FreeItem::FreeItem(int sAddr,int len)
{
this->sAddr=sAddr;
this->len=len;
}
int FreeItem::output()
{
cout<<setw(10)<<sAddr<<setw(20)<<len<<endl;
return 1;
}
bool cmpFreeItem(FreeItem& f1,FreeItem& f2)//按大小比较两个空闲分区
{
return f1.len<f2.len;
}
Job::Job(PID pid,int length)
{
this->pid=pid;
this->length=length;
startAddress=-1;
}
int Job::output()
{
cout<<setw(10)<<pid<<setw(20)<<startAddress<<setw(20)<<length<<endl;
return 1;
}
PID Job::initJob()//随机初始化作业
{
pid=pidIndex++;
length=randInt(1,JobSize,1);
return pid;
}
int Job::Alloc()//给作业分配内存
{
sort(ftable.begin(),ftable.end(),cmpFreeItem);
FreeTable::iterator it=ftable.begin();
while(it!=ftable.end()){
if(it->len>=length){
BlockItem bitem(it->sAddr,length,pid);
btable.push_back(bitem);
startAddress=it->sAddr;
if(it->len==length)
ftable.erase(it);
else{
it->sAddr+=length;
it->len-=length;
}
return startAddress;
}
it++;
}
return -1;
}
int Job::Free()//回收作业内存
{
int addr=startAddress;
int endaddr=startAddress+length;
BlockTable::iterator bit=btable.begin();
while(bit!=btable.end()){
if(bit->sAddr==addr){
btable.erase(bit);//从分配表中删除
FreeTable::iterator fit=ftable.begin();
bool pref=false,postf=false;
FreeTable::iterator preit=ftable.end(),postit=preit;
while(fit!=ftable.end()&& !(pref && postf)){//在空闲表中查找,看是否存在前驱或后驱
if(fit->sAddr+fit->len==addr){//有前驱
preit=fit;
pref=true;
}
if(endaddr==fit->sAddr){//有后驱
postit=fit;
postf=true;
}
fit++;
}
if(pref&&!postf)//合并空闲块
preit->len+=length;
else if(postf&&!pref){
postit->sAddr=addr;
postit->len+=length;
}
else if(postf&&pref){
preit->len+=length;
preit->len+=postit->len;
ftable.erase(postit);
}
else//既没前驱又没后驱
ftable.push_back(FreeItem(addr,length));
startAddress=-1;
return addr;
}
bit++;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -