프로세스와 쓰레드의 차이

break 없는 while loop·2024년 11월 10일
post-thumbnail

1. 사전적 정의

프로세스: 운영체제로부터 자원을 할당받은 작업의 단위
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위

2. 프로그램 vs 프로세스 vs 쓰레드

프로그램?

프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말한다.

즉, 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 의미. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있다.

쉽게 말해서 그냥 코드 덩어리

프로세스?

프로세스는, 그 프로그램을 실행한 것이라고 말할 수 있다.

  • 메모리 공간: 프로세스는 독립된 메모리 공간을 가진다. 운영체제는 각 프로세스에 별도의 메모리 영역(코드, 데이터, 힙 스택)을 할당하여 격리한다.
  • 통신 방법: 서로 다른 프로세스 간에는 독립적이기 때문에 직접적인 자원 공유가 불가능하며, 데이터 교환을 위해 IPC(Inter-Process Communication) 방법(예를 들어, 파이프, 소켓, 메시지 큐 등)을 사용해야 한다.
  • 비용: 프로세스는 서로 독립적이기 때문에 새로운 프로세스를 생성하거나 전환하는 오버헤드가 크다.

운영 체제의 최소 작업 단위

쓰레드?

쓰레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로다.

  • 메모리 공간: 같은 프로세스 내의 쓰레드들은 코드, 데이터, 힙 영역을 공유한다. 다만, 각 쓰레드는 자신만의 스택 영역을 가진다.
  • 통신 방법: 같은 프로세스 내의 쓰레드들은 메모리를 공유하기 때문에 간편하게 데이터 공유와 통신이 가능하다.
  • 비용: 쓰레드는 프로세스보다 가볍고, 생성 및 전환 비용이 낮아 상대적으로 효율적이다.

CPU의 최소 작업 단위

3. 주요 차이점 요약

구분프로세스스레드
메모리독립된 메모리 공간동일한 메모리 공간(코드, 데이터, 힙)을 공유
통신 방법IPC(파이프, 메시지 큐 등) 사용메모리 공유를 통해 간편한 통신 가능
비용생성 및 전환 비용이 큼생성 및 전환 비용이 적음
종속성각 프로세스는 독립적으로 실행 가능같은 프로세스 내 스레드에 종속적

4. OS 관점에서의 차이점

1. 메모리 구조와 관리

프로세스 메모리 구조:

  • 각 프로세스는 독립된 메모리 공간을 가진다. 코드, 데이터, 힙, 스택 영역이 각각 존재하며, 프로세스 간 메모리 공유가 불가능하다.
  • OS는 가상 메모리를 사용하여 각 프로세스가 자신만의 독립적인 메모리 공간을 가진 것처럼 보이게 한다.
  • 메모리 접근을 엄격히 관리하여 다른 프로세스의 메모리 영역에 접근하지 못하도록 하며, 보안과 안정성을 보장한다.

쓰레드 메모리 구조:

  • 스레드는 코드, 데이터, 힙 영역을 같은 프로세스 내의 다른 쓰레드들과 공유한다.
  • 각 쓰레드는 자신만의 스택 영역을 가지며, 스택은 지역 변수와 함수 호출 정보를 관리한다.
  • 메모리 공유 덕분에 쓰레드 간 통신과 데이터 접근이 용이하지만, 동시에 동기화 문제가 발생할 수 있다. OS는 쓰레드 간 데이터 동기화를 위해 뮤텍스, 세마포어 같은 동기화 도구를 제공한다.

뮤텍스와 세마포어는 OS에서 동기화와 자원 보호를 위해 사용되는 동기화 도구이다. 두 개념 모두 여러 쓰레드나 프로세스가 공유 자원에 접근할 때 발생할 수 있는 경쟁 상태(Race Condition)를 방지하는 역할을 하지만, 작동 방식과 사용 목적에 차이가 있다.


뮤텍스
정의: 상호 배제(mutual exclusion)를 의미하며, 단일 쓰레드나 프로세스만이 공유 자원에 접근할 수 있도록 하는 동기화 도구이다.
특징:
1. 잠금/해제(Lock/Unlock) 기법을 사용하여, 하나의 쓰레드가 뮤텍스를 얻어 잠그면(lock) 다른 쓰레드는 자원이 해제될 때까지(unlock) 기다린다.
2. 자원을 사용하는 쓰레드가 작업을 끝내면 뮤텍스를 해제하여 다른 쓰레드가 자원에 접근할 수 있게 한다.
3. 뮤텍스는 소유권 개념이 있어, 잠금을 건 쓰레드만 해제를 할 수 있다.
사용 예시:
공유 메모리, 파일 등 단일 자원에 대한 독점 접근이 필요할 때 사용된다.


