操作系统的先到先服务和短时间优先算法

package santiago;


import java.io.BufferedReader;
import java.io.InputStreamReader;


public class FCFSANDSJF {


private static int i;
private int j;
private int temp;
private int m[];
private int n[];
private int process_number;
private int arrival_time[];
private int services_time[];
private int start_time[];
private int completion_time[];
private int turn_around_time[];
private double add1;
private double add2;
private double add3;
private double add4;
private double right_turn_around_time[];


private void FCFS() {
System.out.println("\n===FCFS先来先服务算法===");
System.out.println("\n到达时间是:");
for (i = 0; i < process_number; i++) {
System.out.print(arrival_time[i] + "\t");
}
System.out.println("\n服务时间是:");
for (i = 0; i < process_number; i++) {
System.out.print(services_time[i] + "\t");


}


System.out.println("\n开始时间是:");
for (i = 0; i < process_number; i++) {
n[i] = arrival_time[i];
m[i] = i;
}
for (i = 0; i < process_number - 1; i++) {
for (j = i + 1; j < process_number; j++) {
if (n[i] > n[j]) {
temp = n[i];
n[i] = n[j];
n[j] = temp;
temp = m[i];
m[i] = m[j];
m[j] = temp;
}


}
}

start_time[m[0]]=arrival_time[m[0]];
for(i=1;i<process_number;i++){
if(arrival_time[m[i]]<start_time[m[i-1]]+services_time[m[i-1]])
start_time[m[i]]=start_time[m[i-1]]+services_time[m[i-1]];
else
start_time[m[i]]=arrival_time[m[i]];
}
for(i=0;i<process_number;i++){
  System.out.print(start_time[i]+"\t");
}
System.out.println("\n完成时间是:");
for(i=0;i<process_number;i++){
completion_time[i]=start_time[i]+services_time[i];
}
for(i=0;i<process_number;i++){
System.out.print(completion_time[i]+"\t");
}
System.out.println("\n周转时间是:");
for(i=0;i<process_number;i++){
  turn_around_time[i]=completion_time[i]-arrival_time[i];
}
for(i=0;i<process_number;i++){
  System.out.print(turn_around_time[i]+"\t");
}
add1=0;
for(i=0;i<process_number;i++){
add1=add1+turn_around_time[i];
}
System.out.println("\n平均周转时间是:"+add1/process_number);
System.out.println("\n带权周转时间是:");
for(i=0;i<process_number;i++){
  right_turn_around_time[i]=turn_around_time[i]*1.0/services_time[i];
}
for(i=0;i<process_number;i++){
  System.out.print(right_turn_around_time[i]+"\t");
}
System.out.println("\n平均带权周转时间是:");
add2=0;
for(i=0;i<process_number;i++){
  add2=add2+right_turn_around_time[i];
}
System.out.println(add2/process_number);
 
}






private void SJF(){
 System.out.println("\n===SJF:短作业优先算法===");
 System.out.println("\n到达时间是:");
 for(i=0;i<process_number;i++){
System.out.print(arrival_time[i]+"\t");
 }
 System.out.println("\n服务时间是:");
 for(i=0;i<process_number;i++){
System.out.print(services_time[i]+"\t");
 }
 System.out.println("\n开始时间是:");
 m[0]=0;
 for(i=0;i<process_number-1;i++){
if(arrival_time[i]>arrival_time[i+1])
m[0]=i+1;
 }
 for(i=0;i<process_number;i++){
n[i]=services_time[i];
m[i+1]=i;
 }
 for(i=0;i<process_number-1;i++){
for(j=i+1;j<process_number;j++){
if(n[i]>n[j]){
temp=n[i];
n[i]=n[j];
n[j]=temp;
temp=m[i+1];
m[i+1]=m[j+1];
m[j+1]=temp;
}
}
 }
 for(i=1;i<process_number+1;i++){
if(m[0]==m[i]){
for(j=i;j<process_number;j++){
m[j]=m[j+1];
}
}
 }
start_time[m[0]]=arrival_time[m[0]];
for(i=1;i<process_number;i++){
if(arrival_time[m[i]]<start_time[m[i-1]]+services_time[m[i-1]])
start_time[m[i]]=start_time[m[i-1]]+services_time[m[i-1]];
else
start_time[m[i]]=arrival_time[m[i]];
}
for(i=0;i<process_number;i++){
  System.out.print(start_time[i]+"\t");
}
System.out.println("\n完成时间是:");
for(i=0;i<process_number;i++){
completion_time[i]=start_time[i]+services_time[i];
}
for(i=0;i<process_number;i++){
System.out.print(completion_time[i]+"\t");
}
System.out.println("\n周转时间是:");
for(i=0;i<process_number;i++){
 turn_around_time[i]=completion_time[i]-arrival_time[i];
}
for(i=0;i<process_number;i++){
 System.out.print(turn_around_time[i]+"\t");
}
add3=0;
for(i=0;i<process_number;i++){
add3=add3+turn_around_time[i];
}
System.out.println("\n平均周转时间是:"+add3/process_number);
System.out.println("\n带权周转时间是:");
for(i=0;i<process_number;i++){
 right_turn_around_time[i]=turn_around_time[i]*1.0/services_time[i];
}
for(i=0;i<process_number;i++){
 System.out.print(right_turn_around_time[i]+"\t");
}
System.out.println("\n平均带权周转时间是:");
add4=0;
for(i=0;i<process_number;i++){
 add4=add4+right_turn_around_time[i];
}
System.out.println(add4/process_number);
}
public static void main(String[] args) throws Exception{
System.out.println("请输入进程数:");
FCFSANDSJF wo=new FCFSANDSJF();
BufferedReader buf=null;
buf=new BufferedReader(new InputStreamReader(System.in));
String str1=null;
str1=buf.readLine();
wo.process_number=Integer.parseInt(str1);
wo.arrival_time=new int[wo.process_number];
wo.services_time=new int[wo.process_number];
wo.start_time=new int[wo.process_number+1];
wo.completion_time=new int[wo.process_number+1];
wo.turn_around_time=new int[wo.process_number+1];
wo.right_turn_around_time=new double[wo.process_number+1];
wo.m=new int[wo.process_number+1];
wo.n=new int[wo.process_number];
System.out.println(wo.toString());
String str=null;
String str2=null;
System.out.println("\n请输入各进程到达时间");
for(i=0;i<wo.process_number;i++){
  str=buf.readLine();
  wo.arrival_time[i]=Integer.parseInt(str);
}
System.out.println("\n请输入各个进程服务时间");
for(i=0;i<wo.process_number;i++){
  str2=buf.readLine();
  wo.services_time[i]=Integer.parseInt(str2);
}
System.out.println("该进程数为"+wo.process_number);
System.out.println("\n到达时间为");
for(i=0;i<wo.process_number;i++){
  System.out.print(wo.arrival_time[i]+"\t");
}
System.out.println("\n服务时间为:");
for(i=0;i<wo.process_number;i++){
  System.out.print(wo.services_time[i]+"\t");
}
System.out.println("\n======先来先服务【0】========");
System.out.println("\n======短作业优先【1】========");
System.out.println("\n======退出系统【2】========");
String str3=null;
str3=buf.readLine();
i=Integer.parseInt(str3);
while(i!=2){
switch(i){
case 0:
wo.FCFS();
break;
case 1:
wo.SJF();
break;
default:
System.out.println("\n输入有误,请重新输入");
}
System.out.println("\n======先来先服务【0】========");
System.out.println("\n======短作业优先【1】========");
System.out.println("\n======退出系统【2】========");
str3=buf.readLine();
i=Integer.parseInt(str3);
}
System.out.println("系统已退出!");

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务算法 #include "stdio.h" #include #define max 100 #define pfree 0 /*process end*/ #define running 1 /*process running status*/ #define aready 2 /*process aready status */ #define blocking 3 /*process aready blocking status*/ typedef struct node { char name; int status; int ax,bx,cx,dx; int pc; int psw; struct node *next; /*pcb define*/ }pcb; pcb *createprocess(pcb *head) { pcb *p,*q; int a,b,c,d,m,n; char ID; q=NULL; printf("input the first seven status pcb:"); scanf("\n%c%d%d%d%d%d%d",&ID,&a,&b,&c,&d,&m,&n); while(1) { p=(pcb*)malloc(sizeof(pcb)); p->name=ID; p->ax=a; p->bx=b; p->cx=c; p->dx=d; p->pc=m; p->psw=n; p->status=aready; if(head==NULL) head=p; else q->next=p; q=p; printf("input the next seven status pcb: "); scanf("\n%c",&ID); if (ID == '*') break; scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&m,&n); } if(q!=NULL) q->next=NULL; q=head; while(q) { printf("\n process name. status.ax. bx. cx. dx. pc. psw.\n "); printf("%10c%5d%5d%5d%5d%5d%5d%5d",q->name,q->status,q->ax,q->bx,q->cx,q->dx,q->pc,q->psw); q=q->next; } return head;/*createprocess end*/ } void processfcfs(pcb *head) /*use fifo */ { pcb *p; p=head; printf("\n the process use fcfs method.\n"); printf("running the frist process:\n"); while(p!=NULL) { p->status=running; printf("\nprocess name status. ax. bx. cx. dx. pc. psw."); printf("\n%10c%5d%8d%5d%5d%5d%5d%5d",p->name,p->status,p->ax,p->bx,p->cx,p->dx,p->pc,p->psw); /*check process running status */ p->status=0; p=p->next; } printf("\n检查进程是否结束:"); p=head; while(p) { printf("\n%3c%3d",p->name,p->status); p=p->next; } printf("\ngame is over!\n"); } main() { pcb *head; head=NULL; head=createprocess(head); processfcfs(head); }
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括服务调度算法、最作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程的进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值