'윈도우즈 7 운영체제가 왜 좋은 것일까?'
이 물음에 프로그래머라면, 어떤 대답을 할 수 있을까요?
여러 가지 대답들이 존재하겠지만, 그 중에 하나인 부분을 지금부터 진행하려 합니다.
지금부터 언급하는 내용은 모니터에 무엇인가를 표현하는 것과 관련이 있습니다.
즉, 드로잉( Drawing ) 작업에 관한 내용입니다.
혹시 여러분들은 'GDI' 와 'DirectX' 이들 단어에 대해서 들어본 적이 있습니까?
컴퓨터를 가지고 작업을 경험했던 이들이라면, 들어봤을 법한 용어들입니다.
여러분들이 사용하는 컴퓨터의 모니터는 어떤 과정을 거쳐서 우리에게 전달되는 것일까요?
분명히 이것은 하드웨어적인 영역일 수도 있습니다.
조금 더 애플리케이션 프로그래머 관점으로 이 호기심을 확장해 보겠습니다.
'어떻게 하면 모니터 화면을 제어할 수 있을까?'
'어떻게 하면 내가 원하는 모습으로 모니터의 화면에 나타낼 수 있을까?'
'윈도우즈 운영체제에서 화면을 무엇인가를 그리는 시스템은 어떻게 구성되어 있을까?'
위의 그림은 XP를 포함한 이전 세대의 Windows 운영체제( 이하 XP세대 )가
화면을 제어하는 시스템 구조입니다.
즉, 하드웨어 추상화 계층이라고도 합니다.
XP세대의 운영체제에서는 화면에 무엇인가를 그리기 위해서는
GDI 와 DirectX API, 이 두 가지를 통해서 제어가 가능했습니다.
최종적으로 GDI 와 DirectX API 는 드라이버와 통신을 하면서,
우리의 명령어를 처리해서, 하드웨어로 결과를 보내주게 됩니다.
그런데 왜 동일한 일을 하는 구조가 2개씩이나 존재하는 것일까요?
그것은 컴퓨터의 탄생과 발전이 예상을 벗어났기 때문에 생긴 일입니다.
초창기 컴퓨터의 구조는 굉장히 간단했습니다.
아래의 그림을 살펴보겠습니다.
컴퓨터라는 것은 결국 CPU 에게 연산을 부탁해서 처리된 결과를 메모리에 저장을 합니다.
그리고 이들에 대한 제어를 우리는 I/O 장치들을 통해서 수행하고 확인합니다.
초창기 컴퓨터는 프로세싱 유닛이 CPU 오직 하나였습니다.
그래서 API들은 프로세싱 유닛이 CPU 하나임을 전제로 개발되었습니다.
우리가 지금 배우고 있는 Windows API 역시 CPU가 한나인 경우에
포커스를 두어서 개발되었던 API 였습니다.
하지만 오늘날의 컴퓨터는 어떠합니까?
컴퓨터에서 CPU의 수는 2개 이상이고, 앞으로도 그 개수는 증가할 것입니다.
거기다 이제는 프로세싱 유닛이 CPU 뿐만 아니라, GPU 도 활용이 가능한 시대입니다.
메모리는 또 얼마나 발전하고 있습니까?
굉장히 방대한 용량의 메모리를 여러 개 꽂아서 사용하고 있으며,
그래픽 카드에는 비디오 메모리라는 것도 별도로 존재합니다.
컴퓨터의 큰 구조는 변한 것이 없지만, 기능이 점점 세분화 되고 있는 것입니다.
이런 하드웨어들의 변화들은 결국 API를 만드는 사람들의 개발 패러다임을 변화시킵니다.
그러한 패러다임의 변화는 애플리케이션 개발자들에게 새로운 학습을 요구합니다.
즉, 여러분들은 그런 변화에 맞추어서 더 많은 공부를 해야 하는 것입니다.T.T
초창기 Windows 운영체제 차원에서 화면에 그리기 위한 방법은,
GDI 관련 API 를 사용하는 것뿐 이였습니다.
운영체제 차원에서 모든 것을 관리하고 싶었기 때문에,
MS측에서도 별다른 문제를 느끼지 못했을 것입니다.
그런데 예측을 빗나간 부분이 있었는데, 그것은 게임 이였습니다.
게임 개발자들은 GDI 라는 훌륭한 모델이 있음에도 불구하고,
여전히 MS-DOS 기반으로 화면을 제어하고 있었던 것 이였습니다.
이유는 간단했습니다.
GDI 를 활용하면 분명히 쉬운 방법으로 개발을 할 수 있었지만,
DOS 기반의 방법보다 상대적으로 느렸습니다.
MS-DOS를 활용하면 하드웨어를 개발자가 직접 제어할 수 있기 때문에,
Windows 운영체제의 관리를 받는 GDI 보다는 훨씬 빨랐던 것입니다.
( 이 당시만 해도, CPU 사이클을 줄이는 것이 큰 최적화 이슈였습니다. )
MS-DOS를 빨리 벗어나려 했던 MS 입장에서는 적지 않은 충격(?)을 받게 됩니다.
물론 이런 문제는 게임뿐만 아니라,
멀티미디어 관련 개발에서도 나타났던 문제였습니다.^^
그렇게 해서 등장한 대한이 바로 DirectX 입니다.
처음 명칭이 GameSDK 였음에서 알 수 있듯이 게임 개발자를 위한 API 였습니다.
이 DirectX는 Windows 95 운영체제부터 추가되어서 활용되기 시작했습니다.
어쩌면, GDI 모델을 완전히 수정할 여유나 계획은 없었을지도 모릅니다.
어찌되었든 현재까지 GDI 와 DirectX는 이렇게 공존하면서 XP 운영체제까지 이르게 되었습니다.
XP 세대까지는 화면에 무엇인가를 그리는 작업을 기준으로 봤을 때는,
애플리케이션은 DirectX를 활용하는 애플리케이션과 GDI를 활용하는 애플리케이션으로 나눌 수 있었습니다.
GDI( Graphics Device Interface ) 라는 용어에서 보듯이,
일반적인 윈도우 애플리케이션에서 모니터 화면에 무엇인가를 출력하기 위해서는
GDI 라는 것을 이용해서 구현합니다.
이는 2D API 라고 볼 수 있습니다.
GDI를 통해서 애플리케이션과 디바이스 드라이버( Device driver ) 사이를
제어할 수 있습니다.
XP 세대에서 화면에 보여지는 대부분의 구성은 바로 이 GDI 를 활용한 것입니다.
GDI는 소프트웨어적으로 처리되기 때문에,
그래픽 하드웨어와 상관없이 처리할 수 있다는 큰 장점이 있습니다.
즉, CPU가 그래픽 처리에 필요한 연산을 수행합니다.
일반적인 윈도우 애플리케이션은 그래픽 하드웨어를 직접적으로 접근( access )할 수 없습니다.
반드시 GDI를 통해서 디바이스 드라이버에 접근해야 합니다.
GDI 의 최대 강점은 바로 디바이스 독립적( device-dependent ) 이라는 것입니다.
세상의 모든 PC가 동일한 사양을 갖추고 있으면 좋겠지만,
PC들은 저마다 다른 성능과 사양을 갖추고 있기 때문에,
이를 모두 제어하는 것은 굉장히 어렵고 힘든 일입니다.
하지만, GDI 코드는 어떠한 장치에 상관없이 화면에 공통된 그래픽을 표현할 수 있습니다.
왜냐하면 CPU가 이들에 대한 처리를 모두 수행하기 때문입니다.
GDI는 Windows 운영체제의 매우 오래된 기술 중 하나이며,
현재까지도 가장 널리 이용되는 윈도우 그래픽 API 라고 할 수 있습니다.
하지만 최근의 멀티코어 환경과 GPU의 발전은 많은 변화들을 가져왔으며,
GDI도 이러한 변화에 예외가 될 수 없었습니다.
급기야 이제는 DirectX가 GDI를 서서히 대체해 나가는 방향으로
가는 길이 정해지고 말았습니다.T.T
Good-bye!! GDI~~