운영 체제 프로 세 스 스케줄 링 알고리즘 (자바 구현)
이것 은 가장 간단 하고 기본 적 인 알고리즘 입 니 다. 그의 사상 은 매우 간단 합 니 다. 바로 프로 세 스 가 도착 하 는 시간 순서에 따라 CPU 자원 의 장점 을 하나씩 분배 하 는 것 입 니 다. 간단 하고 편리 한 단점: 효율 이 낮 으 며 자원 의 이 용 률 이 낮 습 니 다.
/**
* CPU
* 1:
* 0:
*/
static int CPU = 1;
/**
*
*/
static final int MAXLEN = 10;
/**
*
* @param processes
*/
public static void FCFS(List processes){
int count = processes.size();
int time = 0;
int[] waitQueue = new int[MAXLEN];
int front = 0;int tail = 0;
int running = 0;
System.out.println("-------------FCFS -------------");
if (count <= 0){
System.out.println(" ");
return;
}
while (count > 0){
System.out.print(" " + time + " : ");
for (int i = 0; i < processes.size(); i++){
if (processes.get(i).isAlive() && processes.get(i).getInTime() == time){
System.out.print(" " + i + " ");
waitQueue[tail] = i;
tail = (tail+1) % MAXLEN;
}
if (processes.get(running).isAlive() && processes.get(running).getCount() == 0){
System.out.print(" " + running + " ");
processes.get(running).setAlive(false);
processes.get(running).setEndTime(time);
count--;
CPU = 1;
}
}
if (CPU == 1 && front != tail){
running = waitQueue[front];
front = (front+1) % MAXLEN;
System.out.print(" " + running + " ");
int temp = processes.get(running).getCount();
temp--;
processes.get(running).setCount(temp);
CPU = 0;
} else if (CPU == 0){
int temp = processes.get(running).getCount();
temp--;
processes.get(running).setCount(temp);
}
time++;
System.out.println();
}
System.out.println("---------------------------------");
ShowResult(processes);
}
SJF (짧 은 작업 우선, 짧 은 작업 우선)
프로 세 스 가 예상 하 는 운행 시간 에 따라 어 릴 때 부터 자원 의 장점 을 분배 합 니 다. 간단 한 프로 세 스 실행 속도 가 빠 른 단점: 운행 시간 을 정확하게 예측 할 수 없고 성장 프로 세 스 의 배 고 픔 을 만 들 기 쉽 습 니 다.
/**
*
* FCFS waitQueue
*/
//
...
for (int i = 0; i < processes.size(); i++){
if (processes.get(i).isAlive() && processes.get(i).getInTime() == time){
System.out.print(" " + i + " ");
waitQueue[tail] = i;
tail = (tail+1) % MAXLEN;
length++;
/**
*
*/
for (int x=front, z=0; z < length; x=(x+1)%MAXLEN, z++){
for (int y=x+1, q=0; q < length-x; y=(y+1)%MAXLEN, q++){
if (processes.get(waitQueue[x]).getCount() > processes.get(waitQueue[y]).getCount()){
int t = waitQueue[x];
waitQueue[x] = waitQueue[y];
waitQueue[y] = t;
}
}
}
}
...
PSA (우선 순위 스케줄 링)
프로 세 스 의 우선 순위 에 따라 스케줄 링 순 서 를 선택 하 십시오.
/**
*
* SJF ,
*/
/**
*
*
*/
for (int x=front, z=0; z < length; x=(x+1)%MAXLEN, z++){
for (int y=x+1, q=0; q < length-x; y=(y+1)%MAXLEN, q++){
if (processes.get(waitQueue[x]).getPriority() > processes.get(waitQueue[y]).getPriority()){
int t = waitQueue[x];
waitQueue[x] = waitQueue[y];
waitQueue[y] = t;
}
}
}
RR (타임 시트 윤전 알고리즘)
CPU 실행 을 위 한 시간 대 크기 를 설정 합 니 다. 모든 프로 세 스 가 시간 대 를 문의 하고 시간 대가 끝 난 후에 실행 을 중단 하고 대기 열 에 가입 합 니 다.
/**
*
* @param processes
* @param round
*/
public static void RR(List processes, int round){
int count = processes.size();
int time = 0;
int[] waitQueue = new int[MAXLEN];
int front = 0;int tail = 0;
int running = 0;
System.out.println("------------- RR -------------");
if (count <= 0){
System.out.println(" ");
return;
}
while (count > 0){
System.out.print(" " + time + " : ");
for (int i = 0; i < processes.size(); i++){
if (processes.get(i).isAlive() && processes.get(i).getInTime() == time){
System.out.print(" " + i + " ");
waitQueue[tail] = i;
tail = (tail+1) % MAXLEN;
}
if (processes.get(running).isAlive() && processes.get(running).getCount() == 0){
System.out.print(" " + running + " ");
processes.get(running).setAlive(false);
processes.get(running).setEndTime(time);
count--;
CPU = 1;
}
}
if (CPU == 1 && front != tail){
running = waitQueue[front];
front = (front+1) % MAXLEN;
System.out.print(" " + running + " ");
int temp = processes.get(running).getCount();
temp--;
processes.get(running).setCount(temp);
CPU = 0;
} else if (CPU == 0){
int temp = processes.get(running).getCount();
temp--;
processes.get(running).setCount(temp);
if (time % round == 0){
System.out.print(" " + running + " ");
waitQueue[tail] = running;
tail = (tail+1) % MAXLEN;
CPU = 1;
}
}
time++;
System.out.println();
}
System.out.println("---------------------------------");
ShowResult(processes);
}
알고리즘 실행 결과 표시
/**
*
* @param processes
*/
public static void ShowResult(List processes){
int averageTime = 0;
for (int i = 0; i < processes.size(); i++){
int inTime = processes.get(i).getInTime();
int endTime = processes.get(i).getEndTime();
averageTime += endTime-inTime;
System.out.println(" " + i + " : : " +
inTime + " : " +
endTime + " : " +
(endTime-inTime));
}
System.out.println(" : " + averageTime / processes.size());
System.out.println("---------------END--------------");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.