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

📄 memory.cpp

📁 C++实现的模拟操作系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Memory.cpp: implementation of the CMemory class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "os.h"
#include "Memory.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMemory::CMemory(CShowosDlg * dlg)
{
	int i=0;
	for(i=0;i<64;i++){//初始化模拟内存(memory),并建立idle进程(闲逛进程)
		memory.index[i]=0;
	}
	for(i=0;i<64;i++){
		for(int j=0;j<8;j++){
			memory.usememory[i][j]=0;
		}
	}
	for(i=1;i<11;i++){
		memory.pcb[i].full=FALSE;
	}
///////////////////////////////////////////////////////////////////////////
	memory.pcb[0].full=TRUE; //建立idle进程(闲逛进程)
	memory.pcb[0].pcb.ID=99999;	
	memory.pcb[0].pcb.idictaterun=0;
	memory.pcb[0].pcb.istate=1;
	memory.pcb[0].pcb.strname="idle";
	memory.pcb[0].pcb.pdictate[0].strename="idle";
	for(i=0;i<8;i++){
		memory.pcb[0].pcb.isavereg[i]=0;
	}
	memory.pcb[0].pcb.idictatenum=1;
	memory.pcb[0].pcb.pdictate[0].strename="idle";
//////////////////////////////////////////////////////////////////////////
	pdlg=dlg;
	A=B[0]=B[1]=C[0]=C[1]=0;  //初始化设备,标为未用
}

