📄 processscheduling.cpp
字号:
// ProcessScheduling.cpp : Defines the entry point for the console application
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#include "iomanip.h"
bool bProcessCreated();
bool bDisplay();
bool ExecuteRRAlgorithm();
bool ExecutePriorityAlgorithm();
bool Restore();
struct PCB
{
int m_iProcessID;//process id
char m_strProcessName[10];// process name
int m_iCPUTime;
int m_iRemainingTime;
int m_iState;//0 means ready, 1 means running, don't consider block state now
int m_iPriority;//a bigger number means a higher priority
struct PCB *next;
};
struct PCB *pReadyQueue=NULL;
int iProcessID=0;
int main(int argc, char* argv[])
{
bProcessCreated();
bDisplay();
ExecuteRRAlgorithm();
Restore();
ExecutePriorityAlgorithm();
return 0;//return a value
}
bool bProcessCreated()
{
char strProcessName[10];
int iCPUTime;
int iState;
int iPriority;
struct PCB *pTemp;
struct PCB *pCurrentProcess;
int iProcessNumber;
cout<<"please input the process number you want to create:";
cin>>iProcessNumber;
cout<<endl<<endl;
for (int i=0;i<iProcessNumber;i++)
{
try
{
pTemp=new struct PCB;//requests memory
}
catch(...)//catch errors for memory allocation
{
cout<<"the memory is not enough! Creating process failed!";
return false;
}
pTemp->m_iProcessID=iProcessID;//allocates ID for the new process
iProcessID++;
cout<<"please input the name of the process:";
cin>>strProcessName;
cout<<"please input the CPU time used by the process:";
cin>>iCPUTime;
cout<<"please input the priority of the process:";
cin>>iPriority;
cout<<endl;
iState=0;
pTemp->m_iCPUTime=iCPUTime;
pTemp->m_iPriority=iPriority;
pTemp->m_iState=iState;
pTemp->m_iRemainingTime=iCPUTime;
strcpy(pTemp->m_strProcessName,strProcessName);
if(iProcessID==1)
{
pReadyQueue=pTemp;//ready queue
pCurrentProcess=pTemp;
pCurrentProcess->next=NULL;
}
else
{
pCurrentProcess->next=pTemp;
pCurrentProcess=pTemp;
pCurrentProcess->next=NULL;
}
}
return true;
}
bool bDisplay()
{
struct PCB *pTemp=NULL;
pTemp=pReadyQueue;
if(pTemp==NULL)
cout<<"no process exists!";
else
{
cout<<endl;
cout<<setw(5)<<"PID"<<setw(20)<<"Process-Name"<<setw(15)<<"CPU-Time"<<setw(15)<<"Priority";
cout<<endl;
while(pTemp!=NULL)
{
cout<<setw(5);
cout<<pTemp->m_iProcessID;
cout<<setw(20);
cout<<pTemp->m_strProcessName;
cout<<setw(15);
cout<<pTemp->m_iCPUTime;
cout<<setw(15);
cout<<pTemp->m_iPriority;
cout<<endl;
pTemp=pTemp->next;
}
}
cout<<endl;
return true;
}
bool ExecuteRRAlgorithm()
{
int iQuantum;
bool bAllRunned=false;
struct PCB *pTemp=NULL;
pTemp=pReadyQueue;
if(pTemp==NULL)
{
cout<<"no process exists!";
return false;
}
cout<<"please input quantum:";
cin>>iQuantum;
cout<<endl;
cout<<"RR scheduling starts......";
cout<<endl;
while(!bAllRunned)
{
bAllRunned=true;
pTemp=pReadyQueue;
while(pTemp!=NULL)
{
if(pTemp->m_iRemainingTime>iQuantum)
{
pTemp->m_iRemainingTime=pTemp->m_iRemainingTime-iQuantum;
cout<<setw(5);
cout<<pTemp->m_iProcessID;
cout<<setw(20);
cout<<pTemp->m_strProcessName;
cout<<setw(1);
cout<<":";
cout<<setw(5);
cout<<iQuantum;
cout<<endl;
pTemp=pTemp->next;
bAllRunned=false;
}
else if(0<pTemp->m_iRemainingTime && pTemp->m_iRemainingTime<=iQuantum)
{
cout<<setw(5);
cout<<pTemp->m_iProcessID;
cout<<setw(20);
cout<<pTemp->m_strProcessName;
cout<<setw(1);
cout<<":";
cout<<setw(5);
cout<<pTemp->m_iRemainingTime;
cout<<endl;
pTemp->m_iRemainingTime=0;
pTemp=pTemp->next;
bAllRunned=false;
}
else if(pTemp->m_iRemainingTime==0)
{
pTemp=pTemp->next;
}
else
{
;
}
}
cout<<endl;
}
return true;
}
bool Restore()
{
struct PCB *pTemp=NULL;
pTemp=pReadyQueue;
while (pTemp!=NULL)
{
pTemp->m_iRemainingTime=pTemp->m_iCPUTime;
pTemp=pTemp->next;
}
return true;
}
bool ExecutePriorityAlgorithm()
{
struct PCB *pTemp=NULL;
struct PCB *pFirst=NULL;
struct PCB *pSecond=NULL;
struct PCB temp;
pTemp=pReadyQueue;
pFirst=pTemp;
pSecond=pFirst->next;
while (pFirst!=NULL)
{
while (pSecond!=NULL)
{
if (pFirst->m_iPriority<pSecond->m_iPriority)
{
temp.m_iCPUTime=pSecond->m_iCPUTime;
temp.m_iPriority=pSecond->m_iPriority;
temp.m_iProcessID=pSecond->m_iProcessID;
temp.m_iRemainingTime=pSecond->m_iRemainingTime;
temp.m_iState=pSecond->m_iState;
strcpy(temp.m_strProcessName,pSecond->m_strProcessName);
pSecond->m_iCPUTime=pFirst->m_iCPUTime;
pSecond->m_iPriority=pFirst->m_iPriority;
pSecond->m_iProcessID=pFirst->m_iProcessID;
pSecond->m_iRemainingTime=pFirst->m_iRemainingTime;
pSecond->m_iState=pFirst->m_iState;
strcpy(pSecond->m_strProcessName,pFirst->m_strProcessName);
pFirst->m_iCPUTime=temp.m_iCPUTime;
pFirst->m_iPriority=temp.m_iPriority;
pFirst->m_iProcessID=temp.m_iProcessID;
pFirst->m_iRemainingTime=temp.m_iRemainingTime;
pFirst->m_iState=temp.m_iState;
strcpy(pFirst->m_strProcessName,temp.m_strProcessName);
}
pSecond=pSecond->next;
}
pFirst=pFirst->next;
if (pFirst!=NULL)
pSecond=pFirst->next;
else
pSecond=NULL;
}
cout<<"Prioriy scheduling starts......";
cout<<endl;
while(pTemp!=NULL)
{
cout<<setw(5);
cout<<pTemp->m_iProcessID;
cout<<setw(20);
cout<<pTemp->m_strProcessName;
cout<<setw(1);
cout<<":";
cout<<setw(5);
cout<<pTemp->m_iRemainingTime;
cout<<endl;
pTemp=pTemp->next;
}
cout<<endl;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -