西农操作系统实验1.2

编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。

//最终成功版

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb   /* 定义进程控制块PCB */
{
    char name[10];
    char state;
    int super;
    int ntime;
    int rtime;
    struct pcb* link;
};
struct pcb  *head,*foverhead;
int num;
int flag=0;
int creat();
void check();
void show();
void inShow();
void flush();
int main(){
    char ch;
    head=(struct pcb*)malloc(sizeof(struct pcb));
    foverhead=(struct pcb*)malloc(sizeof(struct pcb));
    foverhead=head;
     num=creat();
    show(num);
     printf("\n 下面开始自己运行\n\n============================================================");
    int runtime=0;
    head=foverhead->link;
   while((num!=0)&&foverhead!=NULL){
        check();
        if(flag==0)
        {
            runtime++;
        }
     printf("\n目前的运行时间:%d \n ",runtime);
     printf("\n 按任一键继续......\n");
     head->state='w';
     head=head->link;
     ch=getchar();
    }
    printf("\n 所有进程都已经完成喽!!!byebye\n");
   return 0;
}
 int creat(){
    int num;
    printf("\n 请输入进程块数:");
    scanf("%d",&num);
    int pr=num;

    for(int i=0; i<num; i++)
    {
        printf("\n 进程号No.%d:\n",i+1);
        struct pcb *p=(struct pcb*)malloc(sizeof(struct pcb));
        printf("\n 输入进程名:");
        scanf("%s",p->name);
        printf("\n 输入进程运行时间:");
        scanf("%d",&p->ntime);
        p->super=pr--;
        printf("\n");
        p->rtime=0;
        p->state='w';
        p->link=NULL;
        head->link=p;
       // printf("\n 输入进程名:");
        head=p;
    }
    head->link=foverhead->link;
    return num;
 }
void check(){
    if(head->ntime==head->rtime){
         printf("\n %s 已经运行完成\n--------------------------------------------",head->name);
         struct pcb *p=head;
         head->link=p->link;
         head=head->link;
         num--;
         flag=1;
    }else{
    head->rtime++;
    head->state='R';
    inShow();
    flag=0;
    }

}
void show(){
    head=foverhead;
    head=head->link;
    printf("\n进程名字 状态  优先级  需要时长 已运行时长\n");
   for(int i=0;i<num;i++){
    printf("|%s\t",head->name);
    printf("|%c\t",head->state);
    printf("|%d\t",head->super);
    printf("|%d\t",head->ntime);
    printf("|%d\t",head->rtime);
    printf("\n");
    head=head->link;
    }


}
void inShow(){
    flush();
     printf("\n进程名字 状态  优先级  需要时长 已运行时长\n");
    for(int i=0;i<num;i++){
    printf("|%s\t",head->name);
    printf("|%c\t",head->state);
    printf("|%d\t",head->super);
    printf("|%d\t",head->ntime);
    printf("|%d\t",head->rtime);
    printf("\n");
    head=head->link;
    }
}
void flush(){
   struct pcb *temp=head;
   for(int i=0;i<num;i++){
    head->super=num-i;
    head=head->link;
   }
   head=temp;

}

哈哈哈 谁知道C语言咋写啊啊啊啊啊啊 (已经疯癫)

不得不说,在一些输出,有一些粗制滥造!(好吧,是很粗制滥造)

一些运行结果

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)、假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式 (2)、每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3)、处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行 (4)、进程运行一次后,应把该进程进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程进程控制块中的指针值送到前面一个进程的指针位置。 (5)、若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6)、在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程进程名以及运行一次后进称对列的变化。 (7)、为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程进程名以及进程控制块的动态变化过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值