zoukankan      html  css  js  c++  java
  • 实验二 进程调度预备

    1,进程pcb结构定义,队列,输入进程序列,排序,输出

    2,进程预备调度

    •C或其他高级语言
    •用什么数据结构表示进程?
    •用户可以输入指定数目的进程数据。
    •可以对进程进行排序,如按到达时间。
    •输出进程信息以供查看。

    3,调度算法性能的衡量

    •使响应时间最短:从提交到响应
    –E.g. 用户敲下键盘后回显的速度
    •周转时间:从提交到完成
    •呑吐率:每个时钟单位处理的作业数
    –呑吐率与响应时间相关,如果响应时间过短可能导致切换开销增加,而呑吐率下降。
    •公平性:以合理的方式让各个进程共享CPU

    4,调度算法性能的指标

    假设作业i提交给系统的时刻是ts,完成的时刻是tf,所需运行时间为 tk,那么:

    •平均作业周转时间(ti是单个作业的周转时间)
    •平均作业带权周转时间(wi 是单个作业的带权周转时间)
     

    5,程序源代码

    #include<stdio.h>
    #include<malloc.h>
    typedef struct node
    {
    int data;
    struct node *next;
    }queuenode;
    typedef struct node1
    {
    queuenode *front;
    queuenode *rear;
    }queue;
    queue initqueue()//初始化队列
    {
    queue q;
    q.front=(queuenode *)malloc(sizeof(queuenode));
    q.front->next=NULL;
    q.rear=q.front;
    return q;
    }
    queuenode *applynode(int x)//申请新的结点
    {
    queuenode *p;
    p=(queuenode *)malloc(sizeof(queuenode));
    p->data=x; //将x的值存入新的结点
    p->next=NULL;
    return p;

    }
    queue insreq(queue q,int x)//进队
    {
    queuenode *p;
    p=applynode(x);//申请新的结点
    q.rear->next=p;//将队尾指针指向p结点,p结点成为队尾
    q.rear=p;//再将队尾指针指向p
    return q;
    }
    queue delete(queue q)//出队列
    {
    queuenode *p;
    if(q.front==q.rear)//判断队列是否为空
    {
    printf("队空,无法出队!");
    return q;
    }
    p=q.front->next;//p指向队头结点,待删除
    q.front->next=p->next;//front结点指针域跳过p,指向p的后继
    if(p==q.rear)//如果被删除的结点是队尾结点
    {
    q.rear=q.front;//rear指向头结点
    }
    free(p); //释放p结点的空间
    return q;
    }
    void display(queue q)
    {
    queuenode *p;
    printf("\n进程目录:");
    p=q.front->next;//printf("%d ",q.front->next->data);
    while(p!=NULL)
    {
    printf("%d ",p->data);
    p=p->next;
    }

    }
    void displ(queue b)
    {
    queuenode *p;
    printf("\n运行时间:");
    p=b.front->next;//printf("%d ",q.front->next->data);
    while(p!=NULL)
    {
    printf("%d ",p->data);
    p=p->next;
    }

    }
    void way1(int *a,int n)
    {
    int i,j,m,temp;
    for(i=0;i<n-1;i++)
    {
    m=i;
    for(j=i+1;j<n;j++)
    {
    if(a[j]<a[m])
    m=j;
    }
    if(m!=i)
    {
    temp=a[i];
    a[i]=a[m];
    a[m]=temp;
    }
    }
    }
    void way2(int *a,int n)
    {
    int i,j,m,temp,l,k=0;
    for(i=0;i<n-1;i++,k++)
    {
    m=i;
    for(j=i+1;j<n;j++)
    {
    if(a[j]<a[m])
    m=j;
    }
    if(m!=i)
    {
    temp=a[i];
    a[i]=a[m];
    a[m]=temp;
    }
    printf("\ni=%d:[ ",i);
    for(l=0;l<n;l++)
    {
    printf(" %d ",a[l]);
    if(l==k)
    printf("]");
    }
    printf("\n");
    }
    }
    main()
    {
    int k,h=1,a[5],n,c[5];
    char i;
    queue q,b;
    q=initqueue();//初始化队列
    b=initqueue();
    for(k=0;k<5;k++)
    {
    printf("输入进程号:");
    scanf("%d",&c[k]);
    q=insreq(q,c[k]);
    printf("输入运行时间:");
    scanf("%d",&a[k]);
    b=insreq(b,a[k]);

    }
    display(q);
    displ(b);
    printf("\n");
    printf("\n运行时间的排列:");
    way1(a,5);
    for(k=0;k<5;k++)
    printf("%4d",a[k]);
    printf("\n");
    printf("\n运行时间的具体排列方法:");
    way2(a,5);
    do
    {
    printf("是否要出队列?y/n ");
    scanf("%c",&i);
    if(i=='y'||i=='Y')
    {
    q=delete(q);
    display(q);
    }

    if(i=='n'||i=='N')
    h=-1;

    }while(h==1);
    }

  • 相关阅读:
    C# extern关键字的用法
    C#自定义集合类(二)
    C#自定义集合类(一)
    LINQ中交集、并集、差集、去重(十四)
    LINQ中转换操作符(十三)
    Oracle实现连乘和求和
    适配器模式
    HTTP网络协议与手写Web服务容器
    代理模式
    设计模式的几条家规
  • 原文地址:https://www.cnblogs.com/millmill/p/5387452.html
Copyright © 2011-2022 走看看