c语言,单处理机进程调度,时间片轮转

c语言,单处理机进程调度,时间片轮转,第1张

//参考一下

#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语言轮换问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10108911.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存