【急】编一个时间片轮转的单进程调度程序,要求包含五状态,能执行得出结果,用C或C++语言

【急】编一个时间片轮转的单进程调度程序,要求包含五状态,能执行得出结果,用C或C++语言,第1张

/* 

______________________________ 

进程调度模拟程序设计说明: 

选择算法以后,进程由用户创建。 

______________________________ 

*/  

#include<stdio.h>  

#include<stdlib.h>  

#define Left 75  

#define Right 77  

  

typedef struct node{  

    int ID       //进程ID  

    int PRIORITY //进程优先数  

    int CPUTIME  //进程占用CPU的时间  

    int ALLTIME  //进程所需要时间  

    char STATE   //进程当前状态  

    struct node *next//指向下一个进程  

}PRO  

  

int CHIP //时间片数  

int NUM  //进程个数  

int A=0    // 0代表先来先服务算法 1时间片轮转调度算法  

PRO *p //进程队列队头  

  

void choose(){//选择  

    char ch  

    while(1){  

        switch(A){  

            case 0:printf("→[先来先服务算法]  [时间轮算法]  [优先级服务算法]")break    

            case 1:printf("  [先来先服务算法]→[时间轮算法]  [优先级服务算法]")break  

            case 2:printf("  [先来先服务算法]  [时间轮算法]→[优先级服务算法]")break  

        }  

        ch=getch()  

        if(ch==Left) A--  

        if(ch==Right) A++  

        if(A<0) A=2  

        if(A>2) A=0  

        if(ch=='\r') break  

        system("cls")  

    }  

}  

int num(){//计算所有进程是否都调度完毕 返回为完成进程个数  

    int i=NUM  

    PRO *t1  

    t1=p  

    while(t1!=NULL){  

        if(t1->ALLTIME==0)  

            i--  

        t1=t1->next  

    }  

    return i  

}  

PRO *_sort(PRO *h){//链表排序子函数  

    PRO *p,*max  

    max=h  

    p=h  

    while(p->next!=NULL){//找max的节点  

        p=p->next  

        if(max->PRIORITY<p->PRIORITY)  

            max=p  

    }  

    p->next=h//形成环形链表  

    while(p->next!=max)//找出min节点前面的节点并让它指向NULL  

        p=p->next  

    p->next=NULL  

    h=max  

    return h  

}  

PRO *sort(PRO *h){//链表排序  

    int i=4  

    PRO *p  

    if(h==NULL)  

        return h  

    h=_sort(h)  

    p=h  

    while(p->next!=NULL){  

        p->next=_sort(p->next)  

        p=p->next  

    }  

    return h  

}  

int show(){//显示当前状态  

    PRO *t1  

    t1=p  

    printf("ID  PRIORITY  CPUTIME  ALLTIME  STATE\n")    

    while(t1!=NULL){  

        printf("P%-3d%-10d%-9d%-7d  %c\n",t1->ID,t1->PRIORITY,t1->CPUTIME,t1->ALLTIME,t1->STATE)  

        t1=t1->next  

    }  

    printf("-------------------------------------\n\n")  

}  

void queue(){//先来先服务算法  

    int t  

    PRO *t1=p  

    printf("先来先服务算法,初始状态到每一个时间片用完状态:\n")  

    show()  

    while(t1!=NULL){  

        t=CHIP  

        while(t!=0&&t1!=NULL){  

        t--  

        t1->ALLTIME--  

        t1->CPUTIME++  

        t1->STATE='E'  

        if(t1->ALLTIME==0){//进程调度完毕  

            t1->STATE='F'  

            t1=t1->next  

            }  

        }  

        show()  

    }  

}  

