프로그래밍 언어/유용한함수

FCFS(FIFO)스케줄링 C언어로 구현하기

원원 2020. 11. 15. 17:13

안녕하세요. 오늘은 FCFS(FIFO) 스케줄링을 C언어코드로 구현해보겠습니다

FCFS는 First Come First Service으로써, 먼저오면 먼저 실행되는것을 의미합니다

FIFO는 First in First Out으로써, 먼저오면 먼저 나가는것을 의미합니다

결과적으로 FCFS와 FIFO는 같은 스케줄링입니다


*특징

1) 비선점방식

2) 도착 순서대로 처리


*예시

───은 실행시간을 의미하고, --------은 대기시간을 의미합니다

먼저 A가 0초에 도착했고 4초동안 실행이 되었습니다. 그리고나서 C가 1초에 도착해서 A가 끝날때까지 대기하다가 2초가 실행이 되었습니다.

마지막으로 B가 2초에 가장늦게 도착하고 A,C가 끝날때까지 기다린다음에 B가 실행이 됩니다


위와같은 과정이 FCFS(FIFO)스케줄링입니다.




*코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<stdio.h>
int i,j,k,l,m,n,pos,temp;
int proN,regT[6],runT[6],p[6],pro[6]; //Process number ,Registration time ,Running time ,Priority , process
 
 
void FCFS();
 
int main()
{
    n = 0, m =0;
 
    printf("프로세스 수 : ");
    scanf("%d",&proN);
    for(i=0;i<proN;i++)
    {
        printf("P%d등록시간,실행시간,우선순위 : ",i+1);
        scanf("%d %d %d",&regT[i],&runT[i],&p[i]);
        pro[i]=i+1;
    }
 
    printf("대기 표시 : - 실행 표시 : = \n");
    FCFS();
    
 
 
}
 
void FCFS()
{
    printf("FCFS\n"); //First Come First Service
    printf("    12345678901234567890123456789012345678901234567890\n");
    l=0;
    for(i=0; i<proN ; i++)
    {
        pos = i;
        for(j=i+1 ; j<proN; j++)
        {
            if(regT[j]<regT[pos])
                pos = j;
        }
        
        temp=p[i];
        p[i]=p[pos];
        p[pos]=temp;
        
        temp=regT[i];
        regT[i]=regT[pos];
        regT[pos]=temp;
 
        temp=runT[i];
        runT[i]=runT[pos];
        runT[pos]=temp;
 
        temp=pro[i];
        pro[i]=pro[pos];
        pro[pos]=temp;
    }
    
    for(i=0; i<proN;i++)
    {
        printf("p[%d]",pro[i]);
        printf("    ");
        if(i==0)
        {
            if(regT[0]!=0)
            {            
                for(j=0 ; j < regT[i] ; j++)
                    printf("-");
            }
            l+=regT[0];
        }
        else
        {
            for(j=0 ; j < regT[i] ; j++)
                printf(" ");                
            for(j=0 ; j < l-regT[i] ; j++)
                printf("-");
        }
            
        for(j=0 ; j<runT[i] ; j++)
        {
            printf("=");
            l++;
        }
        printf("\n");
    }
}

위의 예시를 코드로 옮긴 것입니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    for(i=0; i<proN ; i++)
    {
        pos = i;
        for(j=i+1 ; j<proN; j++)
        {
            if(regT[j]<regT[pos])
                pos = j;
        }
        
        temp=p[i];
        p[i]=p[pos];
        p[pos]=temp;
        
        temp=regT[i];
        regT[i]=regT[pos];
        regT[pos]=temp;
 
        temp=runT[i];
        runT[i]=runT[pos];
        runT[pos]=temp;
 
        temp=pro[i];
        pro[i]=pro[pos];
        pro[pos]=temp;
    }

FCFS는 등록시간에 따라 순서가 결정되므로  등록시간이 짧은거면 앞쪽 배열으로 옮겨줍니다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  for(i=0; i<proN;i++)
    {
        printf("p[%d]",pro[i]);
        printf("    ");
        if(i==0)
        {
            if(regT[0]!=0)
            {            
                for(j=0 ; j < regT[i] ; j++)
                    printf("-");
            }
            l+=regT[0];
        }
        else
        {
            for(j=0 ; j < regT[i] ; j++)
                printf(" ");                
            for(j=0 ; j < l-regT[i] ; j++)
                printf("-");
        }
            
        for(j=0 ; j<runT[i] ; j++)
        {
            printf("=");
            l++;
        }
        printf("\n");
    }

앞쪽배열이 빠른 등록시간이므로 앞쪽배열부터 출력시켜주면 FCFS스케줄링에 맞게 출력이 됩니다