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;
}
}
}
}
///////////////////////////////////////////////////////////
급하게 짠거라 소스가 많이 더럽습니다...
수정해서 쓰시면 될꺼 같습니다.^^
좋은 하루 되세요^^