1일 1커밋🌱

2 분 소요

1. 컴파일과 프로세스

우리가 프로그래밍 언어로 만든 코드는 어떻게 프로세스가 되고 메모리에 할당되는가?

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

  • 컴파일 언어는 개발자가 코드를 작성하고 컴파일이라는 과정을 거쳐서 0과 1로 된 기계어로 된 실행 파일을 만든다. 컴파일 과정에서 개발자가 문법 오류를 일으켰는지 검사하고 CPU에서 처리 가능한 기계어로 실행 파일을 만들어 놓기 때문에 속도가 빠르다. C, C++, C# 등이 이에 속한다.
  • 인터프리터 언어는 개발자가 작성한 코드를 미리 기계어로 만들지 않고 실행 시 코드를 한 줄씩 해석해 실행하는 언어이다. 미리 검사를 하지 않기 때문에 실행할 때 오류가 날 수도 있고 속도도 컴파일 언어와 비교하면 느리다. 자바스크립트, 파이썬, 루비 등이 이에 속한다.

이제 프로세스의 메모리 구조를 살펴보자. 프로세스는 코드 영역과 데이터 영역, 그리고 스택과 힙 영역으로 나뉜다. 코드 영역은 말 그대로 실행해야 할 코드가 들어가는 영역이고 데이터 영역은 전역 변수나 배열이 들어가는 영역이다. 스택과 힙은 프로세스가 실행될 때 할당되는 메모리로 스택에는 지역 변수와 함수 관련된 값들이 들어가고, 힙은 실행 중에 메모리 공간을 할당할 수 있는 유동적인 공간이다.

그렇다면 컴파일 언어로 작성한 파일이 어떻게 프로세스가 되는지 알아보자.

compile-and-process-1

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

  1. 개발자가 코드를 작성하고 test.c라는 파일로 저장했다.
  2. 컴파일러를 실행시키면 가장 먼저 전처리 단계를 밟는다. 전처리기는 test.c라는 파일을 보고 전처리 구문을 처리해주는데, 전처리 구문은 #으로 시작한다. 예를 들어 #include는 헤더 파일의 내용이 들어오게 되고 #define의 경우 매크로 넘버가 치환된다. 또한 코드에 있는 주석은 모두 제거된다.
  3. 전처리기를 거친 파일은 컴파일러가 처리한다. 컴파일러는 c언어로 작성된 이 파일을 기계어에 가까운 어셈블리어로 변환시킨다.
  4. 어셈블리어로 바뀐 파일은 어셈블리어를 통해 오브젝트 파일로 변하게 된다. 오브젝트 파일은 0과 1로 된 기계어로 구성되어 있다. 이 오브젝트 파일은 코드 영역과 데이터 영역으로 나뉘어져 있다.
  5. 오브젝트 파일이 실행 파일이 되기 위해서는 링커를 거쳐줘야 한다. 오브젝트 파일은 여러 개가 될 수 있고 링커는 이 모든 오브젝트 파일을 하나의 코드 영역과 데이터 영역으로 묶는다. 그리고 실제로 실행될 주소를 매핑시켜준다. 링커를 거치면 우리가 흔히 보는 exe 파일이 생성되고 이제 이 exe 파일은 완벽한 상태의 코드 영역과 데이터 영역으로 구성되어 있다.
  6. 사용자가 이 프로그램을 실행시키면 운영체제가 프로세스를 만든다.
  7. 운영체제는 exe 파일에 있는 코드 영역과 데이터 영역을 가져와 프로세스의 코드 영역과 데이터 영역에 넣어주고 빈 상태의 스택과 힙을 할당한다. 그리고 PCB를 만들어 관리가 가능하도록 만들고 프로그램 카운터에 다음 실행할 명령어의 주소를, 즉 생성한 프로세스의 코드영역의 첫번째 주소로 설정한다.
  8. 운영체제의 CPU 스케줄링에 따라서 프로세스가 실행되다가 작업을 마친다.

2. 중간 정리

지금까지 하드웨어와 운영체제 구조, 프로세스가 무엇인지 알아보았다.

  1. 오늘날 컴퓨터는 폰 노이만 구조를 하고 있고 폰 노이만 구조의 필수 장치는 CPU와 메모리이다. 그리고 컴퓨터의 성능이나 사용자의 편의성을 위한 보조장치가 있다.

  2. 컴퓨터가 부팅되면 보조 장치인 하드디스크에 저장되어 있는 운영체제가 메모리에 올라오게 되고 모든 프로그램은 운영체제에 의해 관리된다.

  3. 프로그램도 하드디스크에 저장되어 있는데 사용자가 이 프로그램을 실행하면 메모리에 올라간다.

  4. 메모리에 올라간 프로그램을 프로세스라고 부르고 프로세스는 자신을 실행시켜 줄 CPU를 기다리고 있다.

  5. 하지만 CPU를 원하는 프로세스들이 많기 때문에 운영체제가 중간에서 공평하게 CPU를 할당해준다.

  6. 운영체제가 중간에서 CPU를 할당해주는 것을 CPU 스케줄링이라 부르고 이를 위한 여러 가지 알고리즘이 있다.

  7. CPU 스케줄링은 공평함과 성능 문제 때문에 프로세스들에게 일정 시간, 즉 타임 슬라이스만큼 CPU를 할당하기로 했고 이 공유된 자원에서 문제가 발생한다는 것을 알았다.

  8. 이를 동기화 문제라고 부르고 이를 해결하기 위한 방법인 세마포어와 모니터를 알아보았다.

  9. 동기화 문제를 해결하기 위해 공유된 자원을 한 프로세스가 점유하게 만들었는데 교착상태라는 것이 발생했다.

  10. 그래서 교착상태가 발생하는 원인과 해결 방법을 알아보았다.

다음 장에서부터는 운영체제가 메모리를 어떻게 관리하는지 알아보자.

참고

카테고리:

업데이트:

댓글남기기