이번 포스팅에서는 프로세스와 스레드에 대해서 알아보겠습니다.
프로그램을 알아야 프로세스를 알 수 있기 때문에 프로그램 먼저 이야기하겠습니다.
프로그램
프로그램이란 명령어들의 조합입니다. 쉽게 말하면, 윈도우의 *.exe 파일이나 Mac의 *.dmg 파일과 같은 컴퓨터에서 실행 할 수 있는 파일들을 말합니다. 또한, 실행되기 전까지는 저장장치에 저장되어 있는 정적인 상태입니다.
프로세스
프로세스는 실행 중인 프로그램의 인스턴스입니다. 프로그램을 실행하는 순간 운영체제가 해당 프로그램에 메모리와 CPU을 할당받아 프로그램 코드가 실행됩니다.
최종적으로 프로그램과 프로세스를 비교하자면 아래와 같습니다.
프로그램은 디스크에 위치하고 정적인 코드 덩어리이다. 프로세스는 실행되어 작업중인 프로그램으로 메모리에 적재되고 CPU 자원을 할당 받아 실행되고 있는 상태이다.
프로세스의 메모리 구성
프로그램이 실행되어 프로세스가 만들어지면 4가지 메모리 영역(코드, 힙, 스택, 데이터)을 할당 받게 됩니다.
각 프로세스는 독립된 메모리 공간을 가지며, 운영체제에서 독립된 실행 단위를 갖습니다. 독립된 실행 단위를 갖는 다는 것은 다른 프로세스와 격리되어 있다는 뜻과 같고, 이는 하나의 프로세스에 심각한 문제가 생겼을 때 그 문제가 전파되지 않음을 의미합니다.
- 코드 영역 : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어형태로 저장
- 힙 : 동적으로 할당되는 메모리 영역으로 자바에서는 객체가 생성되는 공간
- 스택 영역 : 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장
- 데이터 영역(기타) : 코드가 실행되면서 사용되는 전역 변수, 상수 등이 저장
코드 영역과 데이터 영역은 프로그램이 처음에 실행될 때 크기가 결정되는 정적 영역이지만, 스택과 힙 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어났다 하는 동적 영역입니다.
프로세스 컨텍스트 스위칭
CPU는 동시성을 사용해서 "동시에 돌아가는 것"처럼 보이게 합니다. 이를 이위해서는 CPU가 한 프로세스에서 다른 프로세스로 전환해야합니다. 이를 프로세스의 컨텍스트 스위칭이라고 합니다.
컨텍스트 스위칭은 CPU에서 실행되던 프로세스가 준비 상태로 돌아간 이후, 본래 준비 상태에 있는 프로세스가 CPU에 의해 실행됩니다.
이를 위해서는 대기하고 있는 프로세스의 상태를 알아야 CPU가 해당 프로세스에서 이전에 했던 작업을 이어서 할 수 있습니다.
프로세스 컨텍스트 스위칭에서 프로세스 상태는 PCB(Process Control Block)를 통해서 알 수 있습니다.
PCB (Process Control Block)
PCB는 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조를 말합니다. 컨텍스트 스위칭을 하기 위해서는 기존 프로세스의 상태를 어딘가에 저장해둬야하고, 다음 작업할 프로세스의 상태를 알아야합니다.
즉, 프로세스의 생성과 동시에 PCB가 만들어지며 PCB에는 프로세스에 관한 모든 정보가 저장됩니다.
PCB에는 일반적으로 포인터, 프로세스 상태, 프로세스 아이디, 프로세스 카운터등이 저장되어 있습니다.
- 포인터 : 프로세스의 현재 위치 정보 저장
- 프로세스 상태 : 프로세스의 각 상태 저장
- 프로세스 아이디 : 프로세스 식별자
- 프로그램 카운터 : 프로세스를 위해 실행될 다음 명령어 주소를 저장
프로세스 컨텍스트 스위칭 오버헤드
프로세스 컨텍스트 스위칭은 PCB를 저장 및 복원하는데 비용이 발생하며, 프로세스 자체가 교체되어 CPU 캐시 메모리에 저장된 데이터가 무효화된다. 따라서, 프로세스 컨텍스트 비용은 꽤나 큰 편이다.
스레드 등장
하나의 작업을 가지고 여러 단위로 쪼개서 실행하려고 할 때 프로세스 단위로 하려고 하면, 비효율적인 부분이 있습니다.
프로세스는 독립된 메모리 공간, 독립된 실행 단위를 갖기 때문에 프로세스 생성의 오버헤드가 큽니다. 당연히, 프로세스 컨텍스트 스위칭의 비용도 큽니다. 마지막으로, 프로세스들의 통신 또한 어렵습니다.
이러한 단점을 극복하기 위해 스레드가 등장하였습니다.
스레드 특징
스레드는 프로세스 내에서 동시에 진행되는 작업의 단위입니다. 한 프로세스 내에 여러 스레드가 존재할 수 있으며 이들은 프로세스가 제공하는 동일한 메모리 공간을 공유합니다. 또한, 같은 프로세스에 속해있는 스레드들은 코드 섹션, 데이터 섹션, 힙 영역을 공유하며 각 스레드들은 스택 영역만 다릅니다.
왜 스택만 스레드에 독립적으로 할당할까?
스택은 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장합니다. 이 의미는 독립적인 함수 호출이 가능하다는 의미이고 곧 독립적인 실행 흐름을 가질 수 있다는 것입니다. 따라서, 스택 영역의 의미는 하나의 프로세스 내에 여러 스레드가 독립적으로 실행되기 위해서 가져야하는 최소 저장 영역이 아닐까 합니다.
스레드 컨텍스트 스위칭
스레드 컨텍스트 스위칭은 프로세스 컨텍스트 스위칭과는 다르게 하나의 프로세스 안에서 일어납니다.
TCB (Thread Control Block)
PCB처럼 TCB(Thread Control Block)은 모든 쓰레드가 가지고 있는 정보를 담고 있는 자료구조입니다. PCB와 동일하게 TCB도 스레드가 생성될 때 생겨나며 스레드가 소멸될 때 소멸됩니다.
프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭
프로세스 컨텍스트 스위칭과 스레드 컨텍스트 스위칭 모두 여러 프로세스나 스레드를 동시에 실행시키기 위한 기술입니다.
그러나 아래와 같은 차이가 있습니다.
1. TCB가 PCB보다 가볍습니다.
프로세스 내 스레드들은 코드, 데이터 힙 영역을 공유하기 때문에 TCB는 PCB보다 가볍습니다.
2. 스레드 컨텍스트 스위칭은 캐시 메모리 초기화를 하지 않는다.
CPU 캐시 메모리는 CPU와 메인 메모리 사이에 위치하며 CPU에서 한번 이상 읽어들인 메모리의 데이터를 저장하고 있다가 CPU가 다시 해당 메모리를 요구할 때 사용합니다.
프로세스 컨텍스트 스위칭이 일어날 때는 아예 다른 프로세스로 바꾸는 것이기 때문에 CPU 캐시 메모리를 초기화합니다.
그러나 스레드 컨텍스트 스위칭은 프로세스 내 스레드간에 스택 등 일부 컨텍스트 정보만 변경하기 때문에 CPU 캐시 메모리를 초기화하지 않습니다.
지금까지 프로세스와 스레드에 대해서 알아보았습니다. 감사합니다.
참고)
'스터디 > 컴퓨터구조와 운영체제' 카테고리의 다른 글
CPU의 성능에 영향을 끼치는 것들 (0) | 2023.09.19 |
---|---|
인터럽트가 발생한다면, CPU는 어떻게 처리할까?? (1) | 2023.09.14 |
명령어 사이클을 통해 CPU 동작 원리 및 뼈대 잡기 (0) | 2023.09.10 |
컴퓨터 구조의 큰 그림을 그려보자 (2) | 2023.09.03 |