1일 1커밋🌱
컴파일과 프로세스
1. 컴파일과 프로세스
우리가 프로그래밍 언어로 만든 코드는 어떻게 프로세스가 되고 메모리에 할당되는가?
프로그래밍 언어는 컴파일 언어와 인터프리터 언어 두 개로 구분할 수 있다.
- 컴파일 언어는 개발자가 코드를 작성하고 컴파일이라는 과정을 거쳐서 0과 1로 된 기계어로 된 실행 파일을 만든다. 컴파일 과정에서 개발자가 문법 오류를 일으켰는지 검사하고 CPU에서 처리 가능한 기계어로 실행 파일을 만들어 놓기 때문에 속도가 빠르다. C, C++, C# 등이 이에 속한다.
- 인터프리터 언어는 개발자가 작성한 코드를 미리 기계어로 만들지 않고 실행 시 코드를 한 줄씩 해석해 실행하는 언어이다. 미리 검사를 하지 않기 때문에 실행할 때 오류가 날 수도 있고 속도도 컴파일 언어와 비교하면 느리다. 자바스크립트, 파이썬, 루비 등이 이에 속한다.
이제 프로세스의 메모리 구조를 살펴보자. 프로세스는 코드 영역과 데이터 영역, 그리고 스택과 힙 영역으로 나뉜다. 코드 영역은 말 그대로 실행해야 할 코드가 들어가는 영역이고 데이터 영역은 전역 변수나 배열이 들어가는 영역이다. 스택과 힙은 프로세스가 실행될 때 할당되는 메모리로 스택에는 지역 변수와 함수 관련된 값들이 들어가고, 힙은 실행 중에 메모리 공간을 할당할 수 있는 유동적인 공간이다.
그렇다면 컴파일 언어로 작성한 파일이 어떻게 프로세스가 되는지 알아보자.
개발자가 작성한 코드는 컴파일러를 거쳐서 실행 파일이 되는데 컴파일 과정은 다음과 같다.
- 개발자가 코드를 작성하고 test.c라는 파일로 저장했다.
- 컴파일러를 실행시키면 가장 먼저 전처리 단계를 밟는다. 전처리기는 test.c라는 파일을 보고 전처리 구문을 처리해주는데, 전처리 구문은 #으로 시작한다. 예를 들어 #include는 헤더 파일의 내용이 들어오게 되고 #define의 경우 매크로 넘버가 치환된다. 또한 코드에 있는 주석은 모두 제거된다.
- 전처리기를 거친 파일은 컴파일러가 처리한다. 컴파일러는 c언어로 작성된 이 파일을 기계어에 가까운 어셈블리어로 변환시킨다.
- 어셈블리어로 바뀐 파일은 어셈블리어를 통해 오브젝트 파일로 변하게 된다. 오브젝트 파일은 0과 1로 된 기계어로 구성되어 있다. 이 오브젝트 파일은 코드 영역과 데이터 영역으로 나뉘어져 있다.
- 오브젝트 파일이 실행 파일이 되기 위해서는 링커를 거쳐줘야 한다. 오브젝트 파일은 여러 개가 될 수 있고 링커는 이 모든 오브젝트 파일을 하나의 코드 영역과 데이터 영역으로 묶는다. 그리고 실제로 실행될 주소를 매핑시켜준다. 링커를 거치면 우리가 흔히 보는 exe 파일이 생성되고 이제 이 exe 파일은 완벽한 상태의 코드 영역과 데이터 영역으로 구성되어 있다.
- 사용자가 이 프로그램을 실행시키면 운영체제가 프로세스를 만든다.
- 운영체제는 exe 파일에 있는 코드 영역과 데이터 영역을 가져와 프로세스의 코드 영역과 데이터 영역에 넣어주고 빈 상태의 스택과 힙을 할당한다. 그리고 PCB를 만들어 관리가 가능하도록 만들고 프로그램 카운터에 다음 실행할 명령어의 주소를, 즉 생성한 프로세스의 코드영역의 첫번째 주소로 설정한다.
- 운영체제의 CPU 스케줄링에 따라서 프로세스가 실행되다가 작업을 마친다.
2. 중간 정리
지금까지 하드웨어와 운영체제 구조, 프로세스가 무엇인지 알아보았다.
-
오늘날 컴퓨터는 폰 노이만 구조를 하고 있고 폰 노이만 구조의 필수 장치는 CPU와 메모리이다. 그리고 컴퓨터의 성능이나 사용자의 편의성을 위한 보조장치가 있다.
-
컴퓨터가 부팅되면 보조 장치인 하드디스크에 저장되어 있는 운영체제가 메모리에 올라오게 되고 모든 프로그램은 운영체제에 의해 관리된다.
-
프로그램도 하드디스크에 저장되어 있는데 사용자가 이 프로그램을 실행하면 메모리에 올라간다.
-
메모리에 올라간 프로그램을 프로세스라고 부르고 프로세스는 자신을 실행시켜 줄 CPU를 기다리고 있다.
-
하지만 CPU를 원하는 프로세스들이 많기 때문에 운영체제가 중간에서 공평하게 CPU를 할당해준다.
-
운영체제가 중간에서 CPU를 할당해주는 것을 CPU 스케줄링이라 부르고 이를 위한 여러 가지 알고리즘이 있다.
-
CPU 스케줄링은 공평함과 성능 문제 때문에 프로세스들에게 일정 시간, 즉 타임 슬라이스만큼 CPU를 할당하기로 했고 이 공유된 자원에서 문제가 발생한다는 것을 알았다.
-
이를 동기화 문제라고 부르고 이를 해결하기 위한 방법인 세마포어와 모니터를 알아보았다.
-
동기화 문제를 해결하기 위해 공유된 자원을 한 프로세스가 점유하게 만들었는데 교착상태라는 것이 발생했다.
-
그래서 교착상태가 발생하는 원인과 해결 방법을 알아보았다.
다음 장에서부터는 운영체제가 메모리를 어떻게 관리하는지 알아보자.
참고
댓글남기기