프로세스

  • 프로세스는 하나의 어플리케이션이라고 생각하면 된다.
  • 프로그램이 실행되어 프로그램에서 사용하는 자원들이 메모리에 적재가된다.
  • 메모리 영역을 크게 나누면 Code, Data, Heap, Stack 영역으로 나누어진다.

img

  • 정적 세그먼트
    • text는 코드 부분이다
    • read only 영역이다
    • data는 전역변수, 정적변수, 배열, 구조체 등이 저장된다
    • 초기화 된 데이터는 data에 저장
    • 초기화가 되지 않은 데이터는 bss에 저장
  • 동적 세그먼트
    • heap은 프로그래머가 동적으로 사용하는 영역이다.
    • stack은 지역변수, 매개변수, 복귀 번지 등이 저장되는 임시 메모리 영역이다.

멀티 프로세스

img

  • 멀티 프로세스는 말 그대로 여러개의 프로세스를 사용하는 것이다.
  • 각 메모리 영역은 독자적인 리소스를 가지고 생성된다.
  • 다만 한 애플리케이션의 멀티 프로세스는 동기화의 문제가 있고 바뀌지않는 code나 data영역이 계속 생성되어 메모리 공간을 낭비하게 된다.

스레드

  • 보통 아무 조건없이 프로세스라고만 말하면 하나의 스레드를 갖는 프로세스를 말한다.
  • 스레드란 프로세스의 실행 단위를 말한다.
  • 프로세스와는 다르게 메모리에 적재될때 Stack만 별도의 주소공간에 생성된다.
  • 때문에 스레드 생성비용에 있어서 프로세스 보다 절감될 수 있다.

멀티 스레드

img

  • 한 프로세스 안에는 여러개의 스레드가 생성될 수 있다.
  • 한 프로세스가 여러 작업을 동시에 처리할 수 있다.
  • 멀티 스레드와는 다르게 stack영역을 제외한 나머지 영역은 공유하기 때문에 멀티 프로세스에 비해 메모리 영역을 덜 차지한다
  • 스레드 생성은 캐시 메모리를 비울 필요가 없기 때문에 컨텍스트 스위칭에 있어서 더 유리하다
  • 다만 공유자원을 사용하기 때문에 멀티스레드를 고려하지 않고 공유자원을 사용하게 된다면 같은 로직에대해 다른 결과가 나올 수도 있기 때문에 주의해야한다.
  • 작업처리 순서를 조절하고 공유 자원에 대한 접근을 컨트롤 해야한다.
  • 락으로 인한 병목현상이 발생할 수도 있으니 주의가 필요하다

스레드 풀

img

  • 스레드를 만드는 것도 제거하는 것도 비용이 된다. 그렇기 때문에 미리 메모리 영역을 확보하는 방식을 활용한 것이 스레드 풀이다.
  • 스레드 풀은 미리 스레드를 만들어 두고 작업이 있을 때마다 스레드에게 작업을 할당하는 방식이다.
  • 작업큐라는 것도 존재하는데 스레드에 작업을 할당하기 전 이 큐에 작업을 대기시켜 놓고 스레드에게 작업을 할당한다.
  • 만일 스레드보다 많은 작업이 들어온다면 작업은 큐에서 대기상태에 놓이게되고 작업 가능한 스레드가 생길때까지 기다리게된다.
  • 다만 스레드풀 크기를 제대로 지정하지 못하면 메모리 낭비로 이루어질 수 있다.