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