SSTF 스케줄링

-탐색거리가 가장 짧은 요청이 비록 큐의 제일 앞에 있지 않다 하더라도 먼저

 서비스를 받는다.

-특정 요청들을 차별대우 하는 경향이 있다

-고도로 편중되어 안쪽이나 바깥쪽 트랙이 가운데 트랙보다 훨씬 서비스를 덜 받는다.

-FCFS보다 처리량이 더 많고, 보통의 부하에서 평균 응답시간은 짧다

-단점 : 안쪽과 바깥쪽 트랙을 차별대우하기 때문에 응답시간에 큰 편차가 생긴다

■ 일괄처리 시스템에 유용하다.


<<소스 코드>>



///process.java

public class process {
 public static void main(String args[]){
  new Scheduling();
 }
 
}

//SSTF.java
public class SSTF {
 private int number;
 private int arrive_time;
 private int burst_time;
 private int wait_time;
 private int sub;
 
 public SSTF(){
 }
 public SSTF(int arrive,int burst){
  this.arrive_time=arrive;
  this.burst_time=burst;
  this.wait_time=0;
 }
 public int getNumber(){
  return number;
 }
 public int getArrive(){
  return arrive_time;
 }
 public int getBurst(){
  return burst_time;
 }
 public int getWait(){
  return wait_time;
 }
 public int getSub(){
  return sub;
 }
 public void setArrive(int arrive){
  this.arrive_time=arrive;
 }
 public void setBurst(int burst){
  this.burst_time=burst;
 }
 public void setWait(int wait){
  this.wait_time=wait;
 }
 public void setSub(int sub){
  this.sub=sub;
 }
 
}



////Scheduling.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

public class Scheduling {
 private ArrayList<SSTF> processList = new ArrayList<SSTF>();
 private ArrayList<SSTF> copyList = new ArrayList<SSTF>();
 int count;
 int processcount = 0;
 int headcount;
 int current;// ����
 int currentnum = 0;
 int num;
 int temp;
 int plus;
 int waittime = 0;
 int arrive = 0;

 Scheduling() {
  System.out.println("스케줄링 시작");
  try {
   setFile("test\\2.inp.txt");
  } catch (NumberFormatException e) {

  } catch (IOException e) {
   System.out.println("IOException!!");
  }
  sortProcess();
  waittime = processList.get(0).getBurst()+count;// 첫번쨰 자리 이동
  current = processList.get(0).getBurst();// 현재 Burst
  currentnum = 0;
  processList.get(0).setWait(1);
  // ///////////////////
  System.out.println("waittime : " + waittime);

  for (int i = 1; i < processcount; i++) {
   
   sort();
   
  }
  try {
   printProcess(waittime, processList.get(currentnum).getBurst());
  } catch (IOException e) {
   System.out.println("IOException!!");
  }
 }

 private void sort() {
  int temp1=0;
  int temp = 0;
  int num = 0;
  int min = 5000;

  for (int i = 1; i < processcount; i++) {
   if (processList.get(i).getWait() == 0) {
    if (waittime >= processList.get(i).getArrive()) {
     temp = processList.get(i).getBurst()
       - processList.get(currentnum).getBurst();

     if (temp < 0) {
      temp *= -1;
     }

     if (min > temp) {
      min = temp;
      num = i;
     }
     System.out.println("burst : "
       + processList.get(i).getBurst()
       + "  currentburst : "
       + processList.get(currentnum).getBurst()
       + "  arrive : " + processList.get(i).getArrive());
    }

   }
  }// 최소 구하기
  if (num == 0) {
   for (int i = 1; i < processcount; i++) {
    if (processList.get(i).getWait() == 0) {
     if (min > processList.get(i).getArrive()) {
      temp = processList.get(i).getArrive()-waittime;
      temp1=processList.get(currentnum).getBurst()-processList.get(i).getBurst();
      if (temp < 0) {
       temp *= -1;
      }
      System.out.println(processList.get(i).getArrive());
      temp += temp1;
      if (min > temp) {
       min = temp;
       num = i;
      }      
     }
    }
   }

  }
  currentnum = num;
  processList.get(currentnum).setWait(1);

  System.out.println("min : " + min + "num : " + currentnum);

  waittime += min;
  waittime += count;
  System.out.println("waittime : " + waittime);
  System.out.println();
 }

 private void printProcess(int waitingTime, int head) throws IOException {
  System.out.println("프로세스");
  FileWriter fw = new FileWriter("test\\2.out.txt");
  BufferedWriter bw = new BufferedWriter(fw);
  PrintWriter pw = new PrintWriter(bw);
  pw.println(waitingTime + " " + head);
  System.out.println(waitingTime + " " + head);
  pw.close();
  bw.close();
  fw.close();
 }

 private void setFile(String filename) throws NumberFormatException,
   IOException {

  String str;

  FileReader fr = new FileReader(filename);
  BufferedReader br = new BufferedReader(fr);
  count = Integer.parseInt(br.readLine());// ��û�ð�(10)
  System.out.println("카운트 = " + count);

  for (int i = 0;; i++) {

   String[] item = br.readLine().split(" ");
   if (Integer.parseInt(item[0]) == -1
     && Integer.parseInt(item[1]) == -1) {// ���� ����
    System.out.println("������");
    break;
   }
   processcount++;
   System.out.println("Arrive//Burst");
   System.out.println(" " + Integer.parseInt(item[0]) + " "
     + Integer.parseInt(item[1]));
   SSTF process = new SSTF(Integer.parseInt(item[0]),
     Integer.parseInt(item[1]));// �Է�
   processList.add(process);
  }
  br.close();
  fr.close();
 }

 private void sortProcess() {
  for (int i = 0; i < processList.size() - 1; i++) {
   for (int j = 0; j < processList.size() - 1 - i; j++) {
    if (processList.get(j).getArrive() > processList.get(j + 1)
      .getArrive()
      || (processList.get(j).getArrive() == processList.get(
        j + 1).getArrive() && processList.get(j)
        .getBurst() > processList.get(j + 1).getBurst())) {
     SSTF temp = processList.get(j);
     processList.remove(j);
     processList.add(j + 1, temp);
    }
   }
  }
  for (int i = 0; i < processList.size(); i++) {
   if (processList.get(i).getWait() == current) {
    num = i;
    break;
   }
  }
 }

}


///////////////////////////////////////////////////////////
급하게 짠거라 소스가 많이 더럽습니다...

수정해서 쓰시면 될꺼 같습니다.^^

좋은 하루 되세요^^

'IT 공부 > 자료구조' 카테고리의 다른 글

SRTF  (2) 2012.02.28
FCFS  (2) 2012.02.25
SRTF 스케줄링  (0) 2012.02.25
[자료구조] Linked List(링크드리스트)  (0) 2012.02.22

+ Recent posts