프로세스와 컴파일 과정
Last updated
Last updated
파일 시스템에 존재하는 실행파일
ex) Chrom.exe, Hwp.exe
프로그램의 한 개의 인스턴스가 프로세스이며 프로그램은 하나지만, 이 프로그램을 실행하는 인스턴스는 여러 개일 수 있다.
프로세스는 CPU에 올라가서 실행된다.
피자 레시피(프로그램) -> 피자(프로세스)
컴파일은 인간이 이해할 수 있는 언어로 작성된 소스 코드를 CPU가 이애할 수 있는 언어로 변환하는 작업이다.
컴파일 과정은 4가지 단계로 나누어진다.
전처리 과정은 소스 코드 파일을 전처리 된 소스 코드 파일로 변환하는 과정이다.
대표적으로 세 가지 작업을 수행한다.
주석 제거: 소스 코드에서 주석을 전부 제거한다.
헤더 파일 삽입: #include 지시문을 만나면 해당하는 헤더 파일을 찾아 헤더 파일에 있는 모든 내용을 복사해서 소스 코드에 삽입한다.
매크로 치환 및 적용: #define 지시문에 정의된 매크로를 저장하고 같은 문자열을 만나면 #define 된 내용으로 치환한다.
컴파일 과정은 컴파일러를 통해 전처리된 소스 코드 파일을 어셈블리어 파일로 변환하는 과정이다.
어셈블리어란? 기계어(명령어, 이진수로 이루어진 숫자)와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.
이 과정에서 언어의 문법 검사가 이루어진다.
어셈블리 과정을 통해 어셈블리어 파일을 오브젝트 파일로 변환한다.
오브젝트 파일이란? 어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드라 부른다. 이런 오브젝트 코드로 구성된 파일을 오브젝트 파일이라고 부른다.
링킹 과정은 오브젝트 파일들을 묶어 실행 파일로 만드는 과정이다.
이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.
라이브러리를 링크하는 방법에 따라 정적 링킹과 동적 링킹으로 나눈다.
정적 라이브러리
정적 링킹 과정에서 프로그램에 필요한 부분을 라이브러리에서 찾아 실행 파일에 복사하는 방식의 라이브러리
실행 파일이 정적 라이브러리를 복사해서 가지고 있으므로 실행할 때 라이브러리가 필요없다. 즉, 실행 파일만 있으면 프로그램이 동작하여 안정적이다.
라이브러리에서 수정할 부분이 있으면 파일 전체를 다시 컴파일하여 재배포해야 한다.
실행 파일 크기가 커진다.
코드가 중복되어 메모리 자원을 낭비한다.
사용하지 않는 함수들까지 전부 다 프로그램에 포함한다.
동적 링킹
동적 링킹 과정에서 라이브러리 내용을 복사하지 않고 해당 내용의 주소만 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에 위치할 때 해당 주소로 가서 필요한 내용을 가져오는 방식의 라이브러리
실행 파일 크기가 작아진다.
동적 라이브러리를 메모리에 올려놓고 공유하기 때문에 메모리 자원을 효율적으로 사용한다.
동적 라이브러리가 제대로 링크되어 있지 않거나 버전이 맞지 않는 등의 문제가 발생할 수 있다. 즉, 외부 의존도가 생긴다.
프로그렘과 프로세스의 차이점 컴파일(Compile)에 대한 이해 라이브러리(Libray)에 대한 이해 위키백과 - 어셈블리어
📅 2022-10-10