?? memory.cpp
字號:
if(0==memory.index[i])
{
if(index<0)
index=i;
big++;
if(big==room)
return TRUE;
}
else
{
index=-1;
big=0;
}
}
return FALSE;
}
bool CMemory::Seekpub(int &index) //在PUB中找空間,存放進程
{
for(int i=1;i<=10;i++)
{
if(!memory.pcb[i].full)
{
index=i;
return TRUE;
}
}
return FALSE;
}
bool CMemory::Createprocess(CString name,double processid){
Sprocess pcb;
if(!name.Compare("needa")){
pcb=Cteateother(name);
}
else if(!name.Compare("rdir"))
{
pcb=Cteaterdir();
}
else if(!name.Compare("delete"))
{
pcb=Cteatedelete();
}
else if(!name.Compare("create"))
{
pcb=Cteatechadir();
}
else if(!name.Compare("makdir"))
{
pcb=Cteatemakdir();
}
else if(!name.Compare("deldir"))
{
pcb=Cteatedeldir();
}
else if(!name.Compare("edit"))
{
pcb=Cteateedit();
}
else if(!name.Compare("type"))
{
pcb=Cteatetype();
}
else
{
CString Error="";
pcb=CreateTran(name,&Error);
if(Error.GetLength()>1)
{
AfxMessageBox("編譯有錯");
return FALSE;
}
}
int room=pcb.idictatenum;
int index=0;
if(!Seekroom(index,room))
return FALSE;
int pubindex=0;
if(!Seekpub(pubindex))
return FALSE;
for(int i=0;i<room;i++)
{
memory.index[index+i]=pubindex;
}
memory.pcb[pubindex].address=index;
memory.pcb[pubindex].pcb=pcb;
memory.pcb[pubindex].pcb.iequipment=MD_NULL;//沒有設備
memory.pcb[pubindex].pcb.istate=1; //就緒
memory.pcb[pubindex].full=1;
memory.pcb[pubindex].pcb.ID=processid;
pdlg->Updataindexlist(memory);
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
//進程撤銷
/////////////////////////////////////////////////////////////////////
bool CMemory::Destroyprocess(int processid){ //進程撤銷
int i; //刪除進程所在的位置
for(i=0;i<=10;i++){
if(TRUE==memory.pcb[i].full){ //判斷是否有進程
if((int)memory.pcb[i].pcb.ID==processid){
if(0==i) //如果是閑逛進程
{
memory.pcb[i].pcb.istate=1; //為就緒狀態
memory.pcb[i].pcb.idictaterun=0;
}
else
{
memory.pcb[i].full=FALSE; //刪除進程
int index=memory.pcb[i].address;
if(A==i) //釋放占用的設備
A=0;
for(int j=0;j<2;j++)
{
if(B[j]==i)
B[j]=0;
if(C[j]==i)
C[j]=0;
}
for(j=0;j<memory.pcb[i].pcb.idictatenum;j++)
{
memory.index[index+j]=0; //內存回收
}
}
break;
}
}
}
pdlg->Updatareadylist(memory);
pdlg->Updataindexlist(memory);
pdlg->Updatawaitlist(memory);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
//進程阻塞
/////////////////////////////////////////////////////////////////////
bool CMemory::Blockprocess(Sprocess process){ //進程阻塞
int i;
for(i=0;i<=10;i++){
if(TRUE==memory.pcb[i].full){ //判斷是否有進程
if(memory.pcb[i].pcb.istate==2){ //尋找運行的進程
break;
}
}
}
memory.pcb[i].pcb=process; //現場保護
if(i==0){ //如果為idle進程
memory.pcb[i].pcb.istate=1; //設置為就緒
memory.pcb[i].pcb.idictaterun=0;
}
else{
memory.pcb[i].pcb.istate=0; //設置中斷
memory.pcb[i].pcb.waittime=0; //設置等待時間
}
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
//增加等待進程的等待時間.程序一直運行
/////////////////////////////////////////////////////////////////////
void CMemory::Addprocesswaitime(){
int i;
int num=0; //存儲就緒進程的個數
for(i=1;i<=10;i++){
if(memory.pcb[i].full){ //判斷是否有進程
if(memory.pcb[i].pcb.istate==1){
num++;
}
}
}
for(i=1;i<=10;i++){
if(memory.pcb[i].full){ //判斷是否有進程
if(memory.pcb[i].pcb.istate==0){ //為中斷進程
if(memory.pcb[i].pcb.ihaltreasion==1){//如果為中斷原因為時間
if(memory.pcb[i].pcb.waittime>=num){ //如果等待時間大于就緒進程的個數,則喚醒。
Awakeprocess(i); //喚醒第i個進程
}
else{
memory.pcb[i].pcb.waittime++;
}
}
else{ //如果為其他原因
memory.pcb[i].pcb.waittime++;
}
}
}
}
}
/////////////////////////////////////////////////////////////////////
//進程喚醒
/////////////////////////////////////////////////////////////////////
bool CMemory::Awakeprocess(int i){ //進程喚醒
memory.pcb[i].pcb.istate=1; //修改第i個進程為就緒
memory.pcb[i].pcb.waittime=0;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
//設置主存中進程i的狀態 state.
bool CMemory::Setm_pro_state(int i,int state){ //設置主存中進程i的狀態 state
memory.pcb[i].pcb.istate=state;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
return TRUE;
}
//////////////////////////////////////////////////////////////////////
//顯示主存客戶區
//////////////////////////////////////////////////////////////////////
bool CMemory::IsA() //判斷是否有B設備空閑
{
if(0==A)
return TRUE;
else
return FALSE;
}
bool CMemory::IsB(int &b) //判斷是否有B設備空閑
{
for(int i=0;i<2;i++)
{
if(0==B[i])
{
b=i;
return TRUE;
}
}
return FALSE;
}
bool CMemory::IsC(int &c) //判斷是否有C設備空閑
{
for(int i=0;i<2;i++)
{
if(0==C[i])
{
c=i;
return TRUE;
}
}
return FALSE;
}
void CMemory::Showindex(){ //顯示主存客戶區
pdlg->Updatashow();
}
void CMemory::DealHalt() //處理中斷
{
int num=0; //存進程數;
int i;
int b,c;
for(i=1;i<=10;i++) //計算進程數
{
if(memory.pcb[i].full)
if(0!=memory.pcb[i].pcb.istate)
num++;
}
for(i=1;i<=10;i++)
{
if(memory.pcb[i].full) //如果有進程
{
if(0==memory.pcb[i].pcb.istate) //如果是中斷
{
switch(memory.pcb[i].pcb.ihaltreasion)
{
case HALT_TIME:
memory.pcb[i].pcb.waittime++;
if(memory.pcb[i].pcb.waittime>=num)//如果等等時間超過進程數
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.waittime=0;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
break;
case HALT_NA:
if(IsA()) //如果A設備沒有使用
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_A; //占用了A設備
memory.pcb[i].pcb.waittime=0;
A=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NB:
if(IsB(b)) //如果A設備沒有使用
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_B; //占用了A設備
memory.pcb[i].pcb.waittime=0;
B[b]=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NC:
if(IsC(c)) //如果A設備沒有使用
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_C; //占用了A設備
memory.pcb[i].pcb.waittime=0;
C[c]=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NBC:
if(IsB(b)&&IsC(c))
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_BC; //占用了A設備
memory.pcb[i].pcb.waittime=0;
C[c]=i;
B[b]=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NAC:
if(IsA()&&IsC(c))
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_AC; //占用了A設備
memory.pcb[i].pcb.waittime=0;
C[c]=i;
A=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NAB:
if(IsA()&&IsB(b))
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_AB; //占用了A設備
memory.pcb[i].pcb.waittime=0;
B[b]=i;
A=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NABC:
if(IsA()&&IsC(c)&&IsB(b))
{
memory.pcb[i].pcb.istate=1; //就緒隊列
memory.pcb[i].pcb.iequipment=MD_ABC; //占用了A設備
memory.pcb[i].pcb.waittime=0;
C[c]=i;
A=i;
B[b]=i;
pdlg->Updatareadylist(memory);
pdlg->Updatawaitlist(memory);
}
else
{
memory.pcb[i].pcb.waittime++;
}
break;
case HALT_NOUT:
break;
case HALT_NINPUT:
break;
}
}
}
}
}
bool CMemory::Tran(CString str,Sdictate *di,CString *Error) //編譯指令
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -