티스토리 뷰
원시 값은 변경 불가능한 값이기 때문에 값을 직접 변경할 수 없다.
따라서 변수 값을 변경하기 위해 원시 값을 재할당하면 새로운 메모리 공간을 확보하고 재할당한 값을 저장 후, 변수가 참조하던 메모리 공간의 주소를 변경한다.(값의 이러한 특성을 불변성 이라 한다)
다음의 예제를 보자.
"hello" + "world"; // "helloworld"
위의 예제를 보면 "hello"와 "world"가 결합되어 좌항의 값이 변경되는 것 같이 보인다.
그러나 실제로는 두 문자열을 합친 새로운 값이 생성된다. 때문에 빈번한 원시형 값의 수정으로 인한 성능 저하를 막기 위해서는 버퍼(Buffer)를 사용하는 것이 권장된다.
1. 버퍼(Buffer)
Buffer의 영단어 뜻은 완충제, 완화하다 라는 의미이다.
뜻만 보고서 어떤 역할을 하는지 정확히 파악하기 어렵지만, 우선 무언가를 완화시켜주는 역할인 것 같다.
정보통신용어사전에서 정의한 버퍼의 의미는 다음과 같다.
① 입출력 데이터 등의 정보를 전송할 때 일시적인 데이터 저장 장소로 사용되는 기억 장소.
② 한 장치에서 다른 장치로 데이터를 송신할 때 일어나는 시간의 차이나 데이터 흐름 속도의 차이를 보상하기 위해 사용하는 저장 장치.
③ 레지스터의 일종. 주소의 전송을 위해 주소 버퍼를 만들기도 한다. 또 중앙 처리 장치(CPU)와 메모리, 입출력(I/O) 사이에서 데이터를 전송하는 데이터 버스에도 버퍼가 마련되는데, 이것을 데이터 버퍼라고 한다.
공통적으로 저장 장소, 저장 장치라는 말이 등장한다.
결론적으로 보면 무언가를 완충해주는 저장 장치라는 의미로 해석할 수 있을 것 같은데, 버퍼의 동작원리를 통해 어떤 의미인지 알아보자.
2. 버퍼의 동작원리
버퍼를 쉽게 이해할 수 있는 예제는 유튜브같은 동영상 스트리밍 사이트이다.
스트리밍 사이트에서 실시간으로 동영상을 보게 되면 보통 동영상이 진행되는 부분(빨간색)과 서버로부터 동영상을 내려받는 부분(밝은 회색) 그리고 앞으로 다운로드가 남는 부분을 볼 수 있다.
여기서 밝은 회색 부분을 버퍼라고 볼 수 있다.
그럼 버퍼가 생기는 이유는 뭘까?
동영상 데이터가 내려 받아지는 속도에 비해 우리가 동영상을 1초씩 진행되며 보는 속도에는 차이가 있다.
만약 우리가 동영상을 보는 속도와 데이터를 내려받는 속도가 같다면 동영상 재생시간이 50분짜리 동영상이라면 50분동안 데이터를 내려받아야 한다.
그러나 이는 비효율적이므로 버퍼라는 임시 저장공간을 두고 동영상 데이터를 버퍼에 최대한 빠른 시간 안에 내려받아 저장해 둔다. 따라서 동영상을 즐기다보면 어느덧 동영상은 버퍼에 모두 다운로드 되어 동영상을 멈춤없이 볼 수 있다.
인터넷이 많이 느리던 시절에는 동영상을 버퍼에 다운로드 하는 속도가 동영상을 시청하는 속도를 따라가지 못해 빨간 부분이 회색 부분을 따라잡게 됐고 동영상이 멈추는 일이 빈번했다. 그리고 이를 "버퍼링 걸린다" 라고들 이야기 했었다.
그렇다면 프로그래밍에서의 버퍼란 무엇일까?
3. 입출력에서 사용되는 버퍼
프로그래밍이나 운영체제에서 사용하는 버퍼는 거의 대부분 CPU와 보조기억장치 사이에서 사용되는 임시 저장 공간을 의미한다.
CPU는 컴퓨터에서 속도가 가장 빠른 장치인데, 기술이 발전함에 따라 1초에 수십억 bit 그 이상의 데이터를 처리할 수 있다.
그러나 보조기억 장치의 경우 데이터를 주고 받는데에 많은 시간이 필요하다. 물리적인 HDD(하드디스크)의 경우 데이터를 전송할 수 있는 속도는 빨라도 초당 100mb ~ 300mb 이다.
간단히 얘기하자면 CPU는 1초에 100개의 데이터를 처리할 수 있지만 정작 처리할 데이터를 가지고 있는 보조 기억 장치는 데이터를 1초에 세 개 밖에 보내주지 않는 것이다.
CPU 입장에서는 아무리 일을 열심히 하고 싶어도 데이터를 보내주지 않기 때문에 능력에 비해 97개 만큼 효율성을 잃게 된다.
이 때 버퍼를 사용하게 된다.
버퍼는 CPU 내부에 있는 캐시메모리 보다는 느리지만 보조 기억 장치보다 훨씬 빠른 주기억 장치(RAM)를 이용한다.
보조기억장치는 주기억장치의 버퍼로 마련해둔 공간에 데이터를 열심히 보내 쌓아 둔다.
CPU는 처리가 빠르므로 밀려있는 다른 일을 처리한 후 시간이 남을 때 가끔 버퍼를 확인해서 데이터가 보두 쌓였는지 확인하고 모두 쌓였다면 가져다 한꺼번에 처리한다.
그 덕분에 CPU는 100퍼센트의 효율로 연산을 할 수 있게된다.
결론적으로 버퍼라는 것은 속도차가 큰 두 대상이 입출력을 수행할 때 효율성을 위해 사용하는 임시 저장 공간이라고 할 수 있다.
추가적으로 버퍼는 임시 저장 공간이라고 했는데, 임시 저장 공간이라는 것은 데이터를 저장하지 않고 휘발된다는 것을 뜻한다. 결국 버퍼는 데이터들을 전달하는 바구니라고 생각하면 될 것 같다.
'Tips > IT 상식' 카테고리의 다른 글
[IT 상식] 프레임워크와 라이브러리의 차이 (0) | 2024.07.20 |
---|---|
[IT 상식] CORS(Cross Origin Resource Sharing) 개념정리 (0) | 2024.06.17 |
HTTP 멱등성이란? (1) | 2024.04.06 |
하드코딩이란? (0) | 2024.04.02 |
- Total
- Today
- Yesterday
- html
- 리액트
- js
- currentTarget
- map
- 동기
- rest parameter
- 유사배열객체
- innerhtml
- 비동기
- GitHub
- 코드잇스프린트
- hydrationboundary
- 배열
- 제어 컴포넌트
- 프론트엔드
- 비제어 컴포넌트
- 객체
- arguments
- Git
- 취업까지달린다
- react
- 중급 프로젝트
- tanstackquery
- 스프린트프론트엔드6기
- Next.js
- javascript
- Target
- CSS
- 코드잇 스프린트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |