C프로그래머가 알아야 할 것들 - 03 운영 체제와 컴퓨터 원리

Posted by 엘키의 주절 주절 on January 10, 2002

운영체제란?

초기에 컴퓨터는 컴퓨터를 키자마자 프로그램이 담겨 있는 디스크를 삽입해야만 했습니다. 그리고 특별한 경우를 제외하고는 다른 프로그램 사용시에는 재 부팅 시켜야만 했습니다. 이 방법은 매우 불편했습니다. (비디오 게임기들은 이 방식을 채용하고 있는 경우가 많습니다)

그래서 유닉스, MS-DOS등의 운영체제가 나오게 됐습니다. (참고로 MDIR은 운영체제가 아닙니다. 인터페이스를 제공해주는 프로그램이죠) 각 운영체제하에 프로그램을 구동시킨 후, 프로그램 종료 시에는 그 운영체제로 돌아오게끔 하는 방식을 취한 것이죠.

이전에는 그래픽 카드나 프린터, 사운드 카드마다 출력을 지원해주는 방식이 달랐습니다. 점 하나 찍거나 소리를 내는 방법이 하드웨어에 따라 달랐죠.

그래서 각 하드웨어 장치(지금은 그래픽 카드와 사운드 카드를 의미합니다)를 컨트롤 하기 위한 작업들은 프로그램 개발 업체마다 따로 이루어져야 했고, 그렇기에 발매된 지 얼마 되지 않은 하드웨어나, 대중적이지 않은 하드웨어의 경우는 지원되지 않는 경우가 대부분

상황이 이렇다 보니 프로그래머들은 프로그래머 나름대로 다수의 하드웨어 장치를 지원하려다 보니 힘들었고, 사용자들은 사용자 나름대로 내 하드웨어가 내가 사려는 소프트웨어와 호환되는지를 따져봐야 하는 불편한 상황이었죠.

물론 DOS시절에도 VESA (Video Electronics Standard Association: 비디오 가전 표준 협회)등에서 그래픽 카드의 표준화를 시키고 표준에 맞는 그래픽 카드는 모두 지원되도록 노력을 기울였지만 만족스러운 결과를 얻어내진 못했습니다.

윈도우 이런 문제에 대한 대한을 가지고 있었습니다.

MS-DOS와 비교되는 윈도우의 장점으로 GUI (Graphic User Interface)를 꼽지만, 플러그 앤 플레이나, API (Application Programming Interface)도 빠지면 안될 정도로 중요한 요소입니다.

플러그 인 플레이는 자동 하드웨어 장치 인식 기능으로, MS-DOS의 단점을 보완해주기에 충분했습니다. 각종 장치에 대한 추상화를 이뤄내서, 사용자가 어떤 장치를 사용하던 간에, 운영체제가 그 장치를 지원하기만 한다면, 프로그래머는 그 장치를 이용할 수 있어졌습니다.

API는 프로그램 개발용 함수 모음으로, 점 찍기, 타이머, 텍스트 출력, 마우스 입력, 키보드 입력 등등 프로그램 개발에 필요한 기본적인 기능을 지원해줍니다. 각 프로그램마다 자체적으로 지원하기 위해 시간투자를 해왔던 작업들을 운영체제에서 추상화를 통한 지원이 이뤄짐에 따라, 프로그램 개발이 한결 편해진 것입니다.

이벤트

MS 윈도우(이하 윈도우)에서 이벤트란 윈도우에서 발생하는 정보들을 말합니다. 즉, 마우스 이동, 마우스왼쪽 버튼 클릭, 마우스오른쪽 버튼 클릭, 키보드 누름, 키보드 뗌, 문자 키 누름, 프로그램 시작, 프로그램 종료 등 다양한 상황마다 이벤트가 발생하는데, 그렇게 발생되는 이벤트를 메시지로 프로그램에 보내줍니다.

윈도우에서 응용 프로그램에 전달 해 주는 메시지 중 원하는 메시지를 이용하여 처리해주는 것이 윈도우 프로그래밍에서의 이벤트 프로그래밍이라고 합니다.

윈도우가 하드웨어의 접근을 직접 관리하기 때문에, 윈도우용 프로그램을 개발하는, 프로그래머들은 하드웨어 제어에 대해 그다지 신경 쓰지 않아도 되는 것이죠.

프로세스와 쓰레드

프로세스는 프로그램의 실행 단위를 의미 합니다. 다른 말로는 작업이라는 의미로 태스크라 부르기도 하죠.

멀티 태스크나 멀티 프로세스란, 다중 프로그램 구동이라고 생각하시면 됩니다.

멀티 태스크를 통해 우리는 동시에 프로그램이 실행되고 있다고 생각하시는 분도 많을 겁니다. 그러나 실상은 눈 깜짝 할 사이에 여러 개의 프로그램이 번갈아 가면서 실행되고 있는 것인데, 그것이 매우 빠른 속도로 이루어지기에, 우리는 동시에 작동하는 것으로 느끼는 것이죠.

쓰레드는 프로세스 내부의 실행 단위를 말합니다. 프로세스 내에서 쓰레드가 여러 개 존재하여 처리되는 것을 멀티 쓰레드라 하죠.

