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

📄 processscheduling.cpp

📁 操作系统实验(进程调度和页面置换算法)的原码和电子书
💻 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 + -