티스토리 뷰

CS/운영체제

#25 컴파일과 프로세스

RadderNepa 2023. 5. 22. 02:11

https://radderveloper.tistory.com/108

 

#5 프로그램과 프로세스

● 도입 프로그램이란? - 하드디스크와 같은 저장 장치(HDD, SSD)에 저장된 명령문의 집합체 - application, app 이라고도 불리고 Window OS에서는 .exe 파일의 모습을 하고있다. 프로세스란? - 간단히 말해

radderveloper.tistory.com

- 위의 글을 먼저 읽어보자


● 프로그래밍 언어의 종류와 프로세스 메모리 구조

1) 프로그래밍 언어의 종류

- 프로그래밍 언어는 컴파일 언어와 인터프리터 언어로 구분할 수 있다.

 

1. 컴파일 언어

- 개발자가 코드를 작성하고 컴파일 과정을 거쳐 0과 1로된 기계어로 실행파일을 만든다.

- 컴파일 과정에서 문법 오류가 있는지 검사하고 CPU에서 처리가능한 기계어로 실행 파일을 만들어 놓기 때문에 속도가 빠르다.

- C, C++. C# 등이 컴파일 언어에 속한다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 

2. 인터프리터 언어

- 개발자가 작성한 코드를 미리 기계어로 만들지 않고 실행 시 코드를 한 줄씩 해석해 실해하는 언어이다.

- 미리 검사를 하지 않기 때문에 실행 시 오류가 발생할 수도 있고 컴파일 언어에 비하면 속도도 느리다.

- JavaScript, Python, Ruby 등이 인터프리터 언어에 속한다.

 

2) 프로세스 메모리 구조

- 프로세스의 메모리 구조를 알아보자

- 프로세스는 CODE, DATA, HEAP, STACK 영역으로 나뉜다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

1. CODE : 실행해야 할 코드가 들어가는 영역
2. DATA : 전역변수나 배열이 들어가는 영역

- HEAP과 STACK은 프로세스가 실행될 때 할당되는 메모리이다.

3. HEAP : 실행중에 메모리 공간을 할당할 수 있는 동적인 공간
4. STACK : 지역변수, 함수 관련 값들이 들어가는 영역

● 컴파일과 프로세스

- 컴파일 언어로 작성된 파일이 어떻게 프로세스가 되는지 알아보자

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

- 50과 100을 더해 출력해주는 프로그램을 C언어로 작성했다.

- 10번 라인에 있는 printf 함수를 이용하기 위해 2번 라인에 #include 문을 추가했다.

- 4번 라인에서는 숫자 100을 MY_NUMBER로 치환시켰다.(이를 매크로라고 부른다.)

- 6번 라인에서 프로그램 실행 시 자동으로 실행되는 main 함수를 선언했다.

https://ko.wikipedia.org/wiki/%EB%A7%A4%ED%81%AC%EB%A1%9C_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)


- 프로그램을 다 만들었으니 컴파일을 해서 실행파일(exe)로 만들어보자

- 개발자가 작성한 코드는 컴파일러를 거쳐서 실행파일이 되는데 컴파일 과정은 아래와 같다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

1.

개발자가 코드를 작성한 후 test.c 라는 파일로 저장했다. 이제 컴파일러를 실행시키면 가장 먼저 전처리 단계를 밟는다.

 

2.

전처리기는 test.c 파일을 훑어보고 전처리 구문을 처리해준다.

2-1. 여기서 전처리 구문은 # 으로 시작하는 부분인데 위의 코드에서는 #include와 #define이 해당된다.

2-2. 전처리기를 거치면 2번 라인의 #include를 통해 stdio.h의 내용이 들어오게되고 4번 라인에서 선언한 매크로 MY_NUMBER 값은 전부 100으로 치환된다.

2-3. 또한 코드에 있는 모든 주석 부분은 제거된다. 전처리기 작업 결과는 아래와 같다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제 / #include로 가져온 내용이 많아 중간에 생략 됐다.

- 10번 라인에 printf 함수의 원형을 가져온 부분이 있다.

- 17번 라인에서 MY_NUMBER가 100으로 치환됐으며 뒤에 있던 주석도 사라졌다.

- 이제 해당 파일은 test.i 가 됐다.

 

3.

- 전처리기를 거친 파일은 컴파일러가 처리한다.

- 컴파일러는 C언어로 작성된 해당 파일을 기계어에 가까운 어셈블리어로 변환시킨다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 

4.

- 어셈블리어로 바뀌었다면 어셈블러를 통해 오브젝트 파일로 변하게 된다.(test.o)

- 오브젝트 파일은 0과 1로된 기계어로 구성돼있기 때문에 text editor에서 열면 아래와 같이 글씨가 깨져보인다.

(실행되는데에는 문제가 없다.)

- 오브젝트 파일은 코드 영역과 데이터 영역이 나뉘어져있다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 

5.

- 오브젝트 파일이 실행 파일이 되기 위해서는 링커를 거쳐줘야한다.

- 링커는 모든 오브젝트 파일을 하나의 코드영역과 데이터 영역으로 묶는 역할을 한다.(webpack이랑 비슷한 듯?)

- 그리고 실제로 실행될 주소를 매핑해준다.

 

6.

- 링커까지 거쳤다면 exe 실행 파일이 만들어진다.

- 해당 exe 파일은 완벽한 상태의 코드영역과 데이터영역으로 구성되어있다.

 

7.

- 사용자가 exe 파일을 실행시키면 OS(운영체제)가 프로세스를 만든다.

- OS는 exe 파일에 있는 코드영역과 데이터영역을 가져와 프로세스의 코드영역과 데이터영역에 넣어주고 비어있는 상태의 HEAP과 STACK을 할당한다.

- 그리고 PCB를 만들어 관리가 가능하도록 만들고 프로그램 카운터(PC) 즉, 다음 실행할 명령어의 주소를 생성한 프로세스의 코드영역의 첫번째 주소로 설정한다.

- 이후 OS의 CPU 스케줄링에 따라 프로세스가 실행되다가 작업을 마친다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 

cf) 전처리기에 대한 좋은 글

https://blog.naver.com/ndb796/221046613546

 

C언어 전처리기(Preprocessor) 개념 정리 및 실습하기

 전처리기(Preprocessor): 컴퓨터의 처리에 있어서 중심적인 처리를 수행하는 부분을 위해 사전 준비...

blog.naver.com

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함