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

📄 caozouxitong.txt

📁 操作系统课程设计
💻 TXT
字号:
# include <iostream>
# include<string>
# include<stdlib.h>
using namespace std;
int n;//进程的个数
struct JC
{
	double td;//进程到达时间即提交时间
	double ty;//进程运行时间
	char name;//进程名
	double T;//进程周转时间
	double W;//进程带权周转时间
	double Te;//进程完成时间
	//double TQ;//进程平均周转时间
	//double WQ;//进程平均带权周转时间
	JC *next;
};

JC *create(JC *head)//输入进程信息
{
	JC *p;
	head=new JC;
	p=head;
	p->next=NULL;
	JC *p1;
	cout<<"请输入您的进程数:";
	cin>>n;
	cout<<"请依次输入进程名,到达时间和运行时间:"<<endl;
	for(int i=0;i<n;i++)
	{
		p1=new JC;
		p1->next=NULL;
		cin>>p1->name>>p1->td>>p1->ty;
		p->next=p1;
		p=p->next;
	}
	return head;
}

void print(JC *head)//打印出进程信息
{
	JC *p;
	p=head;
	cout<<"进程名:"<<"到达时间:"<<"运行时间:"<<endl;
	while(p->next!=NULL)
	{
		cout<<p->next->name<<"    "<<p->next->td<<"    "<<p->next->ty<<endl;
		p=p->next;
	}
}

JC *copy(JC *head)//复制链表
{
	JC *p1,*p2,*p3,*PHead;

	p2 =new JC;
	p2->next=NULL;
	PHead=p2;

	p1=head;

	while(p1->next!=NULL)
	{
		p3=new JC;
		p3->next=NULL;
		p3->name=p1->next->name;
        p3->td=p1->next->td;
		p3->ty=p1->next->ty;
		p2->next=p3;
		p2=p2->next;
		p1=p1->next;		
	}
	return PHead;
}


void SljPZ(JC *head)//时间片轮转法计算平均周转时间和平均带权周转时间
{
	double TQ=0.0;//进程平均周转时间
	double WQ=0.0;//进程平均带权周转时间
	JC *p,*q,*p1,*p2;
	q=head;
	p2=p1=p=copy(head);
 	double t=p->next->td;//系统时间
	double a=0.5;//时间片的大小,是可以调整大小的
	double count=0.0;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->next=p1->next;
	p1=p->next;
	//p=p->next;
	while(p!=NULL)
	{

		if(p1->td>t) 
		{
			p2=p1;//保存p1上一个节点
			p1=p1->next;
		}
		if(p1->ty>0 && p1->td<=t)
		{ 
			if(p1->ty<=a)
			{
				cout<<"在时间:"<<t<<"     "<<p1->name<<"运行"<<endl;  //p1固定为执行的位置
				t=t+p1->ty;
				p1->ty=0;
				cout<<"在时间:"<<t<<"     "<<p1->name<<"运行完毕"<<endl;
				p1->Te=0;
			    p1->Te=t;
				q=head;
			    q=q->next;
			    while(q->name!=p1->name)
				{
				   q=q->next;
				}
			    q->Te=p1->Te;
				p2=p1;//保存p1上一个节点
				p1=p1->next;
			}
			else
			{
				cout<<"在时间:"<<t<<"     "<<p1->name<<"运行"<<endl;  //p1固定为执行的位置
		        t=t+a;
		        p1->ty=p1->ty-a;
			    p2=p1;//保存p1上一个节点
		        p1=p1->next;
			}
		}
		if(p1->ty==0)
		{
			if(p2==p1)
				p=NULL;
			else
			{
				p2->next=p1->next;
			    delete p1;
			    p1=p2->next;
			}
		}
	}
	cout<<"所有进程都执行完毕!"<<endl;
	q=head;
	q=q->next;
	while(q!=NULL)
	{
		q->T=0;
		q->T=q->Te-q->td;
		count=count+q->T;
		q=q->next;
	}	
	TQ=count/n;//时间片轮转法进程平均周转时间
    count=0.0;
	q=head;
	q=q->next;
	while(q!=NULL)
	{
		q->W=0;
		q->W=q->T/q->ty;
		count=count+q->W;
		q=q->next;
	}
	WQ=count/n;//时间片轮转法进程平均带权周转时间
	cout<<"平均周转时间为:"<<TQ<<endl;
	cout<<"平均带权周转时间为:"<<WQ<<endl;
}	


