버퍼란 임시 저장 공간이다.
버퍼는 데이터를 이동시킬 때 사용된다.
데이터를 키보드로부터 입력받고, 이를 잠시 버퍼에 저장한다.
그렇다면, 버퍼를 언제, 왜 사용하는가?
버퍼는 속도차이가 큰 두 대상이 상호작용하며 입출력을 할 때 사용된다.
예를 들어서, HDD에서 CPU로 데이터를 전송한다고 해보자.
CPU는 초당 수억개의 비트를 처리할 수 있다.(속도가 매우 빠름)
하지만 HDD는 데이터 전송 속도가 CPU의 처리 속도에 비해 매우 느린 편이다.
HDD가 초당 5개의 데이터를 전송할 수 있고, CPU가 초당 100개의 데이터를 처리할 수 있다고 가정한다면,
CPU의 능력에 비해, HDD에서 전송되어 오는 데이터의 양은 너무나 작다.
여기서 95만큼을 더 처리할 수 있지만, CPU는 빈둥빈둥 놀게되는 것이다.(효율이 떨어진다.)
이 비효율성을 개선하기 위해 사용된다.
CPU가 빈둥빈둥 놀게할 수 없으니,
일정양의 데이터가 버퍼에 쌓일 동안, CPU는 다른일을 하다가 쌓여있는 버퍼의 데이터를 처리한다.
버퍼링은?
그러면 버퍼링은 무엇인가?
우리는 영상 스트리밍할때 '버퍼링중이다.' 라는 표현을 자주 사용한다.
우리는 회색부분보다 더 앞부분의 영상을 재생할 수 없다. why?
스트리밍 서버에서 데이터를 받아오는 속도보다, 우리의 컴퓨터가 그 데이터를 처리하는 속도가 빠르기 때문에,
영상이 재생되면서 회색부분의 끝에 다다르면 재생이 멈추고, 서버에서 데이터를 받아오는데 이것을 '버퍼링'이라고 한다.
C언어에서의 버퍼
#include <stdio.h>
int main(void) {
char ch;
int num;
printf("num을 입력 : ");
scanf("%d", &num); //num을 입력
scanf("%c", &ch); //문자 ch를 입력
printf("%d\n", num);
printf("%c\n", ch);
return 0;
}
정수형 변수에 값을 입력, 문자형 변수에 값을 입력하여 각각을 출력하는 코드이다.
하지만, 이 코드에는 문제점이 있다.
변수 num에 값을 입력하고 엔터를 누르는 순간, 문자 ch를 입력할 틈도 없이 값이 출력된다.
왜일까?
scanf()함수는 버퍼에 담겨있는 내용을 가지고 온다
만약, num을 입력할 때, 100 입력한다고 가정해보자(아직 엔터는 누르지 않은 상태)
여기서 엔터키를 눌러서, 값 입력을 완료한다면 이렇게 된다.
100이란 정수가 버퍼에 있다가 엔터를 누르는 순간, num에 입력이 완료된다.
그러면, 버퍼에는 '\n'만 남게된다.
버퍼에 남아있던 '\n'가 ch변수에 입력된다.
그러므로, 우리가 문자를 입력하기도 전에 버퍼에 남아있던 '\n'가 자동으로 입력되는 것이다.
해결 방법
getchar()함수로 버퍼에 남아있던, '\n'을 받아서, 버퍼를 비워주면 된다.
getchar()은 하나의 문자를 입력하는 함수이다.
#include <stdio.h>
int main(void) {
char ch;
int num;
printf("num을 입력 : ");
scanf("%d", &num); //num을 입력
getchar();
scanf("%c", &ch); //문자 ch를 입력
printf("%d\n", num);
printf("%c\n", ch);
return 0;
}
틀린 부분이 있다면, 알려주시오.
'컴퓨터 공학(Computer Science)' 카테고리의 다른 글
정적 링킹(Static Link), 동적 링킹(Dynamic Link), 그리고 컴파일 (2) | 2024.06.24 |
---|---|
책 - 그래서 컴퓨터는 어떻게 동작하나요? 후기 (3) | 2023.06.19 |
32비트 컴퓨터, 64비트 컴퓨터란? (6) | 2023.04.09 |