C 프로그래머가 알아야할 것들 - Chapter 3. 운영체제와 컴퓨터 원리
김성훈 (sunghun84@nate.com)
Chapter 3. 운영체제와 컴퓨터 원리
(1) 운영체제란?
(2) 이벤트
(3) 프로세스와 쓰레드
(4) 컴퓨터는 계산기다
(5) 디지털과 아날로그
(6) 2D게임이 3D게임보다 빠르다?
(1) 운영체제란?
초기에 컴퓨터는 컴퓨터를 키자마자 애플리케이션 디스크를 삽입해야만 했습니다.
그리고 특별한 경우를 제외하고는 다른 프로그램 사용시에는 재부팅 시켜야만 했습니다.
이 방법은 매우 불편했습니다. (비디오 게임기들은 아직 이 방식을 채용하고 있는 경우도 있습니다.)
그래서 유닉스, MS-DOS등의 운영체제가 나오게 됐습니다. (많은 분들이 오해하시는 것이 있으신데, MDIR은 운영체제가 아닙니다. 인터페이스를 제공해주는 프로그램이죠)
각 운영체제하에 프로그램을 구동시킨후, 프로그램 종료시에는 그 운영체제로 돌아오게끔 하는 방식을 취한것이죠.
또한 프로그래머를 위한 장치 지원 인터페이스를 제공해 주기도 했습니다. (MS-DOS에서는 매우 미약했지만, 윈도우로 넘어와서는 극찬 받는 기능이죠)
이전에는 그래픽 카드나 프린터, 사운드 카드마다 출력을 지원해주는 방식이 달랐습니다. 점 하나 찍거나 소리를 내는방법이 하드웨어에 따라 달랐던것이지요.
그래서 각 하드웨어 장치(여기선 일반적으로 그래픽 카드와 사운드 카드를 의미합니다)를 컨트롤 하기 위한 작업들은 프로그램 개발 업체마다 따로 이루어져야했고, 그렇기에 발매된지 얼마 되지 않은 하드웨어나, 판매량이 적은 비 인기 하드웨어의 경우는 지원되지 않는 경우가 대부분이었습니다.
상황이 이렇다보니 프로그래머들은 프로그래머 나름대로 다수의 하드웨어 장치를 지원하려다 보니 힘들었고, 사용자들은 사용자 나름대로 내 하드웨어가 내가 사려는 소프트웨어의 지원이 되는지 곰곰히 따져봐야하는 불편한 상황이었죠.
물론 DOS시절에도 VESA (Video Electronics Standard Association)등에서 그래픽 카드의 표준화를 시키긴했지만, 호환성 문제는 고질적인 문제였습니다.
그래서 나온 것이 바로 윈도우입니다.
대게 MS-DOS와 비교되는 윈도우의 장점으로 GUI (Graphic User Interface)를 꼽지만, 플러그 앤 플레이나, API (Application Programming Interface)도 빠지면 안될정도로 중요한 요소입니다.
플러그 인 플레이는 자동 하드웨어 장치 인식 기능으로, MS-DOS의 단점을 보완해주기에 충분했습니다.
API는 프로그램 개발용 함수 모음으로, 점찍기, 타이머, 텍스트 출력, 마우스 입력, 키보드 입력 등등 프로그램 개발에 필요한 기본적인 기능을 지원해준 것입니다. 각 프로그램마다 자체적으로 지원하기 위해 엄청난 시간투자를 해왔던 작업들을 운영체제가 지원해줌으로써, 프로그램 개발이 한결 편해진것입니다.
여기서는 주로 윈도우의 예를 들겠지만, 다른 운영체제도 용어만 틀리지 원리는 비슷하니 이해하시는데 무리는 없을겁니다.
(2) 이벤트
MS 윈도우(이하 윈도우)에서 이벤트란 윈도우에서 발생하는 정보들을 말합니다.
즉, 마우스 이동, 마우스왼쪽 버튼 클릭, 마우스오른쪽 버튼 클릭, 키보드 누름, 키보드 뗌, 문자 키 누름,프로그램 시작, 프로그램 종료등 다양한 상황마다 이벤트가 발생하는데, 그렇게 발생되는 이벤트를 메시지로 프로그램에 보내주는 것입니다.
그 메시지를 받아서 필요한 메시지를 이용하여 처리해주는 것이 윈도우 프로그래밍에서의 이벤트 프로그래밍 방식이라고 합니다.
하드웨어 장치를 어느 회사 제품이냐, 어떠한 식으로 제어해야 하는가를 프로그래머가 신경써야한다면, 운영체제가 이벤트를 보낼수 없겠죠? 하드웨어 제어를 프로그래머가 만든 응용 프로그램이 한다면, 운영체제가 그 하드웨어에서 발생한 이벤트를 보낼 수 없을겁니다. (응용 프로그램 내부에서 그 하드웨어를 제어하며 이벤트 발생시 메시지를 보낼 수는 있겠지만요.)
하드웨어의 접근을 운영체제가 직접 관리하기 때문에, 프로그래머들은 그 부분에 신경않아도 되고, 이벤트 발생시 그 이벤트를 메시지로 받아서 처리하기만 하면 되는것이죠
(3) 프로세스와 스레드
간단히 말해서 프로그램이 실행되고 있는 것을 프로세스라 합니다.
이런 프로세스를 (어느정도는 의미가 다르지만) 태스크라 부르기도 하죠.
우리가 흔히 들어온 멀티 태스크란, 다중 프로그램 구동이라고 생각해도 될겁니다.
이 멀티 태스크를 통해 우리는 동시에 프로그램이 실행되고 있구나라고 생각하시는 분도 많을겁니다.
그러나 실상은 눈깜짝할사이에 여러개의 프로그램이 번갈아가면서 실행되고 있기에 우리는 동시에 작동하는걸로 생각되는것이죠.
스레드는 프로세스 내부의 실행 단위를 말합니다. 프로세스내에서 스레드가 여러개 존재하여 처리되는 것을 멀티 스레드라 하는것이죠.
예를 들면 메신져에서 음악 재생하면서 채팅(메시지 입력)을 할 수 있는 것은, 음악 재생과 채팅기능이 스레드 단위로 구동되기 떄문입니다.
만약 이 프로그램이 태스크 단위로 구동되었다면, 그 프로그램을 이용하여 음악을 재생하는중에는 그 프로그램을 이용한 채팅이 불가능하게 됩니다. 음악이 자동으로 멈추거나, 중지 시키지 않는다면 말이죠.
(4) 컴퓨터는 계산기다
컴퓨터는 계산기라고 한다면, 아니? 계산기에서 동영상도 볼 수 있고, 3D게임도 할 수 있고, 그림도 볼 수 있고, 음악도 나온다는 게 말이되냐고 하시는분도있으실겁니다.
하지만 사실입니다. 입력장치(키보드,마우스)나 출력장치(모니터,프린터,스피커)는 주변기기입니다. 컴퓨터는 입력장치로부터 신호를 받아 그 것을 비트로 변환하여 프로그램(혹은 운영체제)에 전달한후 그에 맞는 처리를 하다가, 출력 장치로 출력해줄 필요가 있을 때 출력장치에 신호를 보내서 출력해주게 됩니다. 이 과정들도 비트로 이루어져있습니다. 컴퓨터는 이진수(on, off)밖에 모르기 때문입니다.
초기 컴퓨터(최초의 컴퓨터로는 애니악으로 잘못 알려져있는데 실은 앨런 튜닝이 세계 2차대전에서 독일군 암호 해독을 위해 만들어진 콜로서스입니다)는 연산속도도 느리고, 연산을 위한 저장 장소(덧셈을 해주려면, 최소 두 개의 저장 장소가 필요합니다. 첫 번째값, 그리고 더해줄 두 번째값. 세 번째 값은 결과값이 필요하다고 생각하실지도 모르겠습니다만, 첫 번째 값과 두 번째 값은 연산후에는 필요가 없어지기에 둘중 아무곳에나 결과값을 저장하면 됩니다.)가 작았기 때문에 간단한 처리밖에 못했습니다. 그런 계산들을 하기 위해 컴퓨터가 만들어졌고, 그것이 당연했죠.
그러나, CPU와 RAM의 속도와 용량이 증가함에 따라서, 컴퓨터의 연산속도가 급격히 상승했습니다. 그에 맞춰 소프트웨어와 입출력 장치들도 발전을 거듭하면서, 비트 단위로 이루어진 데이터를 이용하여 동영상을 재생하고, 그림 파일을 보여주고, 3D게임도 가능하게 된 것입니다. 동영상 파일이나, 그림 파일등이 비트를 기반으로 한 정보로 이루어졌었다고 배웠죠? 그런 데이터들을 출력하는 과정도, 출력 장치 혹은 주변 기기(그래픽 카드나 사운드 카드)의 도움을 받기는 하지만, 일반적으로 컴퓨터의 연산기능을 이용합니다.
그렇기에 컴퓨터는 매우 빠른(이런 말로 표현하기엔 터무니없이 부족하지만) 계산기라고도 할 수 있는것입니다.
(5) 디지털과 아날로그
컴퓨터를 이해하기 위해서 우리는 디지털과 아날로그에 대해 이해할 필요가 있습니다. 왜냐하면 컴퓨터는 수치를 기반으로 한 디지털에 기초하고 있기 때문입니다. (그렇기 떄문에 수학과도 큰 연관이 있습니다.)
아날로그란 연속된 정보를 말합니다. 물론 아날로그도 수치로 표현할 수 있지만, 좀 더 세분화된 정보를 다룬다는 것이 차이점입니다.
그에 반해 디지털은 단절된 정보를 다룹니다. 바로 중간값을 취하지 않는다는 얘기입니다. 예를 들면, 컴퓨터에서 작동하는 시계를 직접 만든다고 생각해봅시다. 이 시계는 큰 기능이 필요 없기 때문에 초까지만 다룬고 한다면, 0.1초나, 0.01초등의 정보를 다루지 않게 됩니다. 물론 0.01초까지 다룬기로 했다면, 이야기가 또 틀려지지만요. 결과적으로 중간값을 다루지 않죠.
컴퓨터는 디지털로 이루어져있지만, 아날로그 데이터도 다룰 수 있기 때문에 이 두 방식의 차이점을 기억해두도록 합시다.
(6) 2D게임이 3D게임보다 빠르다?
우리가 흔히 하는 착각은 2D게임이 3D게임보다 빠르다. 혹은 2D게임은 저 사양이다라는 생각입니다.
이것은 지금까지 배운 논리를 적용하면 쉽게 알 수 있는 것인데, 컴퓨터에서 구동되는 모든 과정은 계산에 의한것입니다.
그렇기 때문에, 2D던, 3D던 게임의 속도는 얼마만큼 많은 계산을 필요로 하는지에 달려있는 것이지, 같은 (혹은 비슷한) 기능을 가진 게임이라면 2D와 3D의 기본적인 연산 속도의 차이(3D는 일반적으로 폴리곤=다각형으로 이루어져 있기에 기본적으로 이루어져야할 연산이 많고, 실수 연산이 많이 필요하기 때문에 더욱 2D보다는 확실히 연산할 것이 많습니다.)는 있을 수 있어도, 게임의 규모가 커지다보면 오히려 2D게임이 느려지는 경우가 발생하게 됩니다.
3D게임의 경우는 모션에 따른 변화되는 정보를 가지고 원본 데이터에서 변화시키는 방식인데 반해, 2D의 경우는 캐릭터의 모든 행동 정보를 이미지 파일로 가지고 있어야하기 때문이다.
그리고, 시각적 효과가 거의 없는 게임인 FM시리즈(Football Manager의 약자로, 원래는 Championship Manager 시리즈였던 게임)의 경우 왠만한 3D게임보다도 속도가 느린데, 이 것은 이 게임이 처리해야 될 데이터가 많기 때문입니다. 모든 경기 결과는 랜덤이 아닌, FM시리즈의 규칙(데이터에 기반하되, 그 데이터가 전부가 아닌)에 따른 결과가 나와야 하기 때문에, 모든 경기 결과를 계산해야되는데, 그 계산해야 될 데이터가, 왠만한 3D게임보다 많기 때문에 느린 것입니다.
어때요? 컴퓨터의 속도에 대한 감이 오시나요?
김성훈 (sunghun84@nate.com)
Chapter 3. 운영체제와 컴퓨터 원리
(1) 운영체제란?
(2) 이벤트
(3) 프로세스와 쓰레드
(4) 컴퓨터는 계산기다
(5) 디지털과 아날로그
(6) 2D게임이 3D게임보다 빠르다?
(1) 운영체제란?
초기에 컴퓨터는 컴퓨터를 키자마자 애플리케이션 디스크를 삽입해야만 했습니다.
그리고 특별한 경우를 제외하고는 다른 프로그램 사용시에는 재부팅 시켜야만 했습니다.
이 방법은 매우 불편했습니다. (비디오 게임기들은 아직 이 방식을 채용하고 있는 경우도 있습니다.)
그래서 유닉스, MS-DOS등의 운영체제가 나오게 됐습니다. (많은 분들이 오해하시는 것이 있으신데, MDIR은 운영체제가 아닙니다. 인터페이스를 제공해주는 프로그램이죠)
각 운영체제하에 프로그램을 구동시킨후, 프로그램 종료시에는 그 운영체제로 돌아오게끔 하는 방식을 취한것이죠.
또한 프로그래머를 위한 장치 지원 인터페이스를 제공해 주기도 했습니다. (MS-DOS에서는 매우 미약했지만, 윈도우로 넘어와서는 극찬 받는 기능이죠)
이전에는 그래픽 카드나 프린터, 사운드 카드마다 출력을 지원해주는 방식이 달랐습니다. 점 하나 찍거나 소리를 내는방법이 하드웨어에 따라 달랐던것이지요.
그래서 각 하드웨어 장치(여기선 일반적으로 그래픽 카드와 사운드 카드를 의미합니다)를 컨트롤 하기 위한 작업들은 프로그램 개발 업체마다 따로 이루어져야했고, 그렇기에 발매된지 얼마 되지 않은 하드웨어나, 판매량이 적은 비 인기 하드웨어의 경우는 지원되지 않는 경우가 대부분이었습니다.
상황이 이렇다보니 프로그래머들은 프로그래머 나름대로 다수의 하드웨어 장치를 지원하려다 보니 힘들었고, 사용자들은 사용자 나름대로 내 하드웨어가 내가 사려는 소프트웨어의 지원이 되는지 곰곰히 따져봐야하는 불편한 상황이었죠.
물론 DOS시절에도 VESA (Video Electronics Standard Association)등에서 그래픽 카드의 표준화를 시키긴했지만, 호환성 문제는 고질적인 문제였습니다.
그래서 나온 것이 바로 윈도우입니다.
대게 MS-DOS와 비교되는 윈도우의 장점으로 GUI (Graphic User Interface)를 꼽지만, 플러그 앤 플레이나, API (Application Programming Interface)도 빠지면 안될정도로 중요한 요소입니다.
플러그 인 플레이는 자동 하드웨어 장치 인식 기능으로, MS-DOS의 단점을 보완해주기에 충분했습니다.
API는 프로그램 개발용 함수 모음으로, 점찍기, 타이머, 텍스트 출력, 마우스 입력, 키보드 입력 등등 프로그램 개발에 필요한 기본적인 기능을 지원해준 것입니다. 각 프로그램마다 자체적으로 지원하기 위해 엄청난 시간투자를 해왔던 작업들을 운영체제가 지원해줌으로써, 프로그램 개발이 한결 편해진것입니다.
여기서는 주로 윈도우의 예를 들겠지만, 다른 운영체제도 용어만 틀리지 원리는 비슷하니 이해하시는데 무리는 없을겁니다.
(2) 이벤트
MS 윈도우(이하 윈도우)에서 이벤트란 윈도우에서 발생하는 정보들을 말합니다.
즉, 마우스 이동, 마우스왼쪽 버튼 클릭, 마우스오른쪽 버튼 클릭, 키보드 누름, 키보드 뗌, 문자 키 누름,프로그램 시작, 프로그램 종료등 다양한 상황마다 이벤트가 발생하는데, 그렇게 발생되는 이벤트를 메시지로 프로그램에 보내주는 것입니다.
그 메시지를 받아서 필요한 메시지를 이용하여 처리해주는 것이 윈도우 프로그래밍에서의 이벤트 프로그래밍 방식이라고 합니다.
하드웨어 장치를 어느 회사 제품이냐, 어떠한 식으로 제어해야 하는가를 프로그래머가 신경써야한다면, 운영체제가 이벤트를 보낼수 없겠죠? 하드웨어 제어를 프로그래머가 만든 응용 프로그램이 한다면, 운영체제가 그 하드웨어에서 발생한 이벤트를 보낼 수 없을겁니다. (응용 프로그램 내부에서 그 하드웨어를 제어하며 이벤트 발생시 메시지를 보낼 수는 있겠지만요.)
하드웨어의 접근을 운영체제가 직접 관리하기 때문에, 프로그래머들은 그 부분에 신경않아도 되고, 이벤트 발생시 그 이벤트를 메시지로 받아서 처리하기만 하면 되는것이죠
(3) 프로세스와 스레드
간단히 말해서 프로그램이 실행되고 있는 것을 프로세스라 합니다.
이런 프로세스를 (어느정도는 의미가 다르지만) 태스크라 부르기도 하죠.
우리가 흔히 들어온 멀티 태스크란, 다중 프로그램 구동이라고 생각해도 될겁니다.
이 멀티 태스크를 통해 우리는 동시에 프로그램이 실행되고 있구나라고 생각하시는 분도 많을겁니다.
그러나 실상은 눈깜짝할사이에 여러개의 프로그램이 번갈아가면서 실행되고 있기에 우리는 동시에 작동하는걸로 생각되는것이죠.
스레드는 프로세스 내부의 실행 단위를 말합니다. 프로세스내에서 스레드가 여러개 존재하여 처리되는 것을 멀티 스레드라 하는것이죠.
예를 들면 메신져에서 음악 재생하면서 채팅(메시지 입력)을 할 수 있는 것은, 음악 재생과 채팅기능이 스레드 단위로 구동되기 떄문입니다.
만약 이 프로그램이 태스크 단위로 구동되었다면, 그 프로그램을 이용하여 음악을 재생하는중에는 그 프로그램을 이용한 채팅이 불가능하게 됩니다. 음악이 자동으로 멈추거나, 중지 시키지 않는다면 말이죠.
(4) 컴퓨터는 계산기다
컴퓨터는 계산기라고 한다면, 아니? 계산기에서 동영상도 볼 수 있고, 3D게임도 할 수 있고, 그림도 볼 수 있고, 음악도 나온다는 게 말이되냐고 하시는분도있으실겁니다.
하지만 사실입니다. 입력장치(키보드,마우스)나 출력장치(모니터,프린터,스피커)는 주변기기입니다. 컴퓨터는 입력장치로부터 신호를 받아 그 것을 비트로 변환하여 프로그램(혹은 운영체제)에 전달한후 그에 맞는 처리를 하다가, 출력 장치로 출력해줄 필요가 있을 때 출력장치에 신호를 보내서 출력해주게 됩니다. 이 과정들도 비트로 이루어져있습니다. 컴퓨터는 이진수(on, off)밖에 모르기 때문입니다.
초기 컴퓨터(최초의 컴퓨터로는 애니악으로 잘못 알려져있는데 실은 앨런 튜닝이 세계 2차대전에서 독일군 암호 해독을 위해 만들어진 콜로서스입니다)는 연산속도도 느리고, 연산을 위한 저장 장소(덧셈을 해주려면, 최소 두 개의 저장 장소가 필요합니다. 첫 번째값, 그리고 더해줄 두 번째값. 세 번째 값은 결과값이 필요하다고 생각하실지도 모르겠습니다만, 첫 번째 값과 두 번째 값은 연산후에는 필요가 없어지기에 둘중 아무곳에나 결과값을 저장하면 됩니다.)가 작았기 때문에 간단한 처리밖에 못했습니다. 그런 계산들을 하기 위해 컴퓨터가 만들어졌고, 그것이 당연했죠.
그러나, CPU와 RAM의 속도와 용량이 증가함에 따라서, 컴퓨터의 연산속도가 급격히 상승했습니다. 그에 맞춰 소프트웨어와 입출력 장치들도 발전을 거듭하면서, 비트 단위로 이루어진 데이터를 이용하여 동영상을 재생하고, 그림 파일을 보여주고, 3D게임도 가능하게 된 것입니다. 동영상 파일이나, 그림 파일등이 비트를 기반으로 한 정보로 이루어졌었다고 배웠죠? 그런 데이터들을 출력하는 과정도, 출력 장치 혹은 주변 기기(그래픽 카드나 사운드 카드)의 도움을 받기는 하지만, 일반적으로 컴퓨터의 연산기능을 이용합니다.
그렇기에 컴퓨터는 매우 빠른(이런 말로 표현하기엔 터무니없이 부족하지만) 계산기라고도 할 수 있는것입니다.
(5) 디지털과 아날로그
컴퓨터를 이해하기 위해서 우리는 디지털과 아날로그에 대해 이해할 필요가 있습니다. 왜냐하면 컴퓨터는 수치를 기반으로 한 디지털에 기초하고 있기 때문입니다. (그렇기 떄문에 수학과도 큰 연관이 있습니다.)
아날로그란 연속된 정보를 말합니다. 물론 아날로그도 수치로 표현할 수 있지만, 좀 더 세분화된 정보를 다룬다는 것이 차이점입니다.
그에 반해 디지털은 단절된 정보를 다룹니다. 바로 중간값을 취하지 않는다는 얘기입니다. 예를 들면, 컴퓨터에서 작동하는 시계를 직접 만든다고 생각해봅시다. 이 시계는 큰 기능이 필요 없기 때문에 초까지만 다룬고 한다면, 0.1초나, 0.01초등의 정보를 다루지 않게 됩니다. 물론 0.01초까지 다룬기로 했다면, 이야기가 또 틀려지지만요. 결과적으로 중간값을 다루지 않죠.
컴퓨터는 디지털로 이루어져있지만, 아날로그 데이터도 다룰 수 있기 때문에 이 두 방식의 차이점을 기억해두도록 합시다.
(6) 2D게임이 3D게임보다 빠르다?
우리가 흔히 하는 착각은 2D게임이 3D게임보다 빠르다. 혹은 2D게임은 저 사양이다라는 생각입니다.
이것은 지금까지 배운 논리를 적용하면 쉽게 알 수 있는 것인데, 컴퓨터에서 구동되는 모든 과정은 계산에 의한것입니다.
그렇기 때문에, 2D던, 3D던 게임의 속도는 얼마만큼 많은 계산을 필요로 하는지에 달려있는 것이지, 같은 (혹은 비슷한) 기능을 가진 게임이라면 2D와 3D의 기본적인 연산 속도의 차이(3D는 일반적으로 폴리곤=다각형으로 이루어져 있기에 기본적으로 이루어져야할 연산이 많고, 실수 연산이 많이 필요하기 때문에 더욱 2D보다는 확실히 연산할 것이 많습니다.)는 있을 수 있어도, 게임의 규모가 커지다보면 오히려 2D게임이 느려지는 경우가 발생하게 됩니다.
3D게임의 경우는 모션에 따른 변화되는 정보를 가지고 원본 데이터에서 변화시키는 방식인데 반해, 2D의 경우는 캐릭터의 모든 행동 정보를 이미지 파일로 가지고 있어야하기 때문이다.
그리고, 시각적 효과가 거의 없는 게임인 FM시리즈(Football Manager의 약자로, 원래는 Championship Manager 시리즈였던 게임)의 경우 왠만한 3D게임보다도 속도가 느린데, 이 것은 이 게임이 처리해야 될 데이터가 많기 때문입니다. 모든 경기 결과는 랜덤이 아닌, FM시리즈의 규칙(데이터에 기반하되, 그 데이터가 전부가 아닌)에 따른 결과가 나와야 하기 때문에, 모든 경기 결과를 계산해야되는데, 그 계산해야 될 데이터가, 왠만한 3D게임보다 많기 때문에 느린 것입니다.
어때요? 컴퓨터의 속도에 대한 감이 오시나요?
'프로그래밍 > C | C++' 카테고리의 다른 글
문자열 처리 함수 정리 (0) | 2013.08.14 |
---|---|
FFMPEG 압축 기본적인 사용법 (0) | 2013.08.14 |
[펌] C 프로그래머가 알아야할 것들 #4 (0) | 2013.08.14 |
[펌] C 프로그래머가 알아야할 것들 #2 (0) | 2013.08.14 |
[펌] C 프로그래머가 알아야 할 것들 #1 (0) | 2013.08.14 |