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);}