예를 들면 메신저라는 한 프로그램 내에서 음악 재생하면서 채팅(메시지 입력)을 할 수 있는 것은, 음악 재생과 채팅기능이 쓰레드 단위로 구동되기 때문입니다.

멀티 쓰레드도 멀티 태스크와 마찬가지로 한 프로세스의 시간을 쪼개 씀으로 인해, 동시에 여러 가지 작업이 이루어 지는 것처럼 보여지는 것입니다.

컴퓨터는 계산기다

컴퓨터는 계산기라고 한다면, 아니? 계산기에서 동영상도 볼 수 있고, 게임도 할 수 있고, 그림도 볼 수 있고, 음악도 나온다는 게 말이 되냐고 하시는 분도 있으시겠지만 사실입니다. 컴퓨터라는 이름 자체가 Compute (계산하다)에서 파생된 것도 우연은 아니겠죠?

초기 컴퓨터(최초의 컴퓨터는 애니악으로 알려져 있는데, 최초의 컴퓨터는 앨런 튜닝이 2차 세계 대전에서 독일군 암호 해독을 위해 만들어진 콜로서스입니다)는 계산을 하기 위해 만들어졌습니다. 대형 고속 계산기쯤이었다고 생각해도 되겠죠? 그 당시의 컴퓨터는 연산속도도 느리고, 연산을 위한 저장 장소가 작았기 때문에 간단한 처리밖에 못했습니다.

시간이 흐르면서 컴퓨터는 발전을 거듭했습니다. CPU의 연산 속도도 이전과는 비교도 안될 정도로 빨라졌고, 메모리 용량이 증가했으며, 보조 기억 장치의 용량도 증가했습니다.

소프트웨어도 하드웨어 장치를 활용할 수 있도록 발전해왔습니다.

하드웨어는 사용자로부터 입력을 받아 그 것을 비트 정보로 변환하고 프로그램(혹은 운영체제)에 전달합니다.

프로그램은 어떤 소리를 출력해야 하는지, 어떤 이미지를 보여주어야 하는지가 결정해서 다시 출력 장치로 전송합니다.

출력 장치인 모니터나 스피커는 전달 받은 디지털 데이터를 분석해서 그에 맞는 출력을 해주면서 컴퓨터를 통한 하드웨어 연동이 이루어지고 있습니다.

이런 과정이 다 계산으로 이루어 질 수 있는 것은, 챕터2에서 설명한 비트의 법칙 덕분입니다. 컴퓨터에서는 소리도, 영상도 모두 디지털 데이터인 비트 값으로 저장하고 있습니다. 비트 값은 수치화된 값입니다. 저장된 값에 맞는 출력을 장치에 요청함으로, 소리가 재생되고, 영상도 출력되는 것입니다.

2D게임이 3D게임보다 빠르다?

우리가 흔히 하는 착각은 2D게임이 3D게임보다 빠르다. 혹은 2D게임은 저 사양이다라는 생각입니다.

컴퓨터에서 이뤄지는 모든 것들은 계산에 의한 것입니다.

그렇기 때문에, 2D게임이던, 3D게임이던 간에 게임의 속도는 얼마만큼 많은 계산을 필요로 하는지에 달려있는 것이지, 같은 (혹은 비슷한) 기능을 가진 게임이라면 2D와 3D의 기본적인 연산 속도의 차이(3D는 일반적으로 다각형으로 이루어져 있기에 기본적으로 이루어져야 할 연산이 많고, 실수 연산이 많이 필요하기 때문에 2D보다는 확실히 연산할 것이 많긴 합니다)가 있지만, 게임의 규모가 커지다 보면 오히려 2D게임이 느려지는 경우가 발생하기도 합니다.

할 수 있는 액션이 별로 없는 경우에는, 2D쪽이 월등이 빠르겠지만, 많은 수의 액션, 많은 수의 프레임 갱신, 부드러운 화면 처리, 시각적 효과 등이 필요할 경우에는 3D보다 많은 연산을 해야 하는 경우도 많습니다. 특히나 화면 확대를 해야 할 경우, 3D는 카메라를 당기기만 하면 되지만, 2D는 현재 픽셀 값을 기반으로 확대 했을 때 영상 비를 유지 시키면서 보간 및 확대 연산을 해야 합니다. 2D일 때의 계산 량이 더 많을 가능성이 높습니다.

심지어는 화면 전환마저 거의 없는 게임인 Football Manage시리즈의 경우 웬만한 3D게임보다도 속도가 느린데, 이 것은 이 게임이 처리해야 될 데이터가 많기 때문입니다. 모든 경기 결과는 랜덤이 아닌, FM시리즈의 규칙(데이터에 기반하되, 그 데이터가 전부가 아닌)에 따른 결과가 나와야 하기 때문에, 모든 경기 결과를 시뮬레이션을 통해 얻어내야 되는데, 그 계산해야 될 데이터가, 웬만한 3D게임보다 많기 때문에 느린 것입니다.

3D게임이 느렸던 것에는 실수 연산도 한몫 했는데요, 부동 소수점 실수의 연산은 정수처럼 간단하지가 않아서 실수 연산을 많이 필요로 하는 3D게임이 느렸었죠. 요새는 3D게임을 위해 실수 연산 속도를 끌어 올린 그래픽 카드들로 인해 이런 문제는 많이 해결됐죠.

어때요? 컴퓨터의 속도에 대한 감이 오시나요?