
//参考一下
#include <stdioh>
#include <stdlibh>
#define CPU_TIME 50 //CPU时间片
struct mission //单个任务的结构体
{
char name[20]; //任务名称
int finished; //任务是否已完成,完成为1,未完成为0
int need_time; //任务总共需要的CPU时间
int finished_time;//任务已经执行的CPU时间
};
int work_mission=5; //未完成任务计数
struct mission s[5]={{"one",0,100,0}, //假设有5个任务
{"two",0,380,0},
{"three",0,200,0},
{"four",0,440,0},
{"five",0,230,0}
};
int move_mission(int flag) //任务排序
{
if(work_mission==0)
{
return 1;
}
struct mission temp;
temp=s[0];
int i;
if(flag==1)
{
for(i=1;i<work_mission+1;i++)
{
s[i-1]=s[i];
}
s[work_mission]=temp;
}
else
{
for(i=1;i<work_mission;i++)
{
s[i-1]=s[i];
}
s[work_mission-1]=temp;
}
return 0;
}
int main(int argc, char argv[]) {
struct mission temp;
int finished=0;
int cpu_time_count=0;
while(finished==0)
{
printf("\n第%d个CPU时间片即将执行\n",cpu_time_count/CPU_TIME+1);
printf("\n当前任务队列(即将执行下面第一行任务,执行后将任务移到队列末尾): CPU已用时:%d\n",cpu_time_count);
int i;
for(i=0;i<5;i++)
{
printf("任务名称:%5s 是否已完成:%d 需时间:%03d 已执行时间:%03d 已完成:%032f%%\n",s[i]name,s[i]finished,s[i]need_time,s[i]finished_time,100((float)s[i]finished_time/(float)s[i]need_time));
}
if(s[0]finished==1)
{
finished=1;
break;
}
if((s[0]need_time-s[0]finished_time)>CPU_TIME)
{
s[0]finished_time+=CPU_TIME;
cpu_time_count+=CPU_TIME;
finished=move_mission(0);
}
else
{
cpu_time_count+=(s[0]need_time-s[0]finished_time);
s[0]finished_time=s[0]need_time;
s[0]finished=1;
work_mission-=1;
finished=move_mission(1);
}
}
printf("\n当前任务队列(全部执行完毕): CPU用时:%d\n",cpu_time_count);
int i;
for(i=0;i<5;i++)
{
printf("任务名称:%5s 是否已完成:%d 需时间:%03d 已执行时间:%03d 已完成:%032f%%\n",s[i]name,s[i]finished,s[i]need_time,s[i]finished_time,100((float)s[i]finished_time/(float)s[i]need_time));
}
printf("\n\n总共用了CPU时间: %d",cpu_time_count);
return 0;
}
#include <iostream>
#include <stdioh>
#include <string>
//#include <windowsh>
using namespace std;
//hyugtyftydrtdtrdrrtrdrt
struct Node
{
string name;//进程(作业)名称
int arriveTime;//到达时间
int ServerTime;//服务时间
int leftTime;//the left time
Node link;//指向下一个节点的指针
};
class CProcess
{
public:
CProcess();//构造函数
~CProcess();//析构函数
const CProcess &operator =(const CProcess& p);//重载赋值 *** 作符
void insertNode(string &na,int& at,int& st);//插入新元素(at由小到大)到链表合适的位置
void sort();//按照服务时间由大到小排序
bool isEmpty();//判断是否为空
void destroy();//销毁
int length();//求出链表长度
void print();//打印出元素
void FCFS();//先到先服务
void SJF();//短进程(作业)优先
void RR(int& q);//时间片轮转
void priority();//优先权调度
protected:
Node first;
Node last;
};
const CProcess& CProcess::operator=(const CProcess& p)
{
Node newNode;
Node Current;
if(this!=&p)//避免自己给自己赋值
{
if(first!=NULL)//如果链表不为空
destroy();
if(pfirst==NULL)
{//如果要拷贝的对象为空
this->first = NULL;
this->last = NULL;
}
else
{
Current = pfirst;
first= new Node;
first->name=Current->name;//
first->arriveTime=Current->arriveTime;
first->ServerTime=Current->ServerTime;
first->link =NULL;
last =first;
Current = Current->link;
while(Current!=NULL)
{
newNode = new Node;
newNode->name=Current->name;
newNode->arriveTime=Current->arriveTime;
newNode->ServerTime=Current->ServerTime;
newNode->link=NULL;
last->link=newNode;
last=newNode;
Current = Current->link;
}
}
}
return this;
}
CProcess::CProcess()
{//构造函数
first=NULL;
last=NULL;
}
CProcess::~CProcess()
{
Node temp;
while(first!=NULL)
{
temp=first;
first=first->link;
delete temp;
}
last=NULL;
}
void CProcess::insertNode(string &na,int& at,int& st)
{//按照到达时间升序排序
Node Current;
Node trailCurrent;//指向Current的前一个节点
Node newNode;
bool found;
newNode = new Node;//建立一个新节点
newNode->name=na;
newNode->arriveTime=at;
newNode->ServerTime=st;
newNode->link=NULL;//
if(first==NULL)//如果第一个节点为空(如果是第一次插入元素)
first=newNode;//将新节点赋给第一个节点
else
{//如果不是第一次
Current =first;
found = false;
while(Current!=NULL && !found)
{
if(Current->arriveTime >= at)
found = true;
else
{
trailCurrent = Current;
Current = Current->link;
}
}
if(Current==first)
{
newNode->link = first;
first = newNode;
}
else
{
trailCurrent->link = newNode;
newNode->link = Current;
}
}
}
int CProcess::length()
{
int count =0;//声明变量,并初始化为0(用来记录长度)
Node Current;
Current = first;
while(Current!=NULL)//当前节点不为空,记录值自加,一直向后遍历,
{
count++;
Current = Current->link;
}
return count;//返回长度
}
void CProcess::sort()//按照服务时间,升序排列
{//冒泡排序
string sname;
int at;
int st;
Node Current;//指向当前节点
Node trailCurrent;//指向当前节点的前一个节点
for(trailCurrent=first->link;trailCurrent!=NULL;trailCurrent=trailCurrent->link)//控制条件有问题
{
for(Current=trailCurrent->link;Current!=NULL;Current=Current->link)//控制条件有问题
{
if(trailCurrent->ServerTime > Current->ServerTime)
{
sname=trailCurrent->name;
at=trailCurrent->arriveTime;
st=trailCurrent->ServerTime;
trailCurrent->name=Current->name;
trailCurrent->arriveTime=Current->arriveTime;
trailCurrent->ServerTime=Current->ServerTime;
Current->name=sname;
Current->arriveTime=at;
Current->ServerTime=st;
}
}
}
}
bool CProcess::isEmpty()//判断是否为空
{
return (first==NULL);//如果第一个节点为空,返回值
}
void CProcess::print()
{
Node Current;
Current = first->link;//头节点赋给当前节点
while(Current!=NULL)//当前节点不为空,一直向后遍历打印
{
cout<<Current->name<<" ";
cout<<Current->arriveTime<<" ";
cout<<Current->ServerTime<<"\n";
Current = Current->link;
}
}
void CProcess::destroy()
{
Node temp;//定义一个临时指针变量
while(first!=NULL)
{
temp=first;
first=first->link;
delete temp;
}
last=NULL;
}
void CProcess::FCFS()//先到先服务
{
Node Current;
int T0=0;//完成时间
int T1=0;//周转时间
Current = first->link;//头节点赋给当前节点
while(Current!=NULL)
{
if(T0 < Current->arriveTime)
{
T0=Current->arriveTime+Current->ServerTime;
T1=T0-Current->arriveTime;
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
else
{
T0=Current->ServerTime+T0;
T1=T0-Current->arriveTime;//周转时间等于,完成时间 - 到达时间
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
}
}
void CProcess::SJF()//短进程(作业)优先
{
//首先执行第一个到达的作业
Node Current;
int T0=0;//完成时间
int T1=0;//周转时间
T0=first->link->ServerTime+T0;
T1=T0-first->link->arriveTime;
cout<<first->link->name<<"\t";
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
first->link=first->link->link;//删除
//执行剩下的
sort();//对剩下的排序
Current = first->link;//头节点赋给当前节点
while(Current!=NULL)
{
if(T0 < Current->arriveTime)
{
T0=Current->arriveTime+Current->ServerTime;
T1=T0-Current->arriveTime;
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
else
{
T0=Current->ServerTime+T0;
T1=T0-Current->arriveTime;//周转时间等于,完成时间 - 到达时间
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
}
}
void CProcess::RR(int& q)//时间片轮转
{
cout<<"时间片轮转 *** 作完成!\n";
}
void CProcess::priority()//优先权调度
{
cout<<"优先权 *** 作完成!\n";
}
void main()
{
CProcess p0,p1,p2,p3,p4;
int at,st;
string na;
int judge=1;//控制退出程序
int choice;//控制选择 *** 作
while(judge)
{
cout<<"\n";
cout<<" 说明:本程序适用于单道进程(作业) \n";
cout<<" 请选择您的 *** 作 \n";
cout<<"输入相应的数字,按下(Enter)键!\n";
cout<<" 5录入信息 \n";
cout<<" 1先到先服务 \n";
cout<<" 2短进程(作业)优先 \n";
cout<<" 3时间片轮转 \n";
cout<<" 4优先权(静态)调度 \n";
cout<<" 0退出程序 \n";
cout<<"\n";
cin>>choice;
switch(choice)
{
case 0:
judge=0;
break;
case 5:
cout<<"请输入信息以“end”结束输入!\n";
cout<<"进程名 到达时间 服务时间"<<endl;
while(nacompare("end"))//如果相等则会返回0
{
p0insertNode(na,at,st);
cin>>na>>at>>st;
}
cout<<"录入成功,目前的信息为:\n";
cout<<"进程名 到达时间 服务时间"<<endl;
p0print();
break;
case 1://先到先服务
p1=p0;//拷贝一份
if(p1isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"先到先服务\n";
cout<<"进程名 完成时间 周转时间\n";
p1FCFS();
break;
}
case 2://短作业优先
p2=p0;//拷贝一份
//p2sort();
//p2print();
if(p2isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"短作业优先\n";
cout<<"进程名 完成时间 周转时间\n";
p2SJF();
break;
}
case 3://时间片轮转
p3=p0;//拷贝一份
int q;
if(p3isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"请输入时间片大小";
cin>>q;
cout<<"时间片轮转\n";
cout<<"进程名 完成时间 周转时间\n";
p3RR(q);
break;
}
case 4://优先权
p4=p0;//拷贝一份
if(p4isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"时间片轮转\n";
cout<<"进程名 完成时间 周转时间\n";
p4priority();
break;
}
default:
cout<<"请选择目录中的选项!\n";
break;
}
}
return;
}
void shift(char s, int n)
{
char p;
char q;
int len = strlen(s);
if(len==0) return;
if(n<=0 || n>=len) return;
char s2 = (char)malloc(len + 1); ////////
p = s;
q = s2 + n % len;//这里可以解释一下吗
while(p)
{
q++ = p++;
if(q-s2>=len)
{
q = '\0'; ///////////////
q = s2;
}
}
strcpy(s,s2);
free(s2);
}
q = s2 + n % len;
n % len就是n取len的模,保证偏移的位置不超过整个字符串的长度
q = s2 + n % len;就是让q指向移动后的位置
比如“abcd”进行位移2的轮动,则a从第0位+2移动到第2位,b从第1位+2移动到第3位,c从第2位+2得到4,但是字符串长度为4,取4%4的模为0,所以c移动到第0位,d同理移动到第1位
所以要做的就是,先让p指向a要移动到的位置,然后从字符串起始位置开始拷贝,即从字符a开始,向p指向的位置拷贝,当然,在超过字符串长度的时候,需要,从头开始,就是while循环中if语句做的工作
试试这个,以前我编的时间片轮转
#include<iostreamh>
typedef struct node
{
char name [10];
struct node next;
int needtime;
int servetime;
char state;
};
void IniPCB(int n,node &head,node &finish)
{
node ready=new struct node;
ready=NULL;
for(int i=0;i<n;i++)
{
node p=new struct node;
cout<<"输入进程名:";
cin>>p->name;
cout<<"输入进程需要运行的时间:";
cin>>p->needtime;
p->servetime=0;
p->state='R';
if(ready==NULL)
{
ready=p;
head=p;
}
else
{
ready->next=p;
ready=p;
}
finish=p;
}
finish->next=head;
}
void DoPCB(int n,node &head,node &finish,node &run)
{
run=head;
bool end=0;
node check=new struct node;
cout<<"执行结果如下:"<<endl;
cout<<"进程名"<<" "<<"运行时间"<<" "<<"需要时间"<<" "<<"状态"<<endl;
for(int j=0;j<n;j++)
{
cout<<" "<<head->name<<" "<<head->servetime<<" "<<head->needtime<<" "<<head->state<<endl;
head=head->next;
}
cout<<endl;
int count=0;
while(end!=1)
{
if(run->state=='R')
{
(run->servetime)++;
if((run->servetime)==(run->needtime))
{
run->state='E';
}
count++;
cout<<"第"<<count<<"个时间片:"<<endl;
head=finish->next;
for(int k=0;k<n;k++)
{
cout<<" "<<head->name<<" "<<head->servetime<<" "<<head->needtime<<" "<<head->state<<endl;
head=head->next;
}
cout<<endl;
}
check=run;
for(int x=0;x<n;x++)
{
if(check->state=='E')
check=check->next;
}
if(check==run&&run->state=='E')
{
end=1;
}
run=run->next;
}
}
void main()
{
cout<<"输入进程个数:";
int n;
cin>>n;
node run=new struct node;
node head=new struct node;
node finish=new struct node;
run=NULL;
head=NULL;
finish=NULL;
IniPCB(n,head,finish);
DoPCB(n,head,finish,run);
}
以上就是关于c语言,单处理机进程调度,时间片轮转全部的内容,包括:c语言,单处理机进程调度,时间片轮转、急求 程序代码 c/c++ *** 作系统中的 处理机调度算法、C语言轮换问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)