示例#1
0
文件: Priority.cs 项目: JUSTIVE/OS-ya
        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;
            }
        }