void QdPZ(JC *head)//强占式短进程优先算法计算平均周转时间和平均带权周转时间
{
	double TQ=0.0;//进程平均周转时间
	double WQ=0.0;//进程平均带权周转时间
	JC *p,*q;
	q=head;
	q=q->next;
	p=copy(head);
	p=p->next;
	double count=0.0;
	double t=p->td;//系统时间
    JC *p1,*p2,*p3;
	p1=p2=p3=p;
	while(p!=NULL)
	{
		p1=p2=p3=p;
		while((p2->next!=NULL)&&(p2->next->td<=t))//选择当前时间已提交的进程中运行时间最短的执行
		{
			if(p2->next->ty<p1->ty)
			{
				p3=p2;//保存p1上一个节点
				p1=p2->next;
			}
			p2=p2->next;	 	    
		}
		if(t<p1->td) t=p1->td;
		cout<<"时间:"<<t<<"  "<<p1->name<<"  运行!\n"; //p1固定为执行的位置      
		if(p2->next!=NULL&&(p2->next->td<(t+p1->ty)))
		{
			p1->ty=p1->ty-(p2->next->td-t);
			t=p2->next->td;
			cout<<"时间:"<<t<<"  "<<p1->name<<"暂停,剩余运行时间('"<<p1->ty<<"') "<<p2->next->name<<"就绪,此时产生中断"<<endl;
		}
		else
		{
			p1->Te=0;
			t=t+p1->ty;
			p1->Te=t;
			cout<<"时间:"<<t<<"时刻程序"<<p1->name<<"运行完毕"<<endl;
			p1->ty=0;
			q=head;
	        q=q->next;
			while(q->name!=p1->name)
			{
				q=q->next;
			}
			q->Te=0;
			q->Te=p1->Te;
		}
		
		if(p1->ty==0)
		{
			if(p3==p1)
			    p=p1->next;
			else{
			    p3->next=p1->next;
				delete p1;}
		}
	}
	cout<<"此时所有进程都以执行完毕!"<<endl;
	q=head;
	q=q->next;	
	while(q!=NULL)
	{
		q->T=0;
		q->T=q->Te-q->td;
		count=count+q->T;
		q=q->next;
	}
	TQ=count/n;//强占式短进程优先算法进程平均周转时间
	cout<<"平均周转时间为:"<<TQ<<endl;
	count=0.0;
	q=head;
	q=q->next;
	while(q!=NULL)
	{
		q->W=0;
		q->W=q->T/q->ty;
		count=count+q->W;
		q=q->next;
	}
	WQ=count/n;//强占式短进程优先算法进程平均带权周转时间
	cout<<"平均带权周转时间为:"<<WQ<<endl;
}


void ZPrint(JC *head)
{
	JC *p;
	p=head;
	int b;
	int c=1;
	while(c==1)
	{
	cout<<"*******************************"<<endl;
	cout<<"*    选择您要进行的操作序号   *"<<endl;
	cout<<"*1. 时间片轮转法:            *"<<endl;
	cout<<"*2.抢占式进程优先算法:        *"<<endl;
	cout<<"*3.重新输入进程信息:          *"<<endl;
    cout<<"*4.退出:                     *"<<endl;
	cout<<"*******************************"<<endl;
	cin>>b;
	system("cls");
	if(b!=1&&b!=2&&b!=3&&b!=4)
		cout<<"您输入有误,请重试"<<endl;
	else if(b==1)SljPZ(p);
	else if(b==2)QdPZ(p);
	else if(b==3)
	{
		JC *head;
	    head=NULL;
	    head=create(head);
	    print(head);
		p=head;
	}
	else {c=b;break;}
	c=1;
	}
}

int main()
{
	double count;
	JC *head;
	head=NULL;
	head=create(head);
	print(head);
	ZPrint(head);
	return 0;
}

⌨️ 快捷键说明

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