CMemory::~CMemory()
{

}
//////////////////////////////////////////////////////////////////////////
//创建指令
///////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateOtherdictate(CString str){//创建其他进程指令
	Sdictate dic;
	dic.strename=str;
	dic.iparstate[0]=0; //无参数
	return dic;
}
///////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateAdddictate(CString str1,CString str2){//创建Add进程指令
	Sdictate dic;
	dic.strename="add";
	dic.iparstate[0]=2; //有两个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.iparstate[2]=2; //第二个参数为CString
	dic.strpar[0]=str1; //第一个参数
	dic.strpar[1]=str2; //第二个参数
	return dic;
}
////////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateAdddictate(CString str1,int i){//创建Add进程指令
	Sdictate dic;
	dic.strename="add";
	dic.iparstate[0]=2; //有二个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.iparstate[2]=1; //第二个参数为int
	dic.strpar[0]=str1; //第一个参数
	dic.ipar[0]=i; //第二个参数
	return dic;
}	
////////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateSubdictate(CString str1,CString str2){//创建Sub进程指令
	Sdictate dic;
	dic.strename="sub";
	dic.iparstate[0]=2; //有两个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.iparstate[2]=2; //第二个参数为CString
	dic.strpar[0]=str1; //第一个参数
	dic.strpar[1]=str2; //第二个参数
	return dic;
}	
////////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateSubdictate(CString str1,int i){//创建Sub进程指令
	Sdictate dic;
	dic.strename="sub";
	dic.iparstate[0]=2; //有二个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.iparstate[2]=1; //第二个参数为int
	dic.strpar[0]=str1; //第一个参数
	dic.ipar[0]=i; //第二个参数
	return dic;
}	
////////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateMovdictate(CString str1,CString str2){//创建Mov进程指令
	Sdictate dic;
	dic.strename="mov";
	dic.iparstate[0]=2; //有两个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.iparstate[2]=2; //第二个参数为CString
	dic.strpar[0]=str1; //第一个参数
	dic.strpar[1]=str2; //第二个参数
	return dic;
}	
////////////////////////////////////////////////////////////////////////////////
Sdictate CMemory::CreateMovdictate(CString str1,int i){//创建Add进程指令
	Sdictate dic;
	dic.strename="mov";
	dic.iparstate[0]=2; //有二个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.iparstate[2]=1; //第二个参数为int
	dic.strpar[0]=str1; //第一个参数
	dic.ipar[0]=i; //第二个参数
	return dic;
}
////////////////////////////////////////////////////////////////////////////////	
Sdictate CMemory::CreateMuldictate(CString str){//创建Mul进程指令
	Sdictate dic;
	dic.strename="mul";
	dic.iparstate[0]=1; //有一个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.strpar[0]=str; //第一个参数
	return dic;
}
////////////////////////////////////////////////////////////////////////////////	
Sdictate CMemory::CreateDivdictate(CString str){//创建Div进程指令
	Sdictate dic;
	dic.strename="div";
	dic.iparstate[0]=1; //有一个参数
	dic.iparstate[1]=2; //第一个参数为CString
	dic.strpar[0]=str; //第一个参数
	return dic;
}	
//////////////////////////////////////////////////////////////////////////
//创建进程子函数
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::CreateFile(){    //创建创建文件进程
	Sprocess spr;
	spr.idictatenum=3;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Create new File"; //进程名
	CString a="ax",b="ax";
	spr.pdictate[0]=CreateAdddictate(a,12);
	a="bx";
	spr.pdictate[1]=CreateMovdictate(a,b);
	spr.pdictate[2]=CreateMuldictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Createcopy(){    //创建拷贝文件进程
	Sprocess spr;
	spr.idictatenum=3;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Copy File"; //进程名
	CString a="copy file",b="needinput";
	spr.pdictate[0]=CreateOtherdictate(a);
	spr.pdictate[1]=CreateOtherdictate(a);
	spr.pdictate[2]=CreateOtherdictate(a);
	return spr;


}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatedelete(){  //创建删除文件进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Delete File"; //进程名
	CString a="Delete file";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatemove(){    //创建移动文件进程
	Sprocess spr;
	spr.idictatenum=3;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Move File"; //进程名
	CString a="Move file",b="needinput";
	spr.pdictate[0]=CreateOtherdictate(a);
	spr.pdictate[1]=CreateOtherdictate(a);
	spr.pdictate[2]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatetype(){    //创建显示文件进程
	Sprocess spr;
	spr.idictatenum=2;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Type File"; //进程名
	CString a="Type file";
	spr.pdictate[0]=CreateOtherdictate(a);
	spr.pdictate[1]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteateedit(){    //创建编辑文件进程
	Sprocess spr;
	spr.idictatenum=3;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Teat File"; //进程名
	CString a="Teat file";
	spr.pdictate[0]=CreateOtherdictate(a);
	spr.pdictate[1]=CreateOtherdictate(a);
	spr.pdictate[2]=CreateOtherdictate(a);
	return spr;
}
///////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatechange(){  //创建改变文件属性进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Change File"; //进程名
	CString a="Change file";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatemakdir(){  //创建建立目录进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Cteatemakdir"; //进程名
	CString a="cteatemakdir";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatechadir(){  //创建改变目录路径进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=1;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Change dir"; //进程名
	CString a="change dir",b="needinput";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteaterdir(){    //创建删除空目录进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Delete dir"; //进程名
	CString a="cteater dir";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatedeldir(){  //创建删除目录进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="Delete dir"; //进程名
	CString a="delete";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
/////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteatefidisk(){  //创建磁盘分区命令进程
	Sprocess spr;
	spr.idictatenum=1;    //指令个数
	spr.idictaterun=0;    //执行位置
	spr.iequipment=0;     //是否分配设备
	for(int i=0;i<8;i++){ //保存设计
		spr.isavereg[i]=0;
	}
	spr.istate=1;         //进程状态:就绪
	spr.waittime=0;       //等待时间
	spr.strname="FiDisk"; //进程名
	CString a="fidisk";
	spr.pdictate[0]=CreateOtherdictate(a);
	return spr;
}
//////////////////////////////////////////////////////////////////////////
Sprocess CMemory::Cteateother(CString name){  //创建其他命令进程
	Sprocess spr;
	if(!name.Compare("needa")||!name.Compare("needb")||!name.Compare("needc")||!name.Compare("needinput")){
		spr.idictatenum=1;    //指令个数
		spr.idictaterun=0;    //执行位置
		spr.iequipment=0;     //是否分配设备
		for(int i=0;i<8;i++){ //保存设计
			spr.isavereg[i]=0;
		}
		spr.istate=1;         //进程状态:就绪
		spr.waittime=0;       //等待时间
		spr.strname=name; //进程名
		CString a=name;
		spr.pdictate[0]=CreateOtherdictate(a);
		return spr;
	}
	else{
		spr.idictatenum=10;    //指令个数
		spr.idictaterun=0;    //执行位置
		spr.iequipment=0;     //是否分配设备
		for(int i=0;i<8;i++){ //保存设计
			spr.isavereg[i]=0;
		}
		spr.istate=1;         //进程状态:就绪
		spr.waittime=0;       //等待时间
		spr.strname=name;     //进程名
		CString a=name,b="ax";
		spr.pdictate[0]=CreateAdddictate(b,21);
		b="bx";
		spr.pdictate[1]=CreateAdddictate(b,20);
		b="cx";
		spr.pdictate[2]=CreateAdddictate(b,10);
		b="cs";
		spr.pdictate[3]=CreateAdddictate(b,30);
		b="ds";
		spr.pdictate[4]=CreateAdddictate(b,15);
		b="bx";
		spr.pdictate[5]=CreateAdddictate(b,13);
		b="ax";
		spr.pdictate[6]=CreateAdddictate(b,21);
		b="cx";
		spr.pdictate[7]=CreateMuldictate(b);
		b="cx";
		spr.pdictate[8]=CreateSubdictate(b,10);
		b="cx";
		spr.pdictate[9]=CreateDivdictate(b);
		return spr;
	}
}
/////////////////////////////////////////////////////////////////////
//创建进程
/////////////////////////////////////////////////////////////////////
bool CMemory::Seekroom(int &index,int room)  //在主存中找room大小空间,index为首地址索引号
{
	int big,i;
	big=0;
	for(i=0;i<64;i++)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -