Java

스레드

HUCHUCHU 2022. 10. 21. 01:11

1. 저장장치에 저장되어있는 프로그램을 실행시키면 메모리에 올라가고(프로세스) CPU의 캐시와 레지스터로 처리한다(프로세서).

 

2. 쓰레드(thread) : 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원, 쓰레드로 구성되어있으며 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 쓰레드이다. 하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어있지 않지만 스레드가 작업을 수행하는데 개별적인 메모리 공간(호출스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 스레드의 수가 결정된다.

 

  • 스레드는 프로세스의 heap, static, code영역을 공유하고 독립적인 stack영역을 가진다
  • 스택을 독립적으로 할당하는 이유 
    • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위헤 사용하는 메모리공간. 
  • 레지스터 : sp(Stack Pointer), fp(Frame Pointer), pc(Program Counter) 레지스터
    • pc는 실행해야 할 명령어의 위치를 가리키는 레지스터이다
    • 쓰레드별로 main함수를 독립적으로 가지고있고, 함수 호출도 독립적으로 진행되기 때문에 쓰레드별로 현재 pc값이 달라야한다. 
    • 따라서 pc는 공유되지않고, 쓰레드는 독립적인 스택을 가지기 때문에 스택의 정보를 담고있는 sp와 fp는 공유되지않는다

3. 정리 : 프로세스는 각각의 독립적인 메모리를 부여받고 쓰레드는 프로세스 내에 존재하는 여러개의 실행 흐름이다. 이 실행흐름은 하나만 존재할 수도있고 여러개가 존재할 수도있다. 

 

4. 멀티쓰레드로 병렬처리가 가능하지만 같은 프로세스 내에서 자원을 공유하며 작업을 하기 때문에 발생할 수 있는 동기화, 교착상태와 같은 문제들을 고려해야한다

 

5. 쓰레드 풀

  • 쓰레드 제어 문제를 해결할 방법으로 스레드 풀을 사용한다. 쓰레드 풀은 매번 생성 및 수거 요청이 올 때 스레드를 생성하고 수거하는 것이 아닌 사용자가 설정해둔 개수만큼 미리 생성해둔다
  • 쓰레드 풀은 작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리한다. 작업처리가 끝난 쓰레드는 작업큐에서 새로운 작업을 가져와 처리한다
  • 따라서 요청이 폭증해도 작업 큐에서 대가하다가 여유가 있는 스레드가 처리하므로 스레드의 개수는 일정하고 애플리케이션의 성능도 저하되지않는다.