⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 job.cpp

📁 操作系统课程设计的段式管理的实现程序。包含了分区说明表的建立
💻 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 + -