본문 바로가기

기타

프로세스와 스레드

반응형

프로세스

운영체제로부터 시스템 자원(독립된 시간, 공간 자원)을 할당받아 메모리에 적재되어 실행되고 있는 *프로그램을 의미합니다.

*프로그램이란, 실행 가능한 명령어의 집합입니다.

프로세스는 커널에 의해 직접 관리되며 커널 메모리 안에는 각 프로세스마다 관리하고 있는 프로세스에 대한 데이터들(PCB)이 있습니다.

사용자가 사용하는 메모리 공간상의 프로세스 정보는 Code, Data, Heap, Stack 으로 나뉩니다.

메모리

  • Stack: 함수에서 다른 함수를 실행하는 등 서브 루틴들의 정보를 저장
  • Code: 프로그램의 실제 코드를 저장
  • Heap: 프로세스 런타임 중 동적으로 할당되는 변수들을 저장
  • Data: 프로세스가 실행될 때 정의된 전역 변수, Static 변수들을 저장

 운영체제는 각각의 프로세스를 독립적으로 관리하기 때문에 하나의 프로세스에 장애가 나더라도 다른 프로세스에 문제가 발생하진 않습니다.

 대부분의 운영체제는 프로세스가 다른 프로세스의 정보를 변경하는 것을 주의하고 있어 다른 프로세스에 직접 접근할 수 없으며 필요한 경우 프로세스 간의 소통(IPC, Inter Process Communication)을 통해 소통할 수 있도록 합니다. 

 

스레드

프로세스 내에서 실행되는 여러 흐름의 단위로 프로세스의 특정한 수행 경로입니다.

하나의 프로세스는 하나의 스레드로 시작되며 이를 '메인스테드'라 합니다.

스레드는 한 프로세스 내에서 각각 Stack만 따로 할당 받으며 Code, Data, Heap 영역은 공유합니다. 그렇기 때문에 프로세스 간 통신에 비해 스레드 간 통신은 훨씬 간단합니다.

 

자바 스레드

JVM이 운영체제의 역할을 하며 자바에서는 프로세스가 존재하지 않고 스레드만 존재합니다.

자바 스레드는 JVM에 의해 스케줄 되는 실행 단위 코드 블록입니다.

 

 

멀티 프로세스와 멀티 스레드의 차이

멀티 프로세스

  • 특징
  • 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것입니다.
  • 여러 개의 자식 프로세스 중 하나에 문제가 생겨도 다른 것에 영향이 확산되진 않습니다.

 

  • 단점
  • *Context Switching 과정에서 CPU 레지스터 상태 변환, 스택 포인터 추적, 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되므로 오버헤드가 발생하게 됩니다.
  • 프로세스 간에 공유하는 메모리가 없어 Context switching이 발생하면 캐시에 있는 모든 데이터를 리셋 후 다시 캐시 정보를 불러와야 합니다.
  • 프로세스 간 독립된 메모리 공간을 할당받아 하나의 프로그램에 속하는 프로세스 간에도 어렵고 복잡한 통신 기법을 사용해야 합니다(IPC) 

*Context Switching

Multitasking 환경에서 컴퓨터는 time sharing 기법으로 프로세스의 작업을 짧게 하고 다른 프로세스에 CPU 자원을 양보하는 작업을 수행하여 여러 프로세스들을 처리하고 있습니다. 이렇게 CPU에서 여러 프로세스가 돌아가며 작업을 처리하는데 이 과정을 Contect Switching이라 합니다.

동작 중인 프로세스가 작업 중단을 하면 해당 프로세스의 상태(Context)를 PCB에 보관합니다. 이후 대기 중이던 프로세스를 다시 동작하게 되면 PCB에 저장된 프로세스의 상태(Context)를 복구하는 작업입니다.

 

 

멀티 스레드

  • 특징
  • 하나의 프로그램을 여러개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하는 것입니다.
  • 웹 서버는 대표적인 멀티 스레드 응용 프로그램입니다.
  • 시스템 자원 소모 감소: 프로세스를 생성하여 자원을 할당하는 system call이 줄어들어 자원을 효율적으로 관리 가능합니다.
  • 시스템 처리량 증가: 스레드간은 데이터를 주고받는 것이 간단하여 자원 소모가 줄어들며 스레드 간의 작업량이 작아 Context Switching이 빠릅니다.
  • 간단한 통신 방법으로 프로그램 응답 시간이 단축됩니다. 스레드는 프로세스 내의 stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적습니다.

 

  • 단점
  • 자원 공유의 문제가 발생합니다. 
  • 하나의 스레드에 문제가 생기면 전체 프로세스에 영향이 있습니다.

멀티 스레드를 사용하면,

1. 자원의 효율성이 증대됩니다.

멀티프로세스의 경우 프로세스 생성하여 자원을 할당해야 하는 system call이 발생하는 반면, 멀티 스레드인 경우 해당 작업이 없기 때문에 자원을 효율적으로 관리할 수 있습니다.

 

2. 처리 비용 감소 및 응답시간의 단축

프로세스 간 통신보다 스레드간 통신 비용이 적으므로 작업 간의 통신 부담이 줄어듭니다.

또한, Context Switching 발생 시 스레드는 stack 영역만 처리하기 때문에 프로세스 간 전환 속도보다 스레드 간 전환 속도가 빠릅니다.

반응형

'기타' 카테고리의 다른 글

[Golang] Go 시작하기  (0) 2021.07.27
보안  (0) 2020.09.15
Semaphore & Mutex  (0) 2020.09.10
git  (0) 2020.09.02
SQLD  (0) 2020.09.02