0️⃣ 프로세스란?
프로세스는 현재 실행중인 프로그램을 의미한다. 프로그램 그 자체는 보조기억장치에 보존되어있는 데이터지만 이 프로그램을 RAM에 적재하여 실행하는 순간 프로세스라고 부른다.
예를 들어 메모장이라는 프로그램은 우리가 실행하지 않는 이상 그저 프로그램으로 존재할 뿐이다. 더블클릭하여 실행하는 그 순간 프로세스가 되는 것이다.
이렇게 사용자가 보는 앞에서 실행되는 프로세스는 포그라운드 프로세스 (Foreground Process), 사용자가 보지 못하는 뒤에서 실행되는 프로세스는 백그라운드 프로세스(Background Process) 라고 부른다.
1️⃣ PCB
운영체제는 번갈아가면서 실행되는 프로세스의 실행 순서를 관리하고 CPU 등과 같은 자원을 배분하는데, 이를 위해 PCB를 이용한다. PCB는 프로세스 제어 블록 (Process Control Block)의 약자로 프로세스와 관련된 정보를 저장하는 자료구조를 말한다. 각 프로세스 마다 하나씩 PCB를 갖고 있으며 해당 프로세스를 식별하기 위해 필요한 정보가 저장된다. 그리고 이 PCB는 커널 영역에 존재한다.
그렇다면 주로 어떤 정보를 담고 있을까?
- 프로세스 ID (PID)
- 레지스터값
- 프로세스 상태
- CPU 스케줄링 정보
- 메모리 관리 정보
- 사용한 파일과 입출력장치 목록
윈도우는 작업관리자 맥북은 활성상태보기에서 현재 활성화 되어있는프로세스를 볼 수 있는데 이렇게 각기 다른 PID 값이 할당된 것을 확인할 수 있다.
문맥교환은?
하나의 프로세스에서 다른 프로세스로 실행 순서가 바뀌게 되면 문맥교환이 일어난다. 여기서 말하는 문맥은 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보, context를 이야기 한다. 그 정보는 PCB로부터 가져오고 다른 프로세스에게 실행 순서를 넘겨줄 때 정보를 백업하는 것 또한 PCB에 한다.
2️⃣ 프로세스의 구조
프로세스가 생성되면 PCB는 커널 영역에 같이 생성된다. 그렇다면 사용자 영역에 생성되는 것은 무엇일까? 대표적으로 생성되는 것들은 아래 그림과 같다.
1. 코드 영역 (Code Segment)
기계어로 이러우진 명령어가 저장된다. 이 코드 영역은 CPU가 직접 접근하는 곳이기 때문에 read-only 공간이다.
2. 데이터 영역 (Data Segment)
프로그램이 실행되는 동안 유지되는 전역변수, 상수 등이 저장되는 공간이다. 프로그램 시작 시 초기화 되며 프로세스가 종료될 때까지 유지된다.
3. 힙 영역 (Heap Segment)
프로그래머가 직접 할당할 수 있는 저장 공간이다. 이 힙 영역을 할당하면 반드시 반환해야한다. 반환하지 않으면 메모리 누수가 생길 수 있다.
4. 스택 영역 (Code Segment)
데이터를 일시적으로 저장하는 공간으로 매개 변수, 지역변수, 그리고 return 될 주소 등이 저장된다. 함수의 호출 스택도 이 공간을 활용한다.
3️⃣ 스레드는?
그렇다면 스레드는 도대체 무엇일까? 스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 스레드의 구성으로는 아래와 같다.
- 스레드 ID
- 레지스터 값
- 스택
스레드는 프로세스에 있어 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다. 즉, 프로세스의 코드, 데이터, 힙 영역은 공유하며 스택은 각 스레드 마다 가지고 있는 것이다.
4️⃣ 멀티 프로세스와 멀티 스레드
멀티 프로세스 (Multi Process): 여러 프로세스를 동시에 실행
멀티 스레드 (Multi Thread): 여러 스레드로 하나의 프로세스를 동시에 실행
멀티 프로세스 | 멀티 스레드 | |
장점 | 하나의 응용프로그램을 여러 개의 프로세스로 구성 모든 자원이 복제되어 (folk) 메모리 적재되기 때문에 하나의 프로세스 중 문제가 발생해도 연쇄적으로 확산되지 않음 |
하나의 응용프로그램을 여러개의 스레드로 구성 자원을 할당하는 시스템 콜이 줄어들어 메모리를 효율적으로 사용할 수 있음 |
단점 | 문맥교환 중 메모리 누수가 발생할 확률이 높다. IPC 통신기법으로 각 프로세스 간의 통신을 하지만 변수 공유가 어려움 |
하나의 스레드에서 문제가 생기면 프로세스 전체에 문제가 생길 수 있어 디버깅이 까다로움 단일 프로세스 프로그램일 경우 비효율적임 |
5️⃣ 멀티 스레드를 사용하는 이유는?
프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 작업을 해결하기 때문에 메모리를 효율적으로 관리할 수 있다. 메모리 누수가 덜 발생하고, 응답 시간 또한 단축된다. 하지만 대부분의 운영체제에서는 멀티 프로세스와 멀티 스레드 환경을 같이 제공하고 있다.
❗ 출처
- 강민철, 혼자 공부하는 컴퓨터구조 + 운영체제, 한빛미디어 (2022)
참고 사이트1 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
'CS' 카테고리의 다른 글
[얼레벌레 공부하는 CS] Heap과 Stack (0) | 2024.08.20 |
---|---|
메모리의 논리주소와 물리주소 (0) | 2024.06.28 |
[얼레벌레 공부하는 CS] 운영체제 (0) | 2024.05.31 |
[얼레벌레 공부하는 CS] RAM (0) | 2024.05.28 |
[얼레벌레 공부하는 CS] 컴파일 언어와 인터프리터 언어 (0) | 2024.05.13 |