"프로그램을 실행"한다는 것의 의미는 무엇일까?
프로그램의 컴파일
프로세스는 프로그램으로부터 인스턴스화 된 것을 의미한다.
프로그램은 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행할 수 있는 파일이 되는 것을 의미한다.
(쉽게 생각해서 프로그램은 실행 파일을 의미하고, 그 실행 파일을 실행하면 프로세스가 시작된다고 생각하면 된다)
프로그램의 컴파일 과정은 아래의 그림과 같다
- 전처리: 소스 코드의 주석을 제거하고 헤더 파일을 병합
- 컴파일러: 오류 처리, 코드 최적화 작업을 하며 소스 코드를 어셈블리어로 변환
- 어셈블러: 어셈블리어를 목적 코드로 변환시킨다. 확장자는 운영체제마다 다른데 리눅스에서는 .o이다.
- 링커: 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만든다.
(컴파일러의 역할과 컴파일 과정은 아래 내용 참고)
2023.07.15 - [개발/개념] - [CS: 컴파일러]
프로세스
프로세스는 컴퓨터에서 실행되고 있는 프로그램을 의미하며 CPU 스케줄링의 대상이 되는 작업(task)라는 용어와 거의 같은 의미로 쓰인다.
우리가 프로그램을 실행하여 프로그램이 메모리에 올라가면 프로세스가 되는 인스턴스화가 일어나고 이후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행한다.
이러한 프로세스는 여러가지 상태를 갖는다.
- 생성 상태: 프로세스가 생성된 상태를 의미
- 대기 상태: 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하는 상태
- 대기 중단 상태: 메모리 부족으로 일시 중단된 상태
- 실행 상태: CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태
- 중단 상태: 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- 일시 중단 상태: 대기 중단과 유사. 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
- 종료 상태: 메모리와 CPU 소유권을 모두 놓고 가는 상태
프로세스 메모리 구조
운영체제가 프로세스에 적절한 메모리를 할당한다. 이때 바탕이 되는 구조는 아래 그림과 같다.
- 스택
- 지역변수, 매개변수, 함수가 저장
- 컴파일 시에 크기가 결정
- 동적인 특징을 갖는다
- 힙
- 동적 할당할 때 사용됨
- 런타임 시 크기가 결정
- 동적인 특징을 갖는다
- 데이터 영역
- 전역변수, 정적변수가 저장
- 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어있음
- BSS 영역: 초기화 되지 않은 변수가 0으로 초기화되어 저장
- Data 영역: 0이 아닌 값으로 할당된 변수들이 저장
- 코드 영역
- 프로그램에 내장되어 있는 소스 코드가 들어가는 영역
- 수정 불가능한 기계어로 저장되어 있으며 정적인 특징을 갖는다
스레드
스레드는 프로세스의 실행 가능한 가장 작은 단위이다. 프로세스는 여러 스레드를 가질 수 있다.
프로세스는 코드, 데이터, 스택, 힙을 각각 생성하지만 스레드는 코드, 데이터, 힙을 공유하고 나머지 영역은 각각 생성되는 특징이 있다.
멀티스레딩은 프로세스 내 작업을 여러 개의 스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높다
웹 요청을 처리할 때 새 프로세스를 생성하는 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비하며, 한 스레드가 중단 되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않는 빠른 처리가 가능하다.
하지만, 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점도 존재한다.
'개발 > 개념' 카테고리의 다른 글
[객체지향] SOLID 예제(3) - 개방-폐쇄의 원칙(OCP) (0) | 2023.09.26 |
---|---|
[객체지향] SOLID 예제(2) - 의존성 역전의 원칙(DIP) (0) | 2023.09.25 |
[객체지향] SOLID 예제(1) - 단일 책임의 원칙(SRP) (0) | 2023.09.25 |
[CS: 운영체제] 컴파일러 (0) | 2023.07.15 |
React에 TypeScript 사용하는 방법 (0) | 2022.08.31 |