void time(){//时间片轮转调度算法  

    int t,i  

    PRO *t1=p  

    printf("时间片轮转调度算法,初始状态到每一个时间片用完状态:\n")  

    show()  

    while(1){  

        t=CHIP  

        while(t!=0&&t1!=NULL&&t1->ALLTIME!=0){  

            t--  

            t1->ALLTIME--  

            t1->CPUTIME++  

            t1->STATE='E'  

            if(t1->ALLTIME==0){//进程调度完毕  

                t1->STATE='F'  

                t=CHIP//剩下时间段不要  

            }  

        }  

        show()  

        if(t1->STATE!='F')  

            t1->STATE='R'  

        if(t1!=NULL)  

            t1=t1->next  

        if(t1==NULL)  

                t1=p  

        i=num()  

        if(i==0)//i等于0,表示所有进程运行完毕  

            break  

          

    }  

}  

void priority(){//优先级算法  

    int t  

    PRO *t1  

    p=sort(p)  

    t1=p  

    printf("优先级算法,初始状态到每一个时间片用完状态:\n")  

    show()  

    while(t1!=NULL){  

        t=CHIP  

        while(t!=0&&t1!=NULL){  

        t--  

        t1->ALLTIME--  

        t1->CPUTIME++  

        t1->STATE='E'  

        if(t1->ALLTIME==0){//进程调度完毕  

            t1->STATE='F'  

            t1=t1->next  

            }  

        }  

        show()  

    }  

}  

create_process(){//创建进程  

    PRO *t1,*t2  

    int i=1  

    system("cls")  

    printf("请输入时间片数:")  

    scanf("%d",&CHIP)  

    printf("请输入想创建进程个数(大于1):")  

    scanf("%d",&NUM)  

    p=(PRO *)malloc(sizeof(PRO))  

    t1=p  

    t1->ID=i  

    t1->STATE='R'  

    t1->CPUTIME=0//开始创建时 占用cpu时间为0  

    printf("请输入进程P%d的优先级:",i)  

    scanf("%d",&t1->PRIORITY)  

    printf("请输入进程P%d的需要运行时间:",i)  

    scanf("%d",&t1->ALLTIME)  

    while(i++<NUM){  

        t2=(PRO *)malloc(sizeof(PRO))  

        t1->next=t2  

        t2->ID=i  

        t2->STATE='R'  

        t2->CPUTIME=0//开始创建时 占用cpu时间为0  

        printf("请输入进程P%d的优先级:",i)  

        scanf("%d",&t2->PRIORITY)  

        printf("请输入进程P%d的需要运行时间:",i)  

        scanf("%d",&t2->ALLTIME)  

        t1=t2  

    }  

    t1->next=NULL  

}  

int main(){  

    choose()//先选择算法  

    create_process()//再创建进程  

    system("cls")  

    if(A==0)  

        queue()  

    if(A==1)  

        time()  

    if(A==2)  

        priority()  

    return 0  

}

这个是我以前写的,里面的算法比较多,不要的你可以删掉。

#include<stdlib.h>

#define MAX 5//进程数量

#define RR 2//时间片大小

/*时间片轮转算法*/

struct pro

{

int num

int arriveTime

int burst

int rt //记录进程被运行的次数

struct pro *next

}

int TOTALTIME //记录所有进程的总时间

//函数声明

struct pro* creatList()

void insert(struct pro *head,struct pro *s)

struct pro* searchByAT(struct pro *head,int AT)

void del(struct pro* p)

int getCount(struct pro *head,int time)

struct pro* searchEnd(struct pro *head)

void move(struct pro *headF,struct pro *headT,int n)

struct pro* creatList()//创建链表,按照进程的到达时间排列,记录所有进程的信息

{

struct pro* head=(struct pro*)malloc(sizeof(struct pro))

head->next=NULL

struct pro* s

int i

TOTALTIME=0

for(i=0i<MAXi++)

{

s=(struct pro*)malloc(sizeof(struct pro))

printf("请输入进程名:\n")

scanf("%d",&(s->num))

printf("请输入到达时间:\n")

scanf("%d",&(s->arriveTime))

printf("请输入运行时间:\n")

scanf("%d",&(s->burst))

TOTALTIME+=s->burst //计算总时间

s->rt=1 //rt的初始值为1

s->next=NULL

insert(head,s)

}

return head //到达队列中的进程按照其到达时间的先后顺序排列

}

void insert(struct pro *head,struct pro *s)//插入节点

