본문 바로가기
CS/Network

Stream & Buffer

by 재영(ReO) 2023. 2. 26.

Stream


스트림(Stream)이란, 실제의 입력이나 출력이 표현된 데이터의 이상적인 흐름을 이야기한다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.



Buffer


스트림은 내부에 버퍼(buffer)라는 임시 메모리 공간을 가지고 있다.

위의 그림에서처럼, 사용자의 입력이나 출력을 바로 처리하지 않고 버퍼에 모았다가 전송함으로써 입력과 출력을 효율적으로 처리한다.
버퍼는 임시 저장 공간, 즉 휘발성의 메모리이다. 스트림에서 사용되고 나면 내부의 데이터들은 휘발된다.



어떻게 경제성을 확보하는가


위의 도식은 버퍼를 사용하지 않는 입력을 처리하는 경우를 나타낸다.
파란색으로 그려져 있는 네모는 프로그램이 한 번에 처리할 수 있는 작업량을 의미한다.


"MOVE"라는 단어를 입력받을 때 "M", "O", "V", "E"라는 각 문자를 하나씩 프로그램에게 전달한다고 가정하자.
한 문자에 대한 작업량은 한번에 처리할 수 있는 작업량에 턱없이 부족하다.
각 문자를 하나씩 프로그램에 전달한다면 이렇게 한 번에 처리할 수 있는 작업량 중 많은 부분이 기회비용이 된다.

위의 도식은 "MOVE"라는 한 단어를 한 번에 프로그램에게 전달하는 과정을 나타낸다.
프로그램이 한 번에 처리할 수 있는 작업량보다 여전히 "MOVE"라는 단어가 입력된 버퍼의 작업량이 작다.
그러므로 한 번에 프로그램에 전달한다면 4번의 전달 과정이 1번으로 줄어들게 되므로, 버퍼를 사용하지 않은 입력을 전달할 때보다 자원적, 시간적 경제성을 확보할 수 있게 되는 것이다.



버퍼 사용의 또 다른 장점


수정이 가능하다

만약 오타가 난다던가 하는 입력에 대한 수정이 필요한 상황이 생기면, 버퍼를 사용하지 않은 입력은 이를 수정하는 기능이 프로그램 차원에서 구현되어 있어야 하며 그 기능을 사용하는 데에서 또 시간, 자원적 낭비가 발생한다.
하지만 버퍼를 사용한다면 버퍼 내에서 수정이 가능하므로 훨씬 경제성을 확보할 수 있다.


두 장치 간의 성능 차이를 완화할 수 있다.

버퍼의 주 목적이기도 한 이 장점은, 아래의 예시들로 설명하겠다.

  1. 영상을 스트리밍하는 상황이 있다. 서버와 단말기라는 두 장치 사이에서 통신이 일어난다. 이 때, 서버에서 영상에 대한 데이터를 단말기에 보낼 때 버퍼가 없이 보낸다고 가정하자. 서버에서 매번 각 프레임을 단말기에 전송할 것이므로, 통신 환경이 좋지 않을 때 단말기에서 영상은 각 프레임 별로 끊어지며 재생될 것이다. 혹은 성능이 좋지 않은 단말기의 경우 영상 데이터를 처리하는 데에 시간이 오래 걸려서 영상이 끊어질 수도 있다. 영상이 모두 다운로드 된 후에 재생을 하는 방법으로 이러한 일을 방지할 수 있겠으나 이 경우는 영상 데이터가 모두 단말기에 넘어올 때까지 사용자가 대기해야한다는 문제가 생긴다.

  2. 어떻게 경제성을 확보하는가에서 사용한 예시의 상황이다. 키보드가 한 번에 처리할 수 있는 데이터의 능력에 비해 프로그램이 한 번에 처리할 수 있는 데이터의 능력이 월등하다. 이러한 경우, 성능이 떨어지는 장치(키보드)에 맞춰서 프로그램의 성능도 같이 낮아진다는 문제점이 생긴다.

버퍼를 사용한다면 위의 두 예시를 해결할 수 있다. 영상 스트리밍 플랫폼에서 우리가 흔히 경험할 수 있듯이(유튜브의 회색바) 일정한 크기의 영상 데이터를 한 번에 받아와서 재생한다면 첫번째 예시에서 나타난 문제점을 더욱 경제적으로 해결할 수 있다. 사용자는 영상 전체가 다운로드되는 시간을 기다리기보다, 일정 구간의 영상이 다운로드 되기까지만 기다리면 단말기가 그 일정 구간 영상을 재생하고 계속해서 서버에서 영상 데이터를 받아와서 처리하여 영상이 끊기지 않게 사용자에게 제공할 수 있다. 즉 서버와 단말기 사이에서, 영상이 출력될 때까지의 시간을 완화할 수 있게 되는 것이다.
키보드와 프로그램 사이의 성능 차이 또한 버퍼를 사용하여 해결할 수 있다. 버퍼의 처리 능력은 키보드와 프로그램의 처리 능력 중간의 값을 가진다. 그러므로 버퍼를 사용하여 일정 데이터 단위 별로 묶어서 프로그램에 보낸다면 두 장치의 처리 속도 차이를 완화할 수 있다.


다시 말해서, 버퍼는 처리 속도 차이가 나는 두 개의 장치 사이에서 두 장치의 속도 차이를 완화하기 위해 사용된다. 처리 속도가 느린 장치에서 처리 속도가 빠른 장치로 이동할 때에는 버퍼에 빠른 장치가 처리할 수 있는만큼 모았다가 전달하여 효율적으로 데이터를 처리하게 하며, 반대의 경우에는 데이터를 잘게 쪼개서 처리한 뒤 버퍼에 모으는 식으로 두 장치를 효율적으로 연결한다.

출처 :
https://ontheway.tistory.com/52?category=1232424[https://ontheway.tistory.com/52?category=1232424]

http://www.tcpschool.com/cpp/cpp_io_streamBuffer[http://www.tcpschool.com/cpp/cpp_io_streamBuffer]