프로세스 vs 쓰레드, 메모리 영역, 컨텍스트 스위칭

shockwave·2024년 11월 4일

TIL

목록 보기
44/49

프로세스 (Process)

실행 중인 프로그램의 인스턴스

컴퓨터 시스템에서 프로그램이 실행되면 운영체제는 해당 프로그램에 메모리와 시스템 자원을 할당하여 프로세스를 생성한다.
이 때 생성된 프로세스는 자체의 메모리 공간을 가지며 각자의 프로세스가 독립된 실행 환경을 갖는다.

특징

  • 각 프로세스는 고유한 메모리 공간을 갖는다. => 코드·데이터·힙·스택 영역
  • 독립적인 실행 환경을 가지므로 하나의 프로세스가 오류가 나도 다른 프로세스에 영향을 주지 않는다.
  • 프로세스 간 통신은 IPC(Inter-Process Communication) 기법을 통해 이루어진다.

쓰레드 (Thread)

프로세스 내에서 실행되는 작업의 작은 단위

특징

  • 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있다.
  • 각각의 쓰레드는 프로세스 내에서 자원을 공유하며 병렬적으로 작업을 수행할 수 있다.
  • 쓰레드는 프로세스 내의 메모리 공간(코드, 데이터, 힙)을 공유하므로, 서로 빠르게 통신하고 데이터에 접근할 수 있다.
  • 한 프로세스 내의 쓰레드가 오류가 나면 다른 쓰레드에 영향을 줄 수 있으다.

정리

프로세스와 쓰레드의 차이

구분프로세스쓰레드
메모리구조독립적인 메모리 공간 사용메모리 공간을 공유
통신 방식IPC 필요메모리 공유로 빠르게 통신 가능
실행 속도상대적으로 느림상대적으로 빠름
오류 영향 범위다른 프로세스에 영향 없음같은 프로세스 내 다른 쓰레드에 영향
생성 비용쓰레드에 비해 큼프로세스에 비해 적음

프로세스와 쓰레드는 시스템 자원을 효율적으로 사용하면서 프로그램의 병렬 처리를 가능하게 한다.
멀티프로세스와 멀티쓰레딩 기법을 통해 시스템 성능을 최적화할 수 있다.


메모리 영역

1. 코드(Code) 영역
프로그램의 실행 기계어 코드(또는 명령어)가 저장되는 메모리 공간.
프로그램이 실행되는 동안 변하지 않는다.

  • 읽기 전용, 실행 중에 변경되지 않는다.
  • 프로그램의 기계어 코드가 저장되어 있어 CPU가 이 영역의 명령을 읽어 실행한다.
  • 여러 프로세스가 동일한 코드를 사용할 경우 코드 영역은 공유될 수 있어 메모리 사용 효율을 높일 수 있다.

2. 데이터(Data) 영역
프로그램이 실행되기 전에 초기화된 전역 변수와 정적 변수가 저장되는 공간.
프로그램 실행 중에 변경될 수 있다.

  • 전역 변수와 정적 변수(static 변수)가 할당되는 공간이다.
  • 프로그램이 시작될 때 메모리가 할당되고, 프로그램이 종료될 때 해제된다.
  • 초기화된 변수는 초기화된 데이터 영역에, 초기화되지 않은 변수는 BSS(Basic Static Storage) 영역에 저장된다.

3. 힙(Heap) 영역
동적 메모리 할당이 이루어지는 공간.
언어에 따라 사용자가 직접 메모리 할당과 해제를 관리해야 하며,
주로 malloc(C언어), new(C++)와 같은 함수나 연산자를 사용하여 메모리를 할당받고 free, delete로 해제한다. (가비지 콜렉터가 있는 언어는 제외)

  • 메모리 할당이 동적으로 이루어지기 때문에 프로그램 실행 중 필요에 따라 메모리를 할당하고 해제할 수 있다.
  • 할당한 메모리는 반드시 해제해야 하며, 해제하지 않을 경우 메모리 누수가 발생할 수 있다.
  • 시스템 메모리 용량에 의존하여 확장할 수 있다.

4. 스택(Stack) 영역
함수 호출 시 사용되는 메모리 공간.
지역 변수와 함수 호출 정보(리턴 주소, 매개변수 등)가 저장된다.
함수 호출이 끝나면 해당 스택 프레임이 자동으로 해제되는 구조이다.

  • 함수가 호출될 때마다 스택 프레임이 쌓이고 함수가 종료되면 해당 프레임이 제거된다.
  • 자동으로 할당되고 해제되기 때문에 메모리 관리가 용이하나, 메모리 크기가 한정되어 있어 함수 호출이 깊어지면 필요한 스택 영역이 현재 가진 스택 영역 범위를 초과하여 스택 오버플로우(Stack Overflow)가 발생할 수 있다.

정리

메모리 영역내용특징
코드(Code)프로그램의 기계어 코드읽기 전용, 실행 중 변경 불가
데이터(Data)초기화된 전역 변수, 정적 변수프로그램 시작 시 할당, 종료 시 해제
힙(Heap)동적으로 할당된 메모리할당/해제 관리 필요, 메모리 누수 가능성 있음
스택(Stack) 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소자동 할당/해제, 제한된 크기, 스택 오버플로우 가능

컨텍스트 스위칭

하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(컨텍스트)를 보관하고 새로운 프로세스의 상태를 적재하는 작업

CPU는 한 번에 프로세스를 하나만 처리할 수 있다.
프로세스를 여러개 동시에 실행해야 할 때 컨텍스트 스위칭을 통해 동시에 실행하는 것처럼 여러 개의 프로세스를 실행할 수 있다.
(사실, 하나의 프로세스만 실행하고 있는 상태)

프로세스의 컨텍스트 스위칭 단계
1. 현재 프로세스 상태 저장 (해당 프로세스와 매칭되는 PCB(Process Control Block)에 저장함)
2. 넘어간 프로세스의 상태를 불러옴 (CPU가 해당 프로세스와 매칭되는 PCB에서 정보를 읽어들임)
3. CPU가 넘어간 프로세스에서 작업을 시작함.

스레드의 컨텍스트 스위칭 단계
1. 스레드 상태 저장 (해당 스레드와 매칭되는 TCB(Thread Control Block)에 저장함)
2. 스케줄러 작동 (프로세스 내의 다음에 실행할 스레드 선택)
3. 새로운 스레드 상태 복원

컨텍스트 스위칭은 프로세스나 스레드나 비슷한데 해당하는 컨트롤 블록이 다를 뿐임

profile
생각을 많이. 입은 무겁게. 심장은 항상 열심히 뛰는 사람이 되자.

0개의 댓글