2023. 4. 2. 17:15ㆍ기술 면접 준비
프로세스란?
프로세스 종류
1. 포그라운드 프로세스(foreground process)
사용자가 볼 수 있는 공간에서 실행되는 프로세스로 사용자가 보는 앞에서 실행됩니다.
예: 게임, 메모장, 웹 브라우저 등이 있습니다.
2. 백그라운드 프로세스(background process)
사용자가 볼 수 없는 공간에서 실행되는 프로세스입니다.
- 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
- 사용자와 상호작용하지 않고 정해진 일만 수행하는 프로세스 = 데몬(daemon), 서비스(service)
모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU자원은 한정되어 있습니다.
따라서 프로세스들은 돌아가면서 자신에게 정해진 시간만큼 CPU를 이용하고 타이머 인터럽트가 발생하면 다른 프로세스에게 CPU차례를 양보하면서 진행됩니다.
프로세스 제어 블록(PCB)
운영체제는 프로세스들을 빠르게 그리고 번갈아가면서 관리를 하면서도 오류가 나지 않게 해줘야 하는데요, 이를 위해 이용하는 자료구조가 바로 프로세스 제어 블록(이하 PCB)입니다. 자료구조는 쉽게 자료를 저장하는 하나의 형태라고 알고 계시면 됩니다.
PCB는 프로세스 관련 정보를 저장하는 자료구조입니다. 마치 상품에 달린 택이라고 생각하시면 편합니다.
프로세스 생성 시 커널 영역에 PCB가 생성되고 프로세스 종료 시 폐기됩니다.
그럼 어떤 정보가 담길까요? 운영체제마다 차이가 있지만 PCB에 담기는 대표적인 정보는 다음과 같습니다.
- 프로세스 ID (=PID)
- 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값
- ⭐ 왜 레지스터 값이 PCB에 담길까요?
- 특정 프로세스가 실행되다가 타이머 인터럽트로 중단된 후 다시 실행이 될 때 이전에 어떤 연산 어디까 했는지 알고 있어야 합니다. 즉, 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원해서 실행을 재개하므로 레지스터 값이 필요합니다.
- ⭐ 왜 레지스터 값이 PCB에 담길까요?
- 프로세스 상태
- 예) 입출력 장치를 사용하기 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태...
- CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을 지에 대한 정보
- 메모리 정보
- 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
- 페이지 테이블 정보가 담긴다. (메모리의 현재 주소를 알 수 있는 정보)
- 사용한 파일과 입출력장치 정보
- 할당된 입출력장치, 사용 중인 파일 정보
이번에는 이번 포스팅에서 제일 중요한 개념을 학습하겠습니다.
⭐Context switch (문맥 교환)
A프로세스에서 B프로세스로 실행 순서가 넘어갈 때 어떤 작업 순서를 거치나요?
1. 기존에 실행되던 A프로세스는 지금까지의 중간 정보를 백업합니다.
여기서 중간 정보란 어떤 걸까요?
- 프로그램 카운터 등 각종 레지스터 값, 메모리 정보 등을 중간 정보라고 하며 이를 문맥(context)이라고 합니다.
- 문맥은 다음 차례가 왔을 때 실행을 재개하기 위한 정보이기도 합니다.
- 실행 문맥을 백업해 두면 언제든 해당 프로세스의 실행을 재개할 수 있습니다.
2. 뒤이어 실행할 B프로세스의 문맥을 복구하면서 자연스럽게 실행 중인 프로세스가 바뀝니다.
정리하면, 기존의 실행중인 프로세스 문맥을 백업하고 새로운 프로세스 실행을 위한 문맥을 복구하는 과정을 문맥 교환이라 합니다. 이는 여러 프로세스가 끊임없이 빠르게 번갈아 가면서 실행될 수 있는 원리입니다.
여기까지 해서 PCB는 커널 영역에 적재된 태그와 같은 자료구조라는 것을 살펴보았습니다.
그럼 프로세스가 사용자 영역에는 어떤 식으로 저장이 될까요?
프로세스의 메모리 영역
프로세스는 특정 영역을 나누어서 저장이 됩니다. 크게 코드(=텍스트) 영역, 데이터 영역, 힙 영역, 스택 영역입니다.
하나씩 살펴보겠습니다.
코드 영역(= 텍스트 영역)
기계어로 이루어진 명령어가 저장되는 영역입니다. 데이터가 아닌 CPU가 실행할 명령어가 담기는 공간으로 쓰기가 금지된 read-only 영역입니다.
데이터 영역
잠깐 사용했다가 없애는 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 영역입니다.
예를 들면 전역변수가 있습니다.
➡코드 영역과 데이터 영역은 크기가 고정되어 있습니다. 그래서 둘을 묶어서 정적 할당 영역이라 합니다.
힙 영역
프로그램을 만드는 사용자(프로그래머)가 직접 할당할 수 있는 저장공간입니다. 만약 사용자가 힙영역에 메모리 공간을 할당을 했다면 언젠가 메모리를 반환해야 합니다. 이를 도와주는 것이 가비지 컬렉션입니다.
일부 프로그래밍 언어의 경우엔 사용자가 직접 해주어야 합니다.
만약 반환을 하지 않고 힙 영역에 계속해서 메모리 공간을 차지하게 된다면 이는 메모리 낭비를 초래하게 되는데요.
이를 메모리 누수(Memory Leak)라 합니다.
스택 영역
데이터가 일시적으로 저장되는 공간입니다. 즉 잠깐 사용하는 값들이 저장되는 공간입니다.
예를 들면 매개 변수, 지역 변수가 있습니다.
➡ 힙 영역과 스택 영역은 프로그램 실행되는 과정에서 동적으로 크기가 변할 수 있습니다. 그래서 둘을 묶어 동적 할당 영역이라 합니다.
여기서 하나 짚고 넘어가야 할 것이 있습니다.
- 일반적으로 힙 영역은 낮은 주소 ➡ 높은 주소로 할당
- 일반적으로 스택 영역은 높은 주소 ➡ 낮은 주소로 할당
프로세스 상태와 계층 구조
프로세스 상태를 PCB에 기록해서 관리하고 (운영체제마다 다르지만) 대부분 프로세스들을 계층적으로 관리합니다.
프로세스 상태
- 생성 상태
- 프로세스가 생성되어 이제 막 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태
- 준비가 완료되었다면 준비상태입니다.
- 당장이라도 CPU를 할당받아서 실행할 수 있지만 자신의 차례가 아니기에 기다리는 상태
- 자신의 차례가 된다면 실행상태로 갑니다. (=디스패치)
- 실행 상태
- CPU를 할당 받아 실행 중인 상태
- 할당된 시간 모두 사용하여 타이머 인터럽트 발생 시 준비상태로 갑니다.
- 만약 실행 도중 입출력 장치를 사용한다면, 입출력 완료 인터럽트를 받을 때까지 대기 상태로 가게 됩니다.
- 대기 상태
- 프로세스가 실행 도중 입출력장치를 사용하는 경우
- 입출력 작업은 CPU에 비해 느리기 때문에 이 경우 대기 상태로 접어드는 것입니다.
- 그럼 대기 상태는 언제 끝나냐?
- 입출력 작업이 끝나 입출력 완료 인터럽트를 받으면 준비 상태로 가게 됩니다.
- 종료 상태
- 프로세스가 종료된 상태로 PCB와 프로세스가 차지했던 메모리 영역을 정리합니다.
"프로세스 상태 다이어그램"은 다음과 같습니다.
프로세스 계층 구조
일반적으로 프로세스는 계층적으로 관리됩니다.
윈도우의 경우는 아니지만
개발자는 주로 리눅스, 유닉스, macOS를 접하게 되므로 프로세스 계층 구조란 무엇인지 알아야 합니다.
프로세스 실행 도중 (시스템 호출을 통해) 또 다른 프로세스 생성 가능합니다.
- 새 프로세스를 생성한 프로세스 : 부모 프로세스
- 부모 프로세스에 의해 생성된 프로세스: 자식 프로세스
부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 다른 PID를 가집니다. 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 합니다.
그럼 왜 프로세스는 계층적 구조라고 하는 것일까요?
위에서 살펴본 부모 프로세스, 자식 프로세스에서 끝나는 것이 아니라,
자식 프로세스(A)는 또 다른 자식 프로세스(B)를 만들 수 있고
그 자식 프로세스(B)는 또 다른 자식 프로세스(C)를 만들 수 있고
그 자식 프로세스(C)는 또 다른 자식 프로세스(D)를 만들 수 있고
... 만들 수 있기에 프로세스의 계층적인 구조가 형성됩니다.
[참고] 명령어 pstree를 입력하면 최초의 프로세스 확인 가능합니다.
프로세스 생성 기법
그럼 부모 프로세스는 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까요?
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성합니다.
- fork 시스템 호출은 자신의 프로세스 복사본을 자식 프로세스로 생성하는 시스템 호출입니다. 그러므로 부모 프로세스의 자원을 자식 프로세스가 상속합니다. (복제본)
- 둘은 다른 프로세스이므로 PID나 저장된 위치는 다릅니다.
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체합니다.
- exec 시스템 호출은 나의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출입니다.
- 그렇게 되면 코드, 데이터 영역은 새롭게 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화됩니다.
이런 프로세스 생성 기법을 Fork-exec 기법이라고 합니다.
스레드란?
스레드(Thread)는 프로세스를 구성하는 실행 흐름의 단위입니다.
실행 흐름의 단위....?? 아래 그림을 보면 쉽게 이해할 수 있습니다.
하나의 프로세스는 하나 이상의 스레드를 가질 수 있고 동시에 실행할 수 있습니다.
단일 스레드 프로세스
실행 흐름이 하나인 프로세스를 말합니다.
멀티 스레드 프로세스
실행 흐름이 여러 개인 프로세스로 프로세스를 이루는 여러 명령어를 동시에 실행 가능 합니다.
스레드는 어떻게 구성되어 있을까요?
스레드는 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등 실행에 필요한 최소한의 정보를 담고 있습니다.
여기서 중요한 개념은,
⭐ 모든 스레드들은 프로세스 자원을 공유합니다.
[한 줄 정리] 스레드란?
스레드(Thread)는 프로세스를 구성하는 실행 흐름의 단위로 스레드ID, 프로그램 카운터를 비롯한 레지스터 값,
스택 등 실행에 필요한 최소한의 정보를 담고 있습니다.
그리고 모든 스레드는 프로세스 자원을 공유합니다.
⭐멀티 프로세스 VS 멀티 스레드
동일한 작업을 수행하는 단일 스레드 프로세스 여러 개를 실행하는 것 = 멀티 프로세스
VS
한 프로세스를 여러 스레드로 실행하는 것 = 멀티 스레드
프로세스끼리는 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내 자원을 공유하며 실행한다는 큰 차이점이 존재합니다.
따라서 멀티 프로세스는 독립적으로 실행되고 멀티 스레드는 협력과 통신에 유리합니다.
하지만 멀티스레드에서 한 스레드에 문제가 발생한다면 자원을 공유하는 다른 스레드에게도 영향이 갈 수 있다는 단점이 존재합니다.
멀티 프로세스
프로세스(A)를 fork 하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 새 프로세스(B)가 저장됩니다.
저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재되는데요.
여러 번 fork하면 그 개수만큼 메모리에 프로세스가 적재됩니다.
각기 다른 프로세스므로 PCB값이 다릅니다.
멀티 스레드
스레드들은 각기 다른 스레드 ID, 실행을 위해 꼭 필요한 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가집니다.
한 프로세스가 가지는 자원을 공유합니다.
한 프로세스 내에서 이루어지므로 PCB가 하나입니다.
[참고] IPC
기본적으로 프로세스끼리는 자원을 공유하지 않습니다.
하지만 프로세스 간에도 자원을 주고받을 수 있는데, 이를 프로세스 간 통신 (IPC, inter process communication)
라고 합니다.
관련 포스팅:
1. [운영체제] 운영체제는 프로그램이다?! - 1/5
4. [운영체제] 프로세스와 스레드의 동기화 - 4/5
5. [운영체제] 교착 상태(데드락, Deadlock) - 5/5
출처:
'기술 면접 준비' 카테고리의 다른 글
[운영체제] 프로세스와 스레드의 동기화 - 4/5 (0) | 2023.04.03 |
---|---|
[운영체제] CPU 스케줄링 알고리즘 - 3/5 (0) | 2023.04.02 |
[운영체제] 운영체제는 프로그램이다?! - 1/5 (0) | 2023.03.31 |
[기술면접] 네트워크 - 2/2 (0) | 2023.03.23 |
[기술면접] 네트워크 - 1/2 (0) | 2023.03.23 |