private void StampProcess(Process p) //선점 priority에서 프로세스 스탬프 찍어주는 함수 { int type = isNowInStamp(p, timestamp); //스탬프 어떻게 찍힐지 정함 Stamp s; int startpoint = 0, endpoint = 0; Process next; switch (type) { case 0: //프로세스가 중간에 끊기는 경우 for (int i = 0; i < timestamp.Count; i++) { if (p.getArrivalTime() < timestamp[i].getStartTime() && p.getArrivalTime() + p.getBurstTime() > timestamp[i].getStartTime()) { startpoint = timestamp[i].getStartTime(); endpoint = timestamp[i].getEndTime(); break; } } int n_burst = p.getBurstTime() - (startpoint - p.getArrivalTime()); //업데이트될 Burst Time next = new Process(p.getName(), endpoint, n_burst); //다음에 스탬프로 찍어줄 업데이트된 프로세스 s = new Stamp(p.getName(), p.getArrivalTime(), startpoint); //스탬프 쾅쾅 addStamp(s); StampProcess(next); //순환 호출 break; case 1: //프로세스가 이미 스탬프가 찍혀있는 범위에 있는 경우 for (int i = 0; i < timestamp.Count; i++) { //가장 먼저 만나는 스탬프의 endpoint를 시작시간으로 설정 if (p.getArrivalTime() >= timestamp[i].getStartTime() && p.getArrivalTime() < timestamp[i].getEndTime()) { startpoint = timestamp[i].getStartTime(); endpoint = timestamp[i].getEndTime(); break; } } next = new Process(p.getName(), endpoint, p.getBurstTime()); //다음에 스탬프로 찍어줄 업데이트된 프로세스 StampProcess(next); //순환 호출 break; case 2: //그냥 찍으면 됨 int end = p.getArrivalTime() + p.getBurstTime(); s = new Stamp(p.getName(), p.getArrivalTime(), end); addStamp(s); //스탬프 찍고 순환호출 안하고 끝내면 됩니다 for (int i = 0; i < inputData.Count; i++) { if (inputData[i].getName().Equals(s.getName())) { inputData[i].setEndTime(end); //끝나는 시간을 설정해줌 } } break; } }