CS

[CS] 프로그램, 프로세스, 쓰레드

Joonfluence 2025. 1. 8. 05:11

서론

오늘은 프로그램, 프로세스, 쓰레드의 차이점에 대해서 알아보도록 하겠습니다.

본론

프로그램과 프로세스의 차이

프로그램이란 저장장치에 저장되어 있어 언제든지 실행 가능한 파일을 말합니다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해줘야 실행될 수 있는데, 프로그램은 아직 메모리에 올라가 있지는 않은 상태입니다.

반면, 프로세스란 컴퓨터에서 실행되고 있는 컴퓨터 프로그램을 말합니다. 이는 프로그램과는 다르게, 메모리에 올라와 있는 상태입니다. 즉, 프로세스란 메모리에 올라와 있는 프로그램을 말합니다.

프로세스와 쓰레드의 차이

과거에는 프로그램을 실행할 때 실행 시작부터 실행 끝까지 프로세스 하나만을 사용해서 진행했다고 합니다. 그러나 프로그램이 더이상 하나의 작업 만을 수행하지 않게 되면서, 프로세스 하나로 프로그램을 제어하기 어려워졌습니다.

그러면 프로세스를 여러 개 만들면 되지 않을까요? 그러나 이는 불가능한 일입니다. 왜냐면 운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문입니다.

쓰레드란 위에 언급한 문제점의 한계를 해결하기 위해 나온 개념으로, 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동합니다. 쓰레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것을 말합니다.

또 한 가지 중요한 차이가 있습니다. 하나의 프로세스가 오류로 인해 강제종료 되더라도, 다른 프로세스의 상태엔 영향을 주지 않습니다. 그러나 스레드의 경우에는 하나의 스레드에서 발생된 오류가 연쇄작용으로 다른 스레드에도 영향을 주게 됩니다.

이러한 방식으로 메모리를 공유하는 까닭은?

CPU는 작업을 처리할 때 스레드를 최소 단위로 삼고 작업을 합니다. 반면 운영체제는 프로세스를 최소 단위로 삼습니다. 이 때 하나의 프로세스는 하나 이상의 스레드를 갖으므로 운영체제 관점에선 프로세스 소속의 스레드끼리 메모리를 공유하지 않을 수 없습니다.

멀티태스킹, 멀티스레드란?

멀티태스킹이란 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 말합니다. 여러 프로세스가 동시에 실행되는 것처럼 보이지만, 실제론 하나의 프로세스를 중단하고 다른 프로세스를 실행하는 방식이 사람이 인지하기 어려울 정도로 짧은 시간에 이뤄져 동시에 실행되는 것처럼 보일 뿐입니다. 이러한 작업을 처리하는 것은 프로세스 스케쥴링과 관련됩니다.

멀티스레드란 하나의 프로세스가 여러 작업을 복수의 스레드를 사용하여 동시에 처리하는 것을 말합니다.

멀티스레드의 장점과 단점

  1. 장점
    1. 멀티태스킹을 위해 프로세스 간 작업 전환(Context-Switching)을 하는 경우에 비해, 메모리 자원을 아낄 수 있습니다. 멀티스레드는 하나의 프로세스의 메모리를 서로 공유하기 때문입니다.
    2. 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리(Code, Data, Heap)를 공유하기 때문에 통신 부담이 적고 응답 시간이 빠릅니다.
  1. 단점
    1. 스레드 하나가 프로세스 내 자원을 망쳐, 모든 프로세스가 종료될 수 있습니다.
    2. 자원을 공유하기 떄문에 필연적으로 동기화 문제(Synchronization Issue)가 발생할 수 밖에 없습니다.

동기화 문제

멀티스레드를 사용하면 각각의 스레드의 실행 순서를 파악하기 어렵습니다. 만약 A 스레드가 C라는 자원을 사용하다, B 스레드에서 C를 수정했을 때 A 스레드는 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생될 가능성이 있습니다. 이처럼 여러 스레드가 같은 전역 변수를 사용할 경우 발생할 수 있는 충돌동기화 문제라고 합니다. 이처럼 스레드 스케쥴링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하므로 프로그래밍할 때 멀티스레드를 사용하려면 신중해야 합니다.

한 프로세스에서 다른 프로세스의 정보에 접근하는 방법

사실 프로세스 간 정보를 공유하는 것은 불가능한 일은 아닙니다. 아래 방법들을 사용하면 프로세스 간에도 정보를 공유할 수 있습니다.

  1. IPC(Inter-Process Communication)을 사용한다.
  2. LPC(Local inter-Process Communication)을 사용한다.
  3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.

 

프로세스 간 통신(IPC)의 주요 방법

1.1 파일 (File-Based Communication)

  • 두 프로세스가 같은 파일을 읽고 쓰는 방식으로 데이터를 공유합니다.
  • 특징
    • 간단하게 구현 가능
    • 파일 시스템을 사용하므로 프로세스 종료 후에도 데이터가 유지됩니다
    • 파일 잠금(lock)을 통해 동기화 문제를 해결해야 함
  • 예시
    • 로그 파일, 설정 파일 등을 통해 통신

1.2 파이프 (Pipe)

  • 한 프로세스에서 출력한 데이터를 다른 프로세스가 입력으로 사용하는 통신 방식입니다.
  • 종류
    1. 익명 파이프
      • 부모와 자식 프로세스 간의 통신에 사용
      • 단방향 통신만 가능
    2. 이름 있는 파이프 (Named Pipe/FIFO)
      • 독립적인 프로세스 간에도 통신 가능
      • 단방향 또는 양방향 통신 가능

1.3 소켓 (Socket)

  • 네트워크 기반 통신이지만, 같은 시스템 내에서도 프로세스 간 통신에 사용 가능.
  • 특징
    • 클라이언트-서버 모델로 동작
    • TCP/UDP 기반으로 로컬 또는 네트워크를 통해 통신
    • 고성능 양방향 통신 지원
  • 예시
    • Unix 도메인 소켓(UDS)은 네트워크 없이 로컬에서만 통신 가능.

1.4 공유 메모리 (Shared Memory)

  • 두 프로세스가 같은 메모리 영역을 공유하여 데이터를 읽고 씁니다. 
  • 특징
    • 가장 빠른 통신 방식 
    • 메모리를 공유하기 때문에 추가적인 데이터 복사 비용이 없음 
    • 동기화 문제가 발생할 수 있어 세마포어 등의 동기화 도구 필요 

1.5 메시지 큐 (Message Queue)

  • 프로세스 간 데이터를 교환하기 위해 큐(queue) 형태로 메시지를 전달.
  • 특징
    • 순차적으로 데이터를 처리 
    • 크기가 고정된 메시지를 송수신 
    • 비동기 통신 가능 

1.6 시그널 (Signals)

  • 프로세스 간 이벤트를 알리기 위한 방법으로, 데이터를 전달하기보다는 특정 작업을 수행하도록 트리거 역할을 합니다.
  • 특징
    • 간단한 통신 및 제어 가능 
    • 데이터보다는 신호 자체가 중요 

1.7 D-Bus와 같은 고수준 IPC 프레임워크

  • 고수준 프로세스 간 통신을 위한 프레임워크
  • 예시
    • D-Bus : Linux 데스크톱 환경에서 주로 사용 
    • gRPC : 원격 프로시저 호출을 지원하는 범용 통신 방식 
    • Thrift : 효율적인 데이터 직렬화와 RPC를 지원 

참고한 사이트

프로세스와 스레드의 차이

 

반응형