1. 개요
Buffer Underrun쓰는 장치나 프로그램이 데이터를 버퍼에 쓰는 속도보다, 읽는 장치가 데이터를 읽어내는 속도가 더 빠를 때 나타나는 현상. 제때 해결하지 못 하면 버퍼에 채워진 데이터가 바닥나게 되어 다양한 악영향을 미친다.
2. 설명
2.1. 기술적인 설명
컴퓨터 공학자들은 더 싸고 빠른 컴퓨터를 위해 다양한 아이디어들을 고안해 냈고, 그 중 하나가 메모리 계층 구조이다. 메모리 계층 구조는 쉽게 말해 가격, 입출력 속도, 용량 등이 제각각인 저장 장치들을 적재적소에 맞게 사용하는 구조를 의미한다. 기본적으로 메모리 계층 구조는 레지스터 - 캐시 메모리 - RAM - 디스크(SSD, HDD)로 구성된다. Hello, world!를 출력하는 간단한 프로그램에서부터 미래의 날씨를 예측하는 복잡한 프로그램에 이르기까지 이 메모리 계층 구조를 거치지 않는 프로그램은 존재하지 않는다고 해도 무방하다. 그만큼 이 계층 구조는 컴퓨터에서 가장 기본적인 구조에 해당한다.반도체 가격이 낮아져 32bit 운영체제도 퇴출 수순이고[1], 그만큼 통상적으로 사용되는 RAM 용량도 증가했다. 그러나 거의 모든 프로그램들은 용량의 문제나 가동 조건상의 문제로 RAM이나 더 작고 빠른 저장 장치에 프로그램을 모두 올려 놓고 사용할 수 없다. 하는 수 없이 프로그램들은 중요하거나 지금 필요한 내용만 디스크에서 가져와 사용하고 있다. 이 과정은 일반적인 상황에서는 별 문제가 되지 않는다. 그러나 저장 장치가 노후화 또는 불량, 비효율적인 프로그램 등의 이유로 읽기 속도가 쓰기 속도보다 빨라지면 문제가 생긴다.
다행히도 컴퓨터 공학자들이 그 부분도 미리 생각해 두었기 때문에, 버퍼라고 하는 완충 지대를 생성해 두었다. 자료들이 저장 장치들을 옮겨 다니면서 여기를 한 번 거쳤다 가는데, 읽기 속도가 쓰기 속도보다 빨라지면 처음에는 버퍼에 있는 내용들을 비워 내면서 읽기 속도에 맞춘다. 그러나 버퍼에 있는 내용들이 점점 빠져 나가기 때문에 언젠간 버퍼가 완전히 비어 버리게 되며, 이 현상이 바로 버퍼 언더런이다. 버퍼 언더런은 영향 문단의 내용처럼 다양한 영향을 주기 때문에, 다양한 대책이 마련되어 있다.
2.2. 쉬운 설명
위의 설명은 조금 어려울 수 있으니, 비유를 통하여 쉽게 이해하여 보자.메모리 계층 구조의 각 단계를 유통 단계에 대응하면 디스크는 물류창고에, RAM은 번화가의 대형 마트에, 캐시 메모리는 동네 마트에, 레지스터는 우리 집의 냉장고에 대응시킬 수 있다.
하루 세 끼 식사를 준비하기 위해 매번 물류창고나 대형 마트를 다녀온다면 매우 불편할 것이다. 그렇기 때문에 우리는 한 번에 장을 봐서 식재료들을 냉장고에 보관한다. 냉장고에 필요한 식재료가 딱 있다면 장을 보러 나갈 필요가 없이 빠르게 식재료를 주방(CPU)에 가지고 올 수 있을 것이다. 그런데 생각보다 식재료를 많이 썼거나(쓰기 속도보다 읽기 속도가 빠른 경우), 제때 장을 보러 가지 않았다면(비효율적인 프로그램) 냉장고에 식재료가 바닥나게 될 것이다. 이게 버퍼 언더런이다.
냉장고에 식재료가 없다면 우린 마트에 장을 보러 간다. 자주 쓰는 식재료라면 동네 마트에도 있을 것이고, 아니라면 대형 마트에 가야 할 것이다. 동네 마트에 다녀오는 선에서 끝난다면 그렇게 많은 시간이 걸리진 않겠지만, 그래도 냉장고에서 식재료를 꺼내는 것보단 느릴 것이다. 그러나 동네 마트, 대형 마트에도 그 식재료가 없을 가능성도 있다. 이 경우 물류센터에서 물량이 내려오길 기다려야 하기 때문에 엄청난 시간이 소요될 것이다. 이런 일이 벌어진다면 그냥 그 식재료를 쓰는 것을 포기하거나 음식의 맛이 없어지는 등의 문제가 생길 것이다. 이런 일들을 막기 위해 유통업체는 각 마트의 재고를 유지하고 우리는 제때제때 장을 보러 나간다. 이 내용이 아래에 이어진다.
3. 영향
버퍼 오버플로우가 일어났을 때 버퍼 이후의 메모리가 덮어씌워지는 것처럼, 버퍼 언더라이트가 일어날 수 있다. 버퍼 오버플로우와는 반대의 현상이다. 쓰는 장치는 읽는 장치가 마지막으로 읽어 간 자리에서 쓰는데, 언더런이 일어났을 때는 버퍼의 실제 시작 위치보다 앞 부분을 읽어가게 되므로 이 부분에 원래 있던 정보를 덮어쓰게 되는 것. 영상/음악 재생의 경우 버퍼링으로 해결?할 수 있으나, 끊어지는 것을 막아야 하는 상황이라면 중간중간 프레임을 버리는 경우도 있다.일단 영상/노래 재생이라면 당연히 버퍼링이 생기게 된다. 또한 CD 굽기라면 아무것도 안하고 데이터를 받아야 하기 때문에 굽는 시간이 늘어난다. 만약 억지로 덮어써야 한다면 당연히 일반 운영체제라면 해당 프로그램은 오류를 띄우고 정지하나, 이가 불가능하면 실행 결과가 망가지거나 최악의 경우 인명 사고로 이어질 수도 있다.
3.1. CD 굽기에서의 버퍼 언더런
CD, DVD, BD 등의 광 매체를 구울 때는 디스크가 한번 돌기 시작하면 끝까지 구워지도록 설계되어 있기 때문에, 중간에 멈추는 것 자체가 불가능하다. 하드 디스크에서 구울 파일들을 읽어오는 속도가 느리더라도 버퍼링을 할 수 없는 것. 따라서 CD/DVD 라이터들에는 여러 방지 장치들이 있는데, CD의 회전 속도를 느리게 하고, 버퍼를 크게 만들거나, 또는 원래 규격과는 다르게 정확한 위치에서 쓰기를 멈추고 기다리는 방법 등이 있다. 또한 어떤 광 매체들은 설계와 파일 시스템의 구조 상 멈추었다가 다시 쓰는 게 문제가 되지 않는 경우도 있다.4. 대책
4.1. 더 큰 버퍼
버퍼의 용량을 크게 할당하면 당연히 비축 자료량이 증가하니 버퍼 언더런이 지연된다. 다만 이 대책은 매우 단순무식해 효율도 떨어지며[2] 문제를 완전히 해결하지 못 한다.4.2. 버퍼링
출력할 데이터가 더 이상 없으면, 출력을 멈추고 자료를 읽어 버퍼가 다시 찰 때까지 기다린다. 이 방법이 버퍼링이다. 이렇게 하면 예상치 못한 문제들이 생겨나는 것은 막을 수 있지만, 지연 시간이 늘어날 수 밖에 없다. 하지만 사실은 더 큰 문제가 있는데, 멈추고 기다리는 것 자체가 불가능한 경우들이 있다는 것[3]이다. 그리고 근본적으로 이 방법 또한 문제를 완전히 해결하지 못 한다.4.3. 성능 강제 저하
출력량을 읽기 속도가 감당 가능할 수준으로 낮출 수도 있다. 이 경우 무정지 구현은 가능하지만 성능이 저하된다. 구식 ODD에서 쓰던 방법이며, 역시나 문제를 완전하게 해결하지 못 한다.4.4. 업그레이드
가장 근본적이고 확실한 해결책이다. 읽기 장치나 인터페이스를 업그레이드 할 수도 있으며, 비효율적인 코드를 최적화 할 수도 있다. 단, 시간과 비용이 든다는 문제점이 있으며, 어른의 사정이나 실행 환경 등 때문에 업그레이드가 불가능 할 수도 있다.5. 사례
자세한 내용은 음파 크래시 버그 문서 참고하십시오.과거 음파 크래시 버그, 속칭 뽁찡으로 홍역을 앓았던 EZ2AC 시리즈가 버퍼 언더런의 사례에 해당하는데, 배경이 다소 복잡하다. 처음에는 어뮤즈월드가 안정적으로 개발을 진행했다. 그러나 어뮤즈월드가 코나미와의 소송에서 패소한 이후 막대한 손해를 입고 신작을 낼 수 없게 되었고[4] 시리즈의 존망이 흔들리며 제작진이 자주 교체되게 되었다. 이 과정에서 EZ2DJ 7th 1.0까지 있었던 가이드라인이 사라지면서 EZ2AC 기판의 사운드 카드였던 사운드블라스터 Live의 처리 용량을 뛰어넘는 부하가 가해졌고, 이로 인해 버퍼 언더런이 발생하게 되어 음파 크래시 버그를 부르게 되었다.
yak_won의 분석과 기판 업그레이드를 통해 음파 크래시 버그는 사실상 종결되었으나, 아직 위험 요소는 남아 있다. EZ2AC 기체는 2001년 4월을 끝으로 신규 생산이 끊겼고, SQUARE PIXELS의 사정으로 인해 적극적으로 신기판 개발을 하지 못하고 있다. 그나마 2015년 3세대 기판이 출시되었으나 이마저도 845 칩셋 기반으로 이미 그 당시에도 명백한 똥컴이었다. 물론 EZ2AC는 임베디드 환경이므로 성능에 여유가 있을 것 같았지만, 그래도 여전히 성능이 모자라 게임 내 해상도에 맞는 BGA조차 출력하기 버거운 수준이다.
설상가상으로 입출력 보드가 ISA 슬롯 기반인데, 이 보드가 기판 업그레이드의 발목을 잡고 있다. 비록 RAM 용량이나 그래픽카드, 저장 장치는 계속 개선되었으나 ISA 슬롯 때문에 여전히 845 칩셋에 의존하고 있으며, 그나마 나아진 것이 865 칩셋이다. 성능을 개선한 비공식 커스텀 기판들도 모두 ISA를 지원하는 메인보드나, ISA to PCI/PCIe/USB 컨버터에 의존하고 있다. 그렇다 보니 가장 나중에 나온 것도 G41 칩셋으로, beatmania IIDX나 펌프 잇 업과 비교해서 10년이나 뒤쳐진 성능으론 금방 한계에 부딪힐 수도 있다. 확실한 대책은 입출력 보드를 다시 설계하는 것이지만, 앞서 언급했듯 코나미와의 소송에서 패소한 이후로 힘들어진 개발사 사정으로 인해 EZ2AC : FINAL EX에서 아케이드 시리즈가 종료될 때까지 실현되지 못했다.
[1] 언급한 이유는 32bit OS의 구조적 문제 때문이다. 32bit 운영체제는 일특수한 방법을 사용하지 않는 한 4 GB 이상의 RAM을 인식하거나 프로그램에 할당하지 못한다.[2] RAM 소모가 늘어나고 초기에 버퍼를 채우는 시간이 길어진다.[3] 비행기 제어장치 같은 인명이 달린 장치나 자동차의 ECU 같이 찰나의 차이도 큰 차이를 부르는 경우를 말한다. 물론 이런 경우도 fail-safe는 되어있기는 하다. 경보를 울리고 맨 마지막에 성공적으로 실행한 작업이나 연산결과를 계속 반복-유지하는 것. 항공기로 치면 시스템이 뻑가기 전에 마지막 순간의 엔진출력, 방향타/승강타 등등 기계장비 조작상태를 유지한 채로 경보를 울리는 식이다. 그럼 자리에 앉아있는 인간 조종사가 오토파일럿을 끄고 컴퓨터를 재부팅하고 수동 조종을 할 테니까.[4] EZ2DJ 7th 1.5 등은 실질적으론 신작이지만, 명목상으론 패치였다.