프로세스
책 『면접을 위한 CS 전공지식 노트』를 바탕으로 스터디를 진행하면서 공부한 내용을 정리했다.
~ 목차 ~
1. 프로세스란
2. 프로세스와 컴파일 과정
2.1 인터프리터와 컴파일러
2.2 컴파일러를 사용하는 이유
2.3 컴파일러의 컴파일 과정
3. 프로세스의 상태
4. 프로세스의 메모리 구조
4.1 동적 영역
4.2 정적 영역
5. PCB
1. 프로세스란
- 프로세스(process)란 프로그램을 실행하기 위해서 메모리에 올린 상태이다.
(+ 프로그램은 정적인 상태이고 프로세스는 동적인 상태이다.)

2. 프로세스와 컴파일 과정
2.1 인터프리터와 컴파일러
- 프로그램을 실행하려면 고급언어로 작성한 소스코드를 기계어로 번역해야 하는데,
이때 사용되는 방법으로는 대표적으로 인터프리터(interpretor)와 컴파일러(compiler)가 있다.
- 인터프리터는 소스코드를 한 행씩 번역해서 실행한다. (e.g. JS, Python)
- 컴파일러는 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행한다. (e.g. C, Java)

2.2 컴파일러를 사용하는 이유
- 여기서는 컴파일러를 중심으로 설명한다. 그럼 왜 컴파일러가 필요할까?
(이유1) 오류 수정
- 선언하지 않은 변수를 사용했는지, 변수에 다른 종류의 데이터를 저장하지는 않았는지 등을 확인할 수 있다.
(e.g. 위 그림에서는 준비재료에 양배추가 없으므로 오류가 남)
(이유2) 최적화
- 불필요한 연산을 줄이고, 코드의 흐름 개선할 수 있다.
(e.g. '당근 1개를 잘라서 볶는다'가 2번 나오므로 '당근 2개를 잘라서 볶는다'로 수정,
준비재료에는 있지만 요리에는 없는 '고추'를 삭제)
- 컴파일러를 사용하는 이유에 대해서 알아봤으니 컴파일러를 사용한 컴파일 과정에 대해서 정리해보려고 한다.
2.3 컴파일러의 컴파일 과정

- 전처리: 소스코드에서 주석 제거하고
헤더 파일을 병합해서 매크로를 치환한다.
- 컴파일러: 오류 수정하고 최적화시켜서
목적코드를 생성한다.
- 링커: 목적 코드에 라이브러리의 코드들을
삽입해서 실행파일을 만든다.
- 동적 라이브러리를 사용해서 실행한다.
- 동적: 필요할 때만 DLL을 참조함
- 정적: 실행파일에 모든 코드를 넣음
3. 프로세스의 상태
- 생성
- 프로세스가 생성된 상태. fork() 또는 exec()함수를 통해 생성함. (+ 이때 PCB가 할당됨)
- fork(): 부모 프로세스의 주소 공간을 그대로 복사해서 새로운 자식 프로세스 생성
- exec(): 새롭게 프로세스 생성
- 대기 - 대기 중단
- 메모리 공간이 충분하면 메모리를 할당받고, - 메모리 부족으로 일시 중단된 상태

아니면 아닌 상태로 대기하면서
CPU 스케줄러로부터 CPU 소유권이 넘어오기를
기다리는 상태
- 실행
- CPU 소유권과 메모리를 할당받고 작업을 수행중인 상태
- CPU burst라고도 함
- 중단 - 일시 중단
- 어떤 이벤트 때문에 기다리는 동안 프로세스가 차단된 상태 - 중단된 상태에서 프로세스가 실행되려고 했지만
(e.g. 프린트 인쇄 버튼 누르면 잠깐 멈춘 것처럼 보임) 메모리 부족으로 일시 중단된 상태
- 대기 중단과 비슷하다.
- 종료
- 메모리와 CPU 소유권을 모두 놓고 간 상태
- 자연스럽게도 이루어지지만 강제적으로도 발생한다.
(e.g. 자원의 한계치 초과, 부모 프로세스의 종료, process.kill 명령어 사용 등)
4. 프로세스의 메모리 구조
- 프로세스는 아래 그림과 같은 메모리 구조를 이루고, 지금 어떤 자원을 사용하고 있는지에 대한 정보가 들어있다.

4.1 동적 영역
- 스택
- 스택(stack)은 데이터를 일시적으로 저장하는 영역이다.
(e.g. 함수가 호출될 때마다 그 함수의 매개변수와 지역변수가 스택에 저장됨)
- 힙
- 힙(heap)은 크기가 정해지지 않은 데이터를 저장한다.
(e.g. 연결리스트의 새로운 노드를 만들 때마다 힙에 메모리를 할당해서 새로운 공간을 생성함)
4.2 정적 영역
- 데이터 영역
- 데이터 영역(data area)에는 프로그램이 실행될 때 항상 필요한 정보가 들어있다.
- 읽기와 쓰기가 가능하다.
- 코드 영역
- 코드 영역(code area)에는 프로그램이 실행될 때 따라야 할 명령어가 들어있다.
- 읽기전용이다. (∵자기 자신을 수정하는 프로그램은 존재하지 않기 때문)
5. PCB
- PCB는 Process Control Block의 약자로, 프로세스를 처리하는 데 필요한 작업지시서라고 볼 수 있다.
프로세스 제어 블록이라고도 한다.
- PCB에는 다양한 정보(프로세스 스케줄링 상태, 프로세스 ID, 프로세스 권한, 프로그램 카운터, CPU 레지스터,
CPU 스케줄링 정보, 계정 정보, I/O 상태 정보)들이 담기게 된다.
- PCB를 어디에 사용하느냐 하면.. 아래 그림과 같은 문맥교환(context switching) 작업에 사용한다.

- 문맥교환 작업에서에서 PCB는 각 프로세스의 상태 정보를 저장하고 복원하는 역할을 한다.
- 문맥교환이란, CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다.
- 실행상태에서 나가는 PCB에는 지금까지의 작업 내용을 저장하고,
실행상태로 들어오는 PCB의 내용을 CPU에 세팅한다.
참고문헌
[1] 주홍철, 면접을 위한 CS 전공지식 노트, 서울: 길벗, 2022.
[2] 구현회, 그림으로 배우는 구조와 원리, 개정 3판, 서울: 한빛아카데미, 2018.
[3] 조성호, 쉽게 배우는 운영체제, 2판, 서울: 한빛아카데미, 2023.
'기본기 다지기 > CS' 카테고리의 다른 글
[자료구조] 비선형 자료구조(힙, 우선순위 큐, 맵, 셋, 해시테이블) (0) | 2024.12.17 |
---|---|
[데이터베이스] 인덱스 (1) | 2024.11.26 |
[운영체제] CPU 스케줄링 알고리즘 (1) | 2024.11.16 |
[네트워크] IP주소 (1) | 2024.11.11 |