| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3307 人关注过本帖, 1 人收藏
标题:进程调度算法实验代码
只看楼主 加入收藏
heishu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:42
专家分:131
注 册:2012-9-7
结帖率:50%
收藏(1)
 问题点数:0 回复次数:0 
进程调度算法实验代码
好久没来了发个贴,这是老师的实验课题目。没有什么特别的算法,就按老师给的打代码但里面有好多的错误要自己改,下面是我改后的代码,毕竟是第一次写这么长的代码,就贴出来分享一下:
程序代码:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define END 0
#define BLOCKING 1
#define AREADY 2
#define RUNNING 3
int m=1;
void jiemian();
typedef struct node
{
char name[6];
int status;
int ax;
int pc;
int psw;
struct node *next;

}pcb;
pcb *head;
pcb *createprocess(pcb *head1)
{
    pcb *p,*q;
    int a,n,u=1,v,r,y;
    char ID[6],s,cache[50],cache2[50];
    q=NULL;
    printf("\n       请输入所创建的pcb的内容:\n");
    printf("\n       pcb的id是(最多5个字符):\n");
    scanf("%50s",cache);
    for(v=0;v<5;v++)
        ID[v]=cache[v];
    ID[5]='\0';
    printf("\n       pcb的时间片是(0-99的整数): ");
    scanf("%d",&a);
    getchar();
    printf("\n       pcb的优先数是(0-99的整数): ");
    scanf("%d",&n);
    getchar();
    while(u!=0)
    {
        p=(pcb *)malloc(sizeof(pcb));
        for(r=0;r<6;r++)
            p->name [r]=ID[r];
        p->ax =a;
        p->pc =m++;
        p->psw =n;
        p->status =AREADY;
        if(head1==NULL)
            head1=p;
        else
            q->next=p;
        q=p;
        printf("\n        已创建一个新的进程!!!\n");
        do
        {
            printf("\n       要继续创建新的进程吗?(y需要/n退出)");
            scanf("%c",&s);
            getchar();
            if(s=='n')
                goto point;
       
        }while(s!='y');
        printf("\n        请输入所创建进程pcb的内容:\n");
        printf("\n        pcb的id是(最多5个字符):\n");
        scanf("%50s",cache2);
        for(y=0;y<5;y++)
            ID[y]=cache2[y];
        ID[5]='\0';
        printf("\n        pcb的所需时间片个数是(1-99整数):");
        scanf("%d",&a);
        getchar();
        printf("\n        pcb的优先数十(1-9整数):");
        scanf("%d",&n);
        getchar();
       
        }
point: if(q!=NULL)
           q->next =NULL;
       q=head1;
       printf("\n         进程名|进程状态|优先数|序号|时间片个数\n");
       while(q)
       {
           printf("       ");
           printf("%6s",q->name );
           printf("   进程就绪");
           printf("%6d",q->psw );
           printf("%8d",q->pc );
           printf("%8d",q->ax );
           printf("\n");
           printf(" ");
           q=q->next ;
       }
       return head1;

}
void processview(pcb *head3)
{
    pcb *q;
    q=NULL;
    if(q!=NULL)
    q->next=NULL;
    q=head3;
    printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
    while(q)
    {
        printf("        ");
        printf("%6s",q->name);
        printf("   进程就绪");
        printf("%6d",q->psw);
        printf("%8d",q->pc);
        printf("%8d",q->ax);
        printf("\n");
        printf("  ");
        q=q->next;
        }
printf("\n    请按<ENTER>返回主界面>>>>>\n");
getchar();
jiemian();
}
void processfifo(pcb *head2)
{
    pcb *p;
    int i=0,g=0,d=0,l=1,count=0,w,u,t,hh,z;
    char h,check;
    pcb fafs[MAX],fempx[MAX],fafsz[4];
    p=head2;
    printf("\n    进程调度采用先来先服务算法\n");
    printf("\n     运行进程序列如下\n");
    printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
    while(p!=NULL)
    {
            printf("       ");
           printf("%6s",p->name );
           printf("   进程就绪");
           printf("%6d",p->psw );
           printf("%8d",p->pc );
           printf("%8d",p->ax );
           printf("\n");
           p=p->next;
    }
p=head2;
while(p!=NULL)
{
    for(w=0;w<6;w++)
        fafs[i].name[w]=p->name[w];
    fafs[i].status=p->status;
    fafs[i].psw=p->psw;
    fafs[i].pc=p->pc;
    fafs[i].ax=p->ax;
    i++;
    p=p->next;
    }
while(l!=0)                          //队列运行
{
    for(u=0;u<i;u++)
    {
        printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
        fafs[u].status=RUNNING;
        printf("        ");
        printf("%6s",fafs[u].name);
        printf("   正在运行");
        printf("%6d",fafs[u].psw );
           printf("%8d",fafs[u].pc );
           printf("%8d",fafs[u].ax );
           printf("\n");
    do
    {
        printf("\n          请按<Y>模拟进程运行,按<N>推出模拟:\n");
        scanf("%c",&check);
        getchar();
        if(check=='n')
        jiemian();
        }while(check!='y');
        fafs[u].status=rand()%3;
        printf("\n          ");
        printf("%6s",fafs[u].name);
        if(fafs[u].status==END)
        printf("    进程结束");
        else if(fafs[u].status==AREADY)
        {
            printf("  进程就绪");
            fempx[g]=fafs[u];
            g++;
            }
    else
    {
        printf("     进程阻塞");
        fafsz[d]=fafs[u];
        d++;
    }   
            printf("%6d",fafs[u].psw );
           printf("%8d",fafs[u].pc );
           printf("%8d",fafs[u].ax );
           printf("\n");
           if(d>=4)
           {
               fempx[g]=fafsz[0];
               g++;
               fafsz[0]=fafsz[1];
               fafsz[1]=fafsz[2];
               fafsz[2]=fafsz[3];
               d=3;
          
           }
    }
if(count==3)
{
    if(d!=0)
    {
        fempx[g]=fafsz[0];
        g++;
        for(hh=0;hh<(d-1);hh++)
        {
            fafsz[hh]=fafsz[hh+1];
        }
    d--;
    count=0;
    }
}
if(g==0)
i=g;
else
for(i=0;i<g;i++)
fafs[i]=fempx[i];
g=0;
printf("\n       结束本次调度后的就绪队列如下:\n");
printf("    -------------------------");
printf("\n       进程名|进程状态|优先数|序号|时间片个数\n");
printf("       ----------------------\n");
for(t=0;t<i;t++)
{
    printf("        ");
    printf("%6s",fafs[t].name);
    printf("   进程就绪");
    printf("%6d",fafs[t].psw );
     printf("%8d",fafs[t].pc );
     printf("%8d",fafs[t].ax );
    printf("\n");
}
printf("\n       请按<ENTER>浏览阻塞队列:\n");
getchar();
printf("\n       结束本次调度后的阻塞队列如下:\n");
printf("    -------------------------");
printf("\n       进程名|进程状态|优先数|序号|时间片个数\n");
printf("       ----------------------\n");
for(z=0;z<d;z++)
{
    printf("        ");
    printf("%6s",fafsz[z].name);
    printf("   进程阻塞");
    printf("%6d",fafsz[z].psw );
     printf("%8d",fafsz[z].pc );
     printf("%8d",fafsz[z].ax );
    printf("\n");   
}
if(d>=1)
count++;
if(count==4)
count=3;
if(i==0&&d==0)
{
    printf("\n     模拟完毕!请按<ENTER>返回主界面>>>\n");
    getchar();
    jiemian();
    }
do
{
    printf("\n        请按<Y>继续模拟进程运行,按<N>推出模拟:\n");
    scanf("%c",&h);
    getchar();
    if(h=='n')
    jiemian();
}while(h!='y');
}
jiemian();
}
void youxian(pcb *head4)    //优先级法
{
    pcb *p;
    pcb temp;
    int i=0,g=0,d=0,l=1,count=0,a,b,kk,t,w,z,hh,k,f;
    pcb  ffs[MAX],tempx[MAX],ffsz[4];
    char h,check;
    p=head4;
    printf("\n        进程调度采用优先级算法>\n");
    printf("          将对如下进程队列进行调度:\n");
    printf("\n        进程名|进程状态|优先数|序号|时间片个数\n");
    while(p!=NULL)
    {
        printf("          ");
        printf("%6s",p->name);
        printf("    进程就绪");
        printf("%6d",p->psw);
        printf("%8d",p->pc);
        printf("%8d",p->ax);
        printf("\n");
        p=p->next;
    }
p=head4;
while(p!=NULL)
{
    for(w=0;w<6;w++)
        ffs[i].name[w]=p->name[w];
    ffs[i].status=p->status;
    ffs[i].psw=p->psw;
    ffs[i].pc=p->pc;
    ffs[i].ax=p->ax;
    i++;
    p=p->next;
   
}

while(l!=0)                                   //排序
{
    for(a=1;a<i;a++)
    {
        for(b=0;b<i-1-a;b++)
        {
            if(ffs[b].psw>ffs[b+1].psw)
            {
                temp=ffs[b];
                ffs[b]=ffs[b+1];
                ffs[b+1]=temp;
            }
        }
    }
do
{
    printf("\n         请按<ENTER>模拟进程运行,按<N>退出模拟:\n");
    scanf("%c",&check);
    getchar();
    if(check=='n')
        jiemian();
}while(check!='y');
printf("              按优先数排序后的状态:\n");
printf("\n            进程名|进程状态|优先数|序号|时间片个数\n");
for(k=0;k<i;k++)
{
    printf("           ");
    printf("%6s",ffs[k].name);
    printf("      进程就绪");
    printf("%6d",ffs[k].psw);
    printf("%8d",ffs[k].pc);
    printf("%8d",ffs[k].ax);
    printf("\n");
}
do
{
    printf("\n          请按<Y>模拟进程运行,按<N>退出模拟");
    scanf("%c",&h);
    getchar();
    if(h=='n')
        jiemian();
}while(h!='y');
for(f=0;f<i;f++)
{
    ffs[f].psw=(rand()%9+1);
    ffs[f].status=rand()%3;
    if(ffs[f].status==AREADY)
    {
        tempx[g]=ffs[f];
        g++;
    }
else if(ffs[f].status==BLOCKING)
{
    ffsz[d]=ffs[f];
    d++;
    if(d>=4)
    {
        tempx[g]=ffsz[0];
        g++;
        ffsz[0]=ffsz[1];
        ffsz[1]=ffsz[2];
        ffsz[2]=ffsz[3];
        d=3;
    }
}   
}
if(count==3)
{
    if(d!=0)
    {
        tempx[g]=ffsz[0];
        g++;
        for(hh=0;hh<(d-1);hh++)
        {
            ffsz[hh]=ffsz[hh+1];
        }
    d--;
    count=0;
    }
}
printf("\n            结束本次优先数排序运行后的状态如下:\n");
printf("\n          进程名|进程状态|优先数|序号|时间片个数:\n");
for(kk=0;kk<i;kk++)
{
    printf("     ");
    printf("%6s",ffs[kk].name);
    if(ffs[kk].status==END)
    printf("    进程结束");
    else
    {
        if(ffs[kk].status==BLOCKING)
        printf("    进程阻塞");
        else
        printf("    进程就绪");
    }
printf("%6d",ffs[kk].psw);
printf("%8d",ffs[kk].pc);
printf("%8d",ffs[kk].ax);
printf("\n");
}
printf("          浏览结束请按<ENTER>继续运行:\n");
getchar();
if(g==0)
i=g;
else
{
    for(i=0;i<g;i++)
    ffs[i]=tempx[i];
}
g=0;
printf("           结束本次优先数排序运行后的就绪队列如下:\n");
printf("            --------------------------------------");
printf("\n               进程名|进程状态|优先数|序号|时间片个数\n");
printf("           ---------------------------------------\n");
for(t=0;t<i;t++)
{
    printf("             ");
    printf("%6s",ffs[t].name);
    printf("    进程就绪");
    printf("%6d",ffs[t].psw);
    printf("%8d",ffs[t].pc);
    printf("%8d",ffs[t].ax);
    printf("\n");
}
printf("\n              请按<ENTER>浏览阻塞队列");
getchar();
printf("\n               结束本次优先数排序运行后的阻塞队列如下:\n");
printf("             ----------------------------");
printf("\n                  进程名|进程状态|优先数|序号|时间片个数\n");
printf("              --------------------------\n");
for(z=0;z<d;z++)
{
    printf("            ");
    printf("%6s",ffsz[z].name);
    printf("     进程阻塞");
    printf("%6d",ffsz[z].psw);
    printf("%8d",ffsz[z].pc);
    printf("%8d",ffsz[z].ax);
    printf("\n");
}
if(d>=1)
count++;
if(i==0&&d==0)
{
    printf("\n          模拟完毕!请按<ENTER>返回主界面>>>\n");
    getchar();
    jiemian();
}
}
printf("\n          模拟完毕!请按<ENTER>返回主界面>>>\n");
getchar();
jiemian();
}
void rr(pcb *head8)                  //轮转法
{
    pcb *p;
    int temp=0,i=0,g=0,d=0,l=1,no=0,z,t,w,y,k,e,hh;
    char check;
    pcb rrf[MAX],tempx[MAX],rrfz[4];
    p=head8;
    printf("\n               进程调度采用轮转算法\n");
    printf("               将对如下进程队列进程进行调度:\n");
    printf("\n               进程名|进程状态|优先数|序号|时间片个数\n");
    while(p!=NULL)
    {
        printf("          ");
        printf("%6s",p->name);
        printf("          进程就绪");
        printf("%6d",p->psw);
        printf("%8d",p->pc);
        printf("%8d",p->ax);
        printf("\n");
        p=p->next;
    }
    p=head8;
    while(p!=NULL)
    {
        for(w=0;w<6;w++)
            rrf[i].name[w]=p->name[w];
        rrf[i].status=p->status;
        rrf[i].psw=p->psw;
        rrf[i].pc=p->pc;
        rrf[i].ax=p->ax;
        i++;
        p=p->next;
    }
    while(l!=0)
    {
        do
        {
            printf("\n                 请按<Y>模拟进程运行,按<N>推出模拟");
            scanf("%c",&check);
            getchar();
            if(check=='n')
                jiemian();
        }while(check!='y');
        for(y=0;y<i;y++)
        {
            rrf[y].ax=rrf[y].ax-1;
            if(rrf[y].ax<=0)
            {
                rrf[y].status=0;
                rrf[y].ax=0;
            }
        else
        rrf[y].status=(rand()%2+1);
        }
        printf("\n              结束本次轮转后的状态如下:\n");
        printf("\n               进程名|进程状态|优先数|序号|时间片个数\n");
        for(k=0;k<i;k++)
        {
            printf("           ");
            printf("%6s",rrf[k].name);
            if(rrf[k].status==0)
                printf("      进程结束");
            else
            {
                if(rrf[k].status==1)
                printf("    进程阻塞");
                else
                printf("      进程就绪");
            }
            printf("%6d",rrf[k].psw);
            printf("%8d",rrf[k].pc);
            printf("%8d",rrf[k].ax);
            printf("\n");
           
        }
    for(e=0;e<i;e++)
    {
        if(rrf[e].status==2)
        {
            tempx[g]=rrf[e];
            g++;
        }
        else
        {
            if(rrf[w].status==1)
            {
                rrfz[g]=rrf[e];
                d++;
            }
        if(d>=4)
        {
            tempx[g]=rrf[e];
            g++;
            rrfz[0]=rrfz[1];
            rrfz[1]=rrfz[2];
            rrfz[2]=rrfz[3];
            d=3;
        }
        }
    }
    if(no==3)
    {
        if(d!=0)
        {
            tempx[g]=rrfz[0];
            g++;
            for(hh=0;hh<(d-1);hh++)
            {
                rrfz[hh]=rrfz[hh+1];
            }
            d--;
            no=0;
        }
    }
    if(g==0)
    i=g;
    else
    for(i=0;i<g;i++)
        rrf[i]=tempx[i];
    g=0;
    temp=0;
    printf("\n     请按<ENTER>浏览就绪队列");
    getchar();
    printf("\n          结束本次轮转后的就绪队列如下:\n");
    printf("              -----------------------");
    printf("\n             进程名|进程状态|优先数|序号|时间片个数\n");
    printf("             ---------------------------------\n");
    for(t=0;t<i;t++)
    {
        printf("               ");
        printf("%6s",rrf[t].name);
        printf("      进程就绪");
        printf("%6d",rrf[t].psw);
        printf("%8d",rrf[t].pc);
        printf("%8d",rrf[t].ax);
        printf("\n");
    }
    printf("\n            请按<ENTER>浏览阻塞队列:");
    getchar();
    printf("\n               结束本次轮转后的阻塞队列如下:\n");
    printf("              -----------------------");
    printf("\n                进程名|进程状态|优先数|序号|时间片个数\n ");
    printf("                 ------------------\n");
    for(z=0;z<d;z++)
    {
        printf("             ");
        printf("%6s",rrfz[z].name);
        printf("      进程阻塞");
        printf("%6d",rrfz[z].psw);
        printf("%8d",rrfz[z].pc);
        printf("%8d",rrfz[z].ax);
        printf("\n");
    }
    if(d>=1)
    no++;
    if(no==4)
    no=3;
    if(i==0&&d==0)
    {
        printf("\n          模拟完毕!请按<ENTER>返回主界面.>>>\n");
        getchar();
        jiemian();
    }
}
jiemian();
}
void jiemian()
{
char choice;
    printf("                      =============================================\n");
    printf("              ||                                                   \n");
    printf("              ||          操作系统课程实验设计                     \n");
    printf("              ||                                                   \n");
    printf("              ||           进程调度模拟                            \n");
    printf("              ||                                                   \n");
    printf("              ||                                                   \n");
    printf("              ||                          宝德学院计算机系         \n");
    printf("              ||                                                   \n");
    printf("              ||                                         heishu    \n");
    printf("              ||                                                   \n");
    printf("              ||                                           2012.11 \n");
    printf("                      =============================================\n");
   
    printf("\n     操作菜单:\n");
    printf("\n     1.创建一个进程:\n");
    printf("\n     2.按先来先服务法完成进程调度.\n");
    printf("\n     3.按优先级发完成进程调度.\n");
    printf("\n     4按轮转法完成进程调度.\n");
    printf("\n     5.查看进程序列.\n");
    printf("\n     0.推出进程.\n");
    printf("\n     请输入操作序号(0-5):");
    do
    {
        choice=getchar();
        getchar();
        switch(choice)
        {
            case '1':
            head=createprocess(head);
            printf("\n              请按<ENTER>返回主界面>>>>\n");
            getchar();
            jiemian();
            break;
            case '2':
            processfifo(head);
            break;
            case '3':
            youxian(head);
            break;
            case '4':
            rr(head);
            break;
            case '5':
            processview(head);
            break;
            case '0':
            exit(0);
        }
    }while(1);
}
void main()
{
    head=NULL;
    jiemian();

}

2012-11-06 15:57
快速回复:进程调度算法实验代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047351 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved