Thread

무삭이의 개발일지·2023년 4월 23일
0

병렬 vs 병행

  • 병행(Concurrent)은 멀티 스레드 프로그래밍을 의미
  • 병렬(Parallel)은 멀티 코어 프로그래밍을 의미
  • 우리가 살펴볼 것은 병행 프로그래밍(동시성 프로그래밍, 멀티스레드 프로그래밍)

Process

  • 각각의 프로세스는 메모리 공간에서 독립적으로 존재한다.
  • 각가의 프로세스는 다음 페이지 그림과 같이 자신만의 메모리 구조를 가진다.
  • 프로세스 A,B,C가 있을 경우 각각 프로세스는 모두 같은 구조의 메모리 공간을 가진다.
  • 독릭적인 만큼 다른 프로세스의 메모리 공간에 접근할 수 없다.

IPC

  • 프로세스 A에서 프로세스 B를 직접할 수 없기 때문에 프로세스 간의 통신을 하는 특별한 방식이 필요하다. 메일슬록(mailslot), 파이프(pipe)등이 바로 프로세스 간의 통신 즉, IPC의 예들이다.
  • 프로세스는 독립적인 메모리 공간을 지니기 때문에 IP를 통하지 않고 통신할 수 없다.
  • 프로세스가 여럿이 병렬적으로 실행되기 위해서는 필연적으로 컨텍스트 스위칭이 발생할 수 밖에 없다. 이것을 해결할 수 있는 것이 Thread이다.

Thread

  • 스레드는 하나의 프로그램 내에 존재하는 여러 개의 실행 흐름을 위한 모델이다.
  • 우리가 생각하는 프로그램이 실행되기 위해서 하나의 실행흐름으로 처리할 수도 있지만 다수의 실행흐름으로 처리할 수도 있다.
  • 뒤에 나오는 그림과 같이 스레드는 프로세스와 별개가 아닌 프로세스를 구성하고 실행하는 흐름이다.

스레드 vs 프로세스

  • 스레드는 프로세스 안에 존재하는 실행흐름이다.
  • 스레드는 프로세스의 heap, static, code영역 등을 공유한다.
  • 스레드는 stack영역을 제외한 메모리 영역을 공유한다.
  • 스레드는 code영역을 공유하기 때문에 프로세스 내부의 스레드들은 프로세스가 가지고 있는 함수를 자연스럽게 모두 호출할 수 있다.
  • 스레드는 IPC없이도 스레드 간의 통신이 가능하다. A, B 스레드는 통신하기 위해 heap 영역에 메모리 공간을 할당하고, 두 스레드가 자유롭게 접근할 수 있다.
  • 스레드는 프로세스처럼 스케줄링의 대상이다. 이 과정에서 컨텍스트 스위칭이 발생한다. 하지만 스레드는 공유하고 있는 메모리 영역 덕분에 컨텍스트 스위칭 때문에 발생하는 오버헤드가 프로세스에 비해 작다.
    • 동작중인 프로세스가 바뀔 때 프로세스는 현재 자신의 상태(contex정보)를 일단 보존한 후, 새롭게 동작 개시하는 프로세스는 이전에 보존해 두었던 자신의 컨텍스트 정보를 다시 복구한다. 이와 같은 현상을 컨텍스트 스위칭이라 말한다.
    • 스레드의 컨텍스트 정보는 프로세스보다 적기 때문에 스레드의 컨텍스트 스위칭은 가볍게 행해지는 것이 보통이다.
    • 하지만, 실제로 스레드와 프로세스의 관계는 JVM구현에 크게 의존한다.
  • 참고로 플랫폼이 같아도 JVM의 구현방법에 따라 프로세스와 스레드의 관계는 달라질 수 있다.

참고
부부개발단 - 즐겁게 프로그래밍 배우기

profile
No. Try not. Do or Do not. There is no try.

0개의 댓글