Windows Confidential버그의 힘

Raymond Chen

Windows 95에서는 문제 해결 페이지로 이동하여 "동기화 버퍼 커밋 사용 안 함"을 선택할 수 있습니다. 그런데 이 확인란이 어떤 역할을 하는지 알고 계시나요? 또는 왜 이 확인란을 선택해야 하는지 알고 계시나요?

MS-DOS® 커밋 기능의 일반적인 동작은 특정 파일의 기록되지 않은 모든 데이터를 디스크로 플러시하고 데이터를 반환하기 전 해당 데이터가 기록된 것으로 확인될 때까지 기다리는 것입니다. 동기화 버퍼 커밋 사용 안 함 옵션을 선택하면 데이터가 기록되는 것을 기다리지 않고 해당 호출이 즉각적으로 반환됩니다. 물론 이는 데이터가 기록되기 전까지 호출을 반환할 수 없는 기능 사양을 위반하는 것입니다. 이러한 동작은 플러시를 요청한 프로그램에서 실제로는 그렇지 않음에도 불구하고 해당 데이터가 안전하게 디스크에 있는 것으로 인식하도록 하기 때문에 기술 자료 문서 139669에서 말하는 "파일 무결성 문제"의 위험을 증대시킵니다.

데이터베이스 프로그램은 커밋 기능을 사용하여 프로그램이 예상하는 디스크 상태와 디스크의 파일 상태가 일치하는 지점에 포인트를 설정합니다. 업데이트 도중 컴퓨터의 전원이 꺼지는 경우 데이터베이스 프로그램은 최종 커밋 포인트에 기록된 정보를 사용하여 데이터베이스 무결성을 재구축합니다. 커밋이 완료되기 전에 즉시 반환되면 이러한 무결성 검사점이 손실되므로 데이터베이스가 손상되는 결과를 가져옵니다.

이렇듯 바람직하지 않은 결과를 가져오는 데도 이 옵션이 제공되는 이유는 무엇일까요? 원인은 Windows® 3.11의 버그에 있습니다.

그림 1 Windows Server 2003에서 버그가 있는 동작 활성화

그림 1** Windows Server 2003에서 버그가 있는 동작 활성화 **(더 크게 보려면 이미지를 클릭하십시오.)

Windows 3.11에서는 하위 수준 파일 I/O 인터페이스의 32비트 구현인 "32비트 파일 액세스" 기능을 도입했습니다. 그러나 여기에 구현된 커밋 기능에는 파일 버퍼 플러시 요청을 무시하는 버그가 포함되어 있었습니다. Windows 3.11에서 파일 버퍼를 플러시하는 프로그램을 실행할 경우 플러시 호출은 아무런 결과를 반환하지 않았습니다. 결과적으로, 적절하지 않은 시기에 전원 공급이 중단되는 경우 데이터베이스가 손상될 수 있습니다.

Windows 95 파일 시스템 개발 팀은 이 버그를 수정했지만 곧 새로운 버그 보고서가 나오기 시작했습니다. 일부 회계 프로그램의 실행 속도가 매우 느려진 것입니다. 이후 다른 데이터베이스 프로그램에서도 같은 문제가 나타났습니다. 무슨 일이 일어났던 것일까요?

문제를 일으킨 프로그램은 끊임없이 플러시를 호출하는 것으로 밝혀졌습니다. 프로그래머들은 Windows 3.11에서 플러시 호출이 매우 빠른 것을 알고 이를 프로그램 곳곳에 넘치도록 사용했습니다. 바이트를 쓰고 플러시를 호출하고, 문자열을 쓰고 또 플러시를 호출했습니다. 플러시가 매우 빨랐으므로 응용 프로그램에서는 눈에 띄는 성능 저하 없이 모든 작업 후 디스크로 데이터를 커밋할 수 있었습니다. 하지만 Windows 95에서 이 버그가 수정되어 커밋 호출이 실제 작업을 수행하게 되면서 이러한 프로그램의 실행 속도가 매우 느려지게 된 것입니다.

이때 파일 시스템 팀에서 아무런 조치도 취하지 않았다면 이 프로그램은 계속해서 느리게 실행되었을 것이고 사람들은 이를 Windows 95의 문제로 결론지었을 것입니다. 그리고 다른 사람들에게 "Windows 95는 너무 느려요."라고 말했겠지요. 그런 반면, 파일 시스템이 이전 Windows 3.11 동작으로 돌아갔다면 성가신 "파일 무결성 문제"를 야기하는 버그로 어려움을 겪었을 것입니다.

결국 파일 시스템 팀은 버그를 수정하되, 버그 수정으로 인해 문제가 발생한 프로그램을 사용하는 경우에는 Windows 3.11 동작으로 돌아갈 수 있도록 문제 해결 페이지에 확인란을 추가하는 방법을 해결책으로 결정했습니다.

역사는 계속 반복됩니다. Windows Server® 2003에서는 FUA(Forced Unit Access)로 태그가 지정된 요청이 FUA 태그 손실로 인해 일반적인 I/O로 수행되는 버그가 발견되었습니다. 이것은 플러시 요청을 무시하는 버그의 새로운 형태입니다. I/O 팀에서는 이 버그를 수정했으나 이전의 버그가 있는 동작으로 돌아가는 옵션을 남겨 두었습니다. Windows Server 2003 버전의 이 확인란은 "고급 성능 사용"이라 합니다. 하지만 여러분은 이제 이 이름이 실제로 뜻하는 것이 "이전의 버그가 있는 동작 복구"라는 것을 아실 것입니다.

Raymond Chen은 그의 웹 사이트 The Old New Thing과 같은 제목의 저서(Addison-Wesley, 2007)에서 Windows의 역사와 Win32 프로그래밍에 대해 다루고 있습니다. 그는 자신의 베개에 붙은 태그를 떼지 않습니다.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..