프로세스(Process) / 스레드(Thread) ?

프로세스 (Process)

운영체제에서 실행 중인 프로그램(Program)의 인스턴스. 독립적인 메모리 공간을 가지며, 각각의 프로세스는 자신의 메모리 영역(코드, 데이터, 힙, 스택)을 가진다. 프로세스 간에는 메모리가 격리되어 있어 서로 접근할 수 없지만, IPC (Inter-Process Communication) 방법을 통해 데이터를 주고 받을 수 있다. 일반적으로 각 프로세스는 최소 하나 이상의 스레드를 포함하고 있으며, 프로세스 간의 전환은 비용이 크기 때문에 CPU 효율을 높이기 위해 스레드를 사용한다.

 

IPC (Inter-Process Communication)

더보기

서로 다른 프로세스 간에 데이터를 주고받기 위해 사용하는 통신 방법. 프로세스는 서로 독립된 메모리 공간을 가지므로, 일반적으로 직접 메모리를 공유할 수 없다. 따라서 IPC 기법을 통해 서로 데이터를 교환하거나 자원을 공유한다.

주요 IPC 기법

  • 파이프(Pipes)

익명 파이프와 명명된 파이프(Named Pipes)가 존재. 익명 파이프한 방향으로만 데이터가 흐르며, 부모 프로세스와 자식 프로세스 간의 통신에 주로 사용된다. 명명된 파이프는 파이프에 이름을 붙여주어, 관련이 없는 프로세스 간에도 데이터 전송이 가능하다.

  • 메시지 큐(Message Queue)

커널이 관리하는 메시지 큐에 데이터를 저장해 두면, 다른 프로세스가 큐에서 메시지를 꺼내서 사용한다. 비동기 방식이기 때문에 프로세스가 동시에 통신할 필요 없이 메시지를 주고받을 수 있다. 메시지에 ID를 부여하여 특정 메시지를 분리할 수도 있다.

  • 공유 메모리(Shared Memory)

두 개 이상의 프로세스가 동일한 메모리 영역을 공유하여 데이터를 주고받을 수 있게 한다. 속도가 빠르며, 대량의 데이터를 효율적으로 공유할 수 있다. 데이터 변경 시 충돌을 방지하기 위해 세마포어 뮤텍스 같은 동기화 메커니즘을 함께 사용해야 한다.

  • 소켓(Sockets)

네트워크를 통해 다른 컴퓨터의 프로세스와 통신하거나 같은 컴퓨터에서 다른 프로세스와 통신할 때 사용. TCP 또는 UDP 프로토콜을 사용하여 연결 지향적 또는 비연결 지향적 통신이 가능하다. 로컬 네트워크와 인터넷을 모두 지원하므로, 원격 시스템 간 통신이 필요한 경우에 많이 사용된다.

  • 세마포어(Semaphores)

공유된 자원에 대한 접근을 제한하여 여러 프로세스가 동시에 접근하지 않도록 동기화하는 방법. 프로세스 간 데이터를 직접 주고받는 것은 아니지만, 공유 자원에 대한 접근 제어를 통해 IPC를 보조한다. 세마포어의 값이 0이 되면 다른 프로세스의 접근을 막고, 값이 양수일 경우 접근을 허용하는 방식으로 동작한다.

  • 메모리 맵 파일(Memory-Mapped Files)

파일을 메모리에 매핑하여, 프로세스들이 해당 파일을 통해 데이터를 공유할 수 있다. 공유 메모리와 비슷하지만, 파일 시스템을 통해 데이터를 관리한다. 데이터를 저장하고 재사용해야 하는 경우, 특히 대규모 데이터 세트를 처리할 때 유용하다.

  • 신호(Signals)

프로세스 간의 이벤트 알림이나 특정 동작을 유도하기 위해 사용되는 메커니즘. UNIX 및 POSIX 시스템에서 주로 사용하며, 특정 신호를 통해 프로세스에 작업을 요청할 수 있다. 예를 들어, SIGINT프로세스 중지, SIGKILL프로세스 강제 종료에 사용된다.


 

 

스레드 (Thread)

 

프로세스 내부에서 실행되는 작은 실행 단위로, 프로세스의 자원을 공유하며 동시에 작업을 수행할 수 있다. 스레드들은 같은 프로세스의 메모리 공간을 공유하지만, 각각의 스택 메모리는 독립적으로 가진다. 스레드 간 전환은 프로세스 간 전환보다 비용이 적고 빠르기 때문에, 멀티스레드 프로그래밍을 통해 성능을 최적화할 수 있다.

 

프로세스 / 스레드 메모리 차이점

 

 

프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가지며 다른 프로세스와 격리된다. 스레드는 같은 프로세스 내에서 코드, 데이터, 힙 영역을 공유하여 효율적으로 자원을 사용하지만, 각 스레드는 독립적인 스택을 가진다.

 

프로세스 메모리 구조

 

  • 코드(Code) 영역

실행할 프로그램 코드가 저장되는 영역. 프로세스 실행 중에 변하지 않는 정적 데이터를 포함한다. 여러 스레드가 동시에 접근하더라도 코드 영역은 변경되지 않으므로 공유할 수 있다.

  • 데이터(Data) 영역

초기화된 전역 변수정적 변수가 저장되는 영역. 프로그램 시작 시 할당되고, 프로그램 종료 시까지 유지된다. 다른 스레드와 공유되는 영역이므로, 변경 시 동기화 처리가 필요할 수 있다.

  • 힙(Heap) 영역

런타임에 동적으로 할당되는 메모리 공간. 동적 할당(malloc/calloc/new)해제(free/delete)에 의해 관리된다. 힙은 크기가 고정되어 있지 않고, 필요에 따라 확장하거나 축소할 수 있다. 프로세스 내 모든 스레드가 공유할 수 있다.

  • 스택(Stack) 영역

함수 호출 시 생성되는 지역 변수매개 변수가 저장되는 영역. 각 스레드는 자신만의 독립적인 스택을 가지므로, 스택에 저장된 값은 다른 스레드와 공유되지 않는다. 스택은 LIFO(Last In, First Out) 구조로, 함수가 종료되면 스택에서 할당된 메모리가 자동으로 해제된다.

 

 

 

'CS' 카테고리의 다른 글

레이스 컨디션 ?  (0) 2024.11.14
컨텍스트 스위칭?  (0) 2024.11.12
면접 질문 연습하기(2)  (1) 2024.10.25
TCP 서버를 공부하기 전에...  (2) 2024.10.17
객체 지향?  (0) 2024.10.16