세마포어
정의: 동시 접근을 제어하는 카운터 기반의 동기화 도구로, 특정 자원에 대해 여러 쓰레드가 동시 접근할 수 있도록 허용하는 기능을 제공한다.
종류:
1. 이진 세마포어: 뮤텍스처럼 0과 1 두 개의 값만을 가지며, 단일 접근을 제어한다.
2. 카운팅 세마포어: N개의 자원을 나타내는 카운터로, 여러 쓰레드가 동시에 자원에 접근할 수 있도록 한다.
특징:
1. 세마포어는 자원에 접근할 수 있는 허용 가능 수(N)를 설정하고, 이를 초과하는 접근 요청이 들어오면 대기상태에 둔다.
2. 자원 접근을 끝낸 쓰레드가 세마포어를 해제하면 기다리던 쓰레드가 순차적으로 자원에 접근할 수 있다.
3. 세마포어는 소유권 개념이 없으므로, 임의의 쓰레드가 해제할 수 있다.
사용 예시:
제한된 개수의 자원(예: DB 커넥션 풀)에 여러 쓰레드가 동시에 접근해야 할 때, 카운팅 세마포어를 사용해 접근을 제한할 수 있다.

2. CPU 스케줄링과 성능

프로세스 스케줄링:

  • OS는 프로세스를 독립적인 실행 단위로 취급하며, 멀티태스킹을 위해 각 프로세스를 전환(context switch)한다.
  • 프로세스 전환 시, CPU는 프로세스의 전체 문맥(프로세스ID, 프로그램 카운터, 레지스터 상태 등)을 저장하고 복원해야 하므로 오버헤드가 크다.

쓰레드 스케줄링:

  • 쓰레드는 동일한 프로세스 내에서 동작하기 때문에 프로세스보다 가벼운 스케줄링이 가능하다.
  • 쓰레드 전환 시 프로세스와 같은 메모리 영역을 공유하므로 문맥 전환 비용이 적고 빠르게 전환된다.
  • OS는 쓰레드 우선 순위와 스케줄링 방식을 고려하여 효율적으로 CPU 자원을 배분한다.

3. 자원 관리와 통신 방식

프로세스 간 통신:

  • 프로세스는 각각 독립된 메모리 공간을 가지므로, 직접 메모리 공유가 불가능하다.
  • 따라서 IPC(Inter-Process Communication) 방식(예: 파이프, 소켓, 공유 메모리, 메시지 큐)을 통해 데이터를 주고 받는다.
  • IPC는 독립된 프로세스 간 통신을 가능하게 하지만, 추가적인 오버헤드가 발생할 수 있다.

쓰레드 간 통신:

  • 쓰레드는 같은 메모리 공간을 공유하므로, 별도의 IPC 없이 공유 메모리를 통해 빠르게 데이터를 주고 받을 수 있다.
  • 하지만 공유 메모리 환경에서는 데이터 동기화와 충돌 방지가 필수적이다. 이를 위해 뮤텍스, 세마포어, 모니터 같은 동기화 기법을 사용해 쓰레드가 자원을 안전하게 공유하도록 제어한다.

4. OS 지원 및 구현 방식

대부분의 운영체제는 멀티쓰레딩을 기본적으로 지원하며, 특히 커널 수준 쓰레드유저 수준 쓰레드를 나누어 관리한다.

  • 커널 수준 쓰레드: OS 커널이 직접 쓰레드를 관리하고 스케줄링을 담당한다. 커널이 컨텍스트 스위칭을 수행하기 때문에 성능이 안정적이지만, 전환 오버헤드가 발생한다.
  • 유저 수준 쓰레드: OS에 독립적으로 유저 공간에서 관리된다. 전환이 빠르지만, 다중 CPU 환경에서는 효율이 떨어질 수 있다.

OS 관점에서 프로세스는 독립성과 보안을 보장하는 실행 단위이며, 쓰레드는 성능 최적화와 병렬 처리에 유리한 실행 단위이다.

profile
프로그래밍 지식 아카이브용

0개의 댓글