|
|
|
|
이중 버퍼 시스템
|
|
|
|
이중 버퍼 시스템(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)
.... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|