[목차] == 개요 == 쓰는 장치나 프로그램이 [[데이터]]를 [[버퍼]]에 쓰는 속도보다, 읽는 장치가 데이터를 읽어내는 속도가 더 빠를 때 나타나는 현상. [[버퍼]]에 채워진 데이터가 바닥나게 된다. == 설명 == [[Hello, world!]]를 출력하는 지극히 간단한 코드 몇 줄 짜리 예제 프로그램도 구동 시 [[RAM]] 용량을 요구한다. 특히나 동영상 시청/편집, 게임 등 특정 작업에는 [[RAM]] 용량과 중요성이 무척 중요해진다. 반도체 가격이 낮아져 32bit 운영체제도 퇴출 수순이고[* 언급한 이유는 [[RAM/주소할당 문제#s-2.4|32bit OS의 구조적 문제]] 때문이다. 4GB 이상은 할당하지 못한다.], 그만큼 통상적으로 사용되는 [[RAM]] 용량도 증가했다. 그러나 여러가지 사유로 가용 가능한 [[RAM]] 용량은 제한적일 수 밖에 없다. 한 번에 모든 용량을 줄 수도 없는 노릇이니 결국 조금 할당 받고 출력하면서 자료를 읽는 방법밖엔 없다. 다만 저장 매채의 노후화, 불량 등의 사유로 읽기 속도가 출력 속도보다 느려질 수 있고, 이로 인한 연산, 실행 등의 지연, 중단 등을 막고자[* 당장 비행기 제어장치에 이러한 문제가 발생하면 큰 인명 피해로 이어질 수도 있다.] 두는 장치가 바로 [[버퍼]]이다. 그러나 이 마저도 버퍼에 비축된 자료가 모두 소진되면, 즉 버퍼가 비면 일어나는 현상이 바로 [[버퍼 언더런]]이다. == 대책 == === 더 큰 [[버퍼]] === [[버퍼]]의 용량을 크게 할당하면 당연히 비축 자료량이 증가하니 [[버퍼 언더런]]이 지연된다. 다만 이 대책은 매우 단순무식해 효율도 떨어지며[* [[RAM]] 소모가 늘어나고 초기에 버퍼를 채우는 시간이 길어진다.] 애초에 미봉책에 지나지 않는다. === [[버퍼링]] === 출력할 데이터가 더 이상 없으면, 출력을 멈추고 자료를 읽어 버퍼가 다시 찰 때까지 기다린다. 이 방법이 [[버퍼링]]이다. 이렇게 하면 예상치 못한 문제들이 생겨나는 것은 막을 수 있지만, 지연 시간이 늘어날 수 밖에 없다. 하지만 사실은 더 큰 문제가 있는데, '''멈추고 기다리는 것 자체가 불가능한 경우'''들이 있다는 것[* 비행기 제어장치 같은 인명이 달린 장치나 [[ECU]] 같은 1ms의 차이도 큰 결과를 부르는 경우를 말한다. 물론 이런 경우도 fail-safe는 되어있기는 하다. 경보를 울리고 맨 마지막에 성공적으로 실행한 작업이나 연산결과를 계속 반복-유지하는 것. 항공기로 치면 시스템이 뻑가기 전에 마지막 순간의 엔진출력, 방향타/승강타 등등 기계장비 조작상태를 유지한 채로 경보를 울리는 식이다. 그럼 자리에 앉아있는 인간 조종사가 오토파일럿을 끄고 컴퓨터를 재부팅하고 수동 조종을 할 테니까.] 역시나 미봉책이다. === 성능 강제 저하 === 출력량을 읽기속도가 감당 가능할 수준으로 낮출 수도 있다. 이 경우 무정지 구현은 가능하지만 성능이 저하된다. 이 역시나 미봉책이다. 구식 CD 라이터가 쓰던 방법. === [[업그레이드]] === '''가장 근본적이고 확실한 해결책'''이다. 인터페이스[* SATA3(6Gbps)에서 NVMe([[PCIe]] 속도 수준)로의 업그레이드], 읽기 장치[* [[HDD]] → [[SSD]] → [[옵테인 메모리]]] 등의 하드웨어를 교체하거나 알고리즘을 최적화 할 수도 있다. 단, 비용이 든다는 큰 문제가 있다. == 이렇게 된다면 일어나는 일 == [[버퍼 오버플로우]]가 일어났을 때 버퍼 이후의 메모리가 덮어씌워지는 것처럼, '''버퍼 언더라이트'''가 일어날 수 있다. 버퍼 오버플로우와는 반대의 현상이다. 쓰는 장치는 읽는 장치가 마지막으로 읽어 간 자리에서 쓰는데, 언더런이 일어났을 때는 버퍼의 실제 시작 위치보다 앞 부분을 읽어가게 되므로 이 부분에 원래 있던 정보를 덮어쓰게 되는 것. 영상/음악 재생의 경우 [[버퍼링]]으로 해결?할 수 있으나, 끊어지는 것을 막아야 하는 상황이라면 중간중간 [[프레임]]을 버리는 경우도 있다. 일단 영상/노래 재생이라면 당연히 [[버퍼링]]이 생기게 된다. 또한 CD 굽기라면 아무것도 안하고 데이터를 받아야 하기 때문에 굽는 시간이 늘어난다. 만약 억지로 덮어써야 한다면 당연히 일반 운영체제라면 해당 프로그램은 [[오류]]를 띄우고 정지하나, 이가 불가능하면 큰 사고가 날 수 있다. == [[CD]] [[굽기]]에서의 버퍼 언더런 == [[CD]], [[DVD]], [[BD]] 등의 광 매체를 구울 때는 디스크가 한번 돌기 시작하면 끝까지 구워지도록 설계되어 있기 때문에, 중간에 멈추는 것 자체가 불가능하다. [[하드 디스크]]에서 구울 파일들을 읽어오는 속도가 느리더라도 [[버퍼링]]을 할 수 없는 것. 따라서 CD/DVD 라이터들에는 여러 방지 장치들이 있는데, CD의 회전 속도를 느리게 하고, 버퍼를 크게 만들거나, 또는 원래 규격과는 다르게 정확한 위치에서 쓰기를 멈추고 기다리는 방법 등이 있다. 또한 어떤 광 매체들은 설계와 [[파일 시스템]]의 구조 상 멈추었다가 다시 쓰는 게 문제가 되지 않는 경우도 있다. [[분류:컴퓨터]]