| 
      
        |  |  
        |  |  
        |  |  
        |  |  
        | 이중 버퍼 시스템 |  
        |  |  
        |  |  
        |  |  
        | 이중 버퍼 시스템(double buffer system) 
 Key Idea - 소비자(consumer)가 두 버퍼 중 어느 하나를 비우고 있는 동안 생산자(producer)가 다른 버퍼를 애울 수 있도록 하는 것.
 
 첫 번째 버퍼가 공백이 되었을 때 두 번째 버퍼는 이미 가득 차 있어야 한다.(그렇지 않을 경우 Idle time이 생긴다.) 소비자는 이 두 번째 버퍼를 다시 비울 수 있고, 반면에 생산자는 첫 번째 것을 다시 채울 수 있는데 이중 버퍼링은 이 과정의 반복이다.
 
 ※ flag - 버퍼의 체워짐 상태.
 버퍼가 체워지고 있거나 비어 있다면 0,
 버퍼가 비워지고 있거나 체워져 있다면 1의 값을 가진다.
 ※ rec_ctr - 버퍼 레코드 카운트, 버퍼에 있는 레코드를 카운트 하는 변수
 ※ pfill - 체워지고 있거나 체워질 버퍼를 가리키는 포인터
 ※ pempty - 비워지고 있거나 빌 버퍼를 가리키는 포인터
 
 생산자(producer)
 
 code
 1 loop:if (pfill->flag == 1) goto loop;
 2 issue start-I/O command to control unit;
 3 wait while pfill->buffer is being filled;
 4 pfill->rec_ctr = 1;
 5 pfill->flag = 1;
 6 pfill = pfill->next;
 7 goto loop;
 해석
 1 현재 버퍼의 flag가 0이 될 때(버퍼가 다 빌때)까지 루프를
 돌면서 기다린다. flag가 1이 아니면 다음문장 수행.
 2 제어장치에 input/output의 시작 명령을 내린다.
 3 버퍼가 다 찰때까지 기다린다.
 4 현재 버퍼의 rec_ctr를 1로 세팅 한다.
 5 현재 버퍼의 flag를 1로 세팅 한다.
 6 현재 버퍼를 가리키고 있는 pfill포인터를 다음 버퍼를
 가리키게 해 준다.
 7 다음 버퍼를 가리키고 있는 pfill포인터를 갖고 다시 맨
 처음 문장으로 돌아 간다.
 
 소비자(consumer)
 
 ....
 |  
        |  |  
        |  |  
        |  |  
        |  |  
        |  |  
        |  |  
        |  |  
        |  |  
        |  |  
    	|  |  
        |  |  
        |  |  
        |  |  
        |  |  |  |  |