프로그램 실행과정
프로그램의 실제 실행단계를 살펴보기 위해서,
우리가 잘 아는 실행파일의 생성과정을 간략히 정리하고자 한다.
단계 1 : 전처리기에 의한 치환작업
위 그림을 보면, 실행파일 생성의 가장 첫 번째 단계가
전처리기에 의해서 이뤄짐을 알 수 있다.
전처리기는 '#include', '#define'과 같이 '#' 으로 시작하는
지시자의 지시에 따라서 소스코드를 적절히 변경하는 작업을 한다.
단계 2 : 컴파일러의 의한 번역
단계 1에 의해서 변경된 소스코드는 여전히 C 언어로 구성되어 있어서
우리가 눈으로 봐도 이해할 수 있는 내용이다.
이제 이 소스코드는 컴파일러에 의해서 어셈블리 코드로 번역된다.
어셈블리 코드가 무엇인지 대략은 알고 있을 것이다.
CPU가 디자인될 때 CPU에게 일을 시키기 위한 명령어도 함께 디자인 되는데,
어셈블리 코드란 이러한 명령어를 조합해서 만들어진 프로그램 코드를 의미한다.
만약, C와 같은 언어로 구현된 프로그램을 어셈블리 프로그램으로 변경해 주는
컴파일러가 없었다면 우리는
이 명령어 체계(어셈블리 언어)를 익혀서 프로그램을 작성해야 했다.
단계 3 : 어셈블리에 의한 바이너리 코드 생성
보통 바이너리 코드라고 하면 어럽게 생각한다.
그러나 텍스트 코드에 상대되는 뜻이라고 생각하면 쉽다.
즉 1과 0으로만 구성되는 코드를 말한다.
컴파일러에 의해 번역된 어셈블리 코드는 컴퓨터에 의해 실행되기 앞서
바이너리 코드로 번역되어야 한다.
왜냐하면 컴퓨터는 오로지 1과 0만을 이해하기 때문이다.
단계 4 : 링커에 의한 연결과 결합
C 언어 기반을 잘 다진 개발자라면
링커가 하는 기본적인 일들은 정확히 알고 있을 것이다.
간단히 말하자면, 프로그램 내에서 참조하는 함수나
라이브러리들은 하나로 묶는 (혹은 연결시켜 주는)
작업을 한다고 설명할 수 있다.
이 과정이 끝나면 실제로 실행 가능한 실행파일이 생성된다.
물론 이 실행파일은 컴퓨터가 실행해야 하는 바이너리 코드로 구성된다.
이러한 과정을 폰노이만 "Stored Program Concept"로 표현해보자.
- 단계 1. Fetch :
메모리상에 존재하는 명령어를 CPU로 가져오는 작업이다.
메모리상에 존재하는 명령어 A를 CPU로 이동시키고 있다. - 단계 2. Decode :
가져다 놓은 명령어를 CPU가 해석하는 단계이다.
다시 말해서 무슨 일을 하라는 명령어인지 분석하는 단계이다.
위 그림에서 보면 네모 상자 안에 "덧셈!"이라는 문장이 쓰여져있다.
명령어 A가 덧셈을 하라는 의미로 해석되어 졌음을 뜻하는 것이다. - 단계 3. Execution :
해석된 명령어의 명령대로 CPU가 실행하는 단계이다.
위 그림에서 보면 네모 상자 안에 "덧셈 실행"이라는 문장이 쓰여져 있다.
덧셈 연산을 하는 CPU를 표현한 것이다.
결국, 프로그램의 기본 실행은
Fetch, Decode, Execution 단계를 거친다고 말할 수 있다.
별것 아닌 것 같지만 상당히 중요한 개념이므로 정리해 두기 바란다.
'컴퓨터 구조 + 운영체제' 카테고리의 다른 글
Windows Internals vol.1 - 프로세스 정리 (2) | 2024.12.18 |
---|---|
시스템 프로그래밍의 이해와 접근 (1) | 2024.11.24 |
Unix/Linux Architecture (0) | 2024.11.10 |
시스템 프로그래밍 능력을 갖춰야 하는 이유 (0) | 2024.11.09 |
시스템 프로그래밍이란? (0) | 2024.10.31 |