[Tech] 프로세스 & 스레드 심화
전에, 프로세스와 스레드를 다룬 내용의 글을 쓴 적이 있었다.
하지만, 내용이 부실함을 느꼈고, 심화적인 내용을 바탕으로 글을 정리하고자 한다.
프로세스 컴파일 과정
프로세스 컴파일은 크게 4가지 과정을 거쳐서 일어난다.
1. 전처리(Pre-Processing)
- 소스 코드 파일을 전처리 된 소스 파일로 변환하는 과정을 의미한다.
- 소스 코드에서 주석을 전부 제거하고, 헤더 파일을 병합한다.
- 이후, 매크로를 치환하고 적용한다.
2. 컴파일(Compile)
- 전처리 된 소스 파일을 어셈블리어 파일로 변환하는 과정을 의미한다.
- 이 때, 오류 처리와 코드 최적화 작업이 일어난다.
3. 어셈블리(Assembly)
- 어셈블리어로 작성된 소스 코드를 오브젝트 파일로 변환하는 과정을 의미한다.
- 여기서 오브젝트 파일은 사람이 알아볼 수 없는 기계어 코드로 변환된 파일이다.
4. 링킹(Linking)
- 여러 오브젝트 파일들을 묶어 실행 파일을 만드는 과정을 의미한다.
이렇게 4가지 과정을 거쳐, CPU가 이해할 수 있도록 번역하는 작업을 거친다.
프로세스 상태 값
프로세스는 다음과 같이 5가지의 상태 값을 가지며, 실행되면서 변한다.
new, 생성 상태
프로세스가 생성된 상태를 의미한다.running, 실행 상태
CPU 소유권과 메모리를 할당받고, 명령어를 수행 중인 상태를 의미한다.ready, 준비 상태
프로세스가 CPU 스케줄러부터 CPU 소유권이 넘어오기를 기다리는 상태를 의미한다.waiting, 대기 상태
인터럽트에 의해, 프로세스가 어떤 이벤트가 일어나기를 기다리는 상태를 의미한다.terminated, 종료 상태
프로세스가 메모리와 CPU 소유권을 모두 놓고, 실행이 종료된 상태를 의미한다.
특히, 실행 상태에서 바뀔 수 있는 상태가 3가지며, 변환하는 작업을 생각하며 보자.
프로세스의 구조
프로세스는 다음과 같이 4가지의 구조로 나뉘며, 할당된다.
- Stack
- 함수 매개변수, 반환 주소, 지역 변수가 저장된다.
- 컴파일 때, 크기가 결정되고 동적인 메모리 특징을 갖는다.
- 함수 호출의 임시 데이터 저장 장소로 동작한다.
- Heap
- 실행 중, 동적으로 할당되는 메모리이다.
- 가변 크기의 데이터를 저장할 때 활용된다.
new(),malloc(),calloc()등의 함수를 사용하여 할당 시, 해당 영역에서 메로리가 할당된다.
- Data 영역
- 전역변수, 정적변수가 저장된다.
- Code 영역
- 프로그램의 소스 코드가 저장된다.
PCB, 프로세스 제어 블록
- Process Control Block
- 운영체제에서, 프로세스에 대한 메타데이터를 저장한 데이터를 의미한다.
- 프로세스마다 존재하며, 일반 사용자가 접근하지 못하도록 관리된다.
PCB의 구조
- 프로세스 상태: 프로세스의 현재 상태를 담는다.
- 프로세스 식별자: 프로세스를 유일하게 식별할 수 있는 ID
- 프로그램 카운터(PC): 다음에 수행할 명령어 주소
- CPU 레지스터: 레지스터의 값이 담긴다.
- 오픈파일 목록
- 메모리 제한
- 이 외에도, CPU 스케줄링 정보, 메모리 관리 정보, I/O 상태 정보가 담긴다.
싱글 스레드와 멀티 스레드
위와 같이, 싱글 스레드와 멀티 스레드는 구분된다. 각각의 장단점에 대해 알아보자.
싱글 스레드
- 하나의 프로세스에 하나의 스레드가 있는 구조
- 하나의 레지스터와 스택으로 구성되어 있다.
싱글 스레드의 장점
- 작업 전환(Context Switching)과 자원 접근에 대한 것을 신경쓰지 않아도 된다.
- 비교적 적은 비용으로 구성 가능하다.
싱글 스레드의 단점
- 여러 개의 CPU를 활용하지 못한다.
- 비교적 적은 비용으로 구성 가능하다.
- 순차적으로 실행해서, 많은 작업의 처리에서는 비효율적이다.
멀티 스레드
- 하나의 프로세스에 여러 개의 스레드가 있는 구조
- 각각 고유의 레지스터와 스택으로 구성되어 있다.
- 프로세스 내에서는 자원을 공유하여, 중복을 최소화한다.
멀티 스레드의 장점
- 스레드를 생성하는 과정이 비교적 빠르다.
- 자원과 상태를 공유하여, 효율적인 운영이 가능하다.
멀티 스레드의 단점
- 비교적 많은 비용이 필요하다.
- 작업 전환과 스레드 스케줄링을 살펴야 한다.
✨ 출처
prepare_frontend_interview
Blog, 프로세스의 컴파일
Abraham Silberschatz, 운영체제