{

struct pro *p=searchByAT(head,s->arriveTime)

s->next=p->next

p->next=s

return

}

struct pro* searchByAT(struct pro *head,int AT)//查找第一个到达时间大于等于AT的节点,返回其前一个指针

{

struct pro *p,*q

p=head

q=head->next

while(q!=NULL&&q->arriveTime<=AT)

{

p=q

q=q->next

}

return p

}

void del(struct pro* p)//删除p的下一个节点

{

struct pro *tmp

tmp=p->next

p->next=tmp->next

free(tmp)

return

}

int getCount(struct pro *head,int time)//察看在time之前到达但未移动到运行队列的进程数量

{

int count=0

struct pro *s,*t

s=head

t=s->next

while(t!=NULL&&t->arriveTime<=time)

{

s=t

t=t->next

count++ //count记录当前时刻到达的进程数

}

return count

}

struct pro* searchEnd(struct pro *head)//查找并返回循坏队列的尾节点的前一个节点

{

struct pro *p,*q

p=head

q=head->next

while(q->next!=head)

{

p=q

q=q->next

}

return p

}

void move(struct pro *headF,struct pro *headT,int n)//将headF后的n个节点移动到循环队列headT中

{

struct pro *r,*s,*t

s=headF

t=s->next

r=t //r记录要移动的第一个节点

while(n>1)

{

t=t->next

n--

}

s->next=t->next //以上完成从原队列中摘除相关节点,r,t分别为第一个和最后一个节点

s=searchEnd(headT)

t->next=s->next

s->next=r

}

void run(struct pro *head)

{

int time=0 //记录当前时间

int newarrive//新到达进程数

struct pro *runhead=(struct pro*)malloc(sizeof(struct pro))

runhead->next=runhead //创建新的循环链表,存放当前就绪队列中的进程

struct pro *p,*q

p=runhead

q=p->next //q记录当前应当运行的进程

while(time<=TOTALTIME)

{

newarrive=getCount(head,time)

if(newarrive>0)

move(head,runhead,newarrive) //将head后的newarrive个节点移动到runhead队列中

if(runhead->next==runhead)//就绪队列中没有进程

time++

else if(q==runhead)

{

p=q

q=q->next

}

else

{

printf("进程名:%d\n",q->num)

printf("到达时间:%d\n",q->arriveTime)

if(q->rt==1)

printf("响应时间:%d\n",time-q->arriveTime)

else

printf("第%d次运行开始时间:%d\n",q->rt,time)

if(q->burst<=RR)

{

time+=q->burst

printf("第%d次运行结束时间:%d\n",q->rt,time)

printf("周转时间:%d\n",time-q->arriveTime)

printf("************************************\n")

struct pro *tmp=q

q=q->next

p->next=q

free(tmp)

}

else//q->burst>RR

{

time+=RR

printf("第%d次运行结束时间:%d\n",q->rt,time)

printf("************************************\n")

q->burst-=RR

q->rt++

p=q

q=q->next

}

}

}

}

void main()

{

struct pro *head=creatList()

printf("当前时间片大小为:%d\n",RR)

run(head)

}

#include<stdio.h>

struct pcb

{

char name

int time

}

void main()

{

int n,i,j,flag=1

struct pcb a[100]

printf("输入程序个数:")

scanf("%d",&n)

getchar()/*接收回车*/

for(i=0i<ni++)

{

printf("输入程序的名字:如A B C...\n")

scanf("%c",&a[i].name)

getchar()/*接收回车*/

printf("输入占用的时间片:")

scanf("%d",&a[i].time)

getchar()/*接收回车*/

}

i=0

while(flag &&n>0)

{

if(a[i].time!=0)

{

printf("%c",a[i].name)

a[i].time--

}

for(j=0j<nj++)

if(a[j].time)

{

flag=1

break

}

else

flag=0

i=(++i)%n

}

}

调试通过...


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

原文地址: https://outofmemory.cn/yw/11940845.html

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

发表评论

登录后才能评论

评论列表(0条)

保存