Java/Concurrency

Java > Concurrency > 1. Process, Thread

Krevis 2024. 8. 29. 07:45

Multi tasking

OS가 여러 개의 프로세스를 동시에(실제로는 아주 짧은 시간에 번갈아가며) 실행하는 기술

OS 소프트웨어 관점

 

OS의 스케줄링 기법을 사용하며 실행 단위는 프로세스가 아닌 쓰레드다

 

 

Multi processing

둘 이상의 프로세서(CPU core)를 사용하여 여러 작업을 동시에(실제로 ) 처리하는 기술

하드웨어 장비 관점

 

 

Process

OS로부터 자원을 할당받아 실행 중인 프로그램

 

실행 중인 프로그램의 인스턴스

 

독립적인 메모리 공간을 가지며 서로 접근 불가

 

메모리 구조

  • Code section
    • 실행할 프로그램의 코드 저장
  • Data section
    • 전역/정적 변수 저장
  • Heap(Memory)
    • 동적 할당 영역
  •  Thread
    • 모든 프로세스에는 최소 하나의 쓰레드가 존재한다
    • Stack
      • 함수 호출 시 생성되는 지역 주소와 반환 주소 저장

 

 

Thread

프로세스의 자원을 이용해 실제로 수행되는 작업의 단위

 

둘 이상의 쓰레드를 사용하면 Multi threaded process라고 한다

 

하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않지만, 쓰레드가 작업을 수행하는 데 개별적인 메모리 공간(Call stack)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성 가능한 쓰레드의 수가 결정된다

 

쓰레드들은 프로세스가 제공하는 동일한 메모리 공간을 공유한다

 

메모리 구조

  • Shared memory
    • 프로세스의 코드 섹션, 데이터 섹션, 힙은 모든 쓰레드가 공유
  • Stack
    • 각 쓰레드는 자신만의 스택을 가짐

 

프로세스보다 단순하므로 생성/관리가 단순하고 가볍다

 

 

Multi threading/threaded

하나의 프로세스에서 여러 쓰레드가 동시에 작업을 수행하는 것

 

CPU 코어가 한 번에 하나의 작업만 수행 가능하므로, 실제로 동시에 처리되는 작업의 개수는 코어 개수와 일치한다. 하지만 처리해야하는 쓰레드의 수는 보통 코어의 개수보다 많으므로 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보인다

 

OS의 프로세스 스케줄러는 실행 대기중인 쓰레드들의 우선순위를 고려하여 실행순서와 실행시간을 결정하고, 각 쓰레드들은 작성된 스케줄에 따라 자신의 순서가 되면 지정된 시간동안 작업을 수행한다. 주어진 시간동안 작업을 마치지 못한 쓰레드는 다시 자신의 차례가 돌아올 때까지 대기상태로 있게 된다

 

프로세스의 성능은 쓰레드의 개수에 늘 비례하지는 않는다

 

여러 사용자에게 서비스를 제공하는 서버 프로그램의 경우 하나의 서버 프로세스가 여러 개의 쓰레드를 생성해 쓰레드와 사용자의 요청이 1:1로 처리한다

 

여러 쓰레드가 같은 프로세스 내에서 자원을 공유하며 작업을 하기 때문에 Synchronization, Deadlock과 같은 문제들이 발생할 수 있다

 

 

프로그램이 실행된다는 것

프로그램을 실행하면 OS는 디스크에 있는 파일을 메모리에 로드해 프로세스를 만든다. 그리고 프로세스 안에 있는 코드를 한 줄씩 실행한다

 

보통 main 함수부터 시작해 하나씩 순서대로 내려가며 실행된다

 

코드를 위에서 아래로 한 줄씩 꿰어 나가듯 프로세스의 코드를 실행하는 흐름을 쓰레드라고 한다

 

Thread: 실, 실을 꿰다

 

프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고 쓰레드는 CPU를 사용해 코드를 실행한다

 

 

Main thread

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadInfoTest.java

 

프로세스가 실행되면 기본적으로 하나의 쓰레드가 생성되고, 그 쓰레드가 main 메서드를 호출한다

 

기본적으로 메인 쓰레드가 종료되면 프로그램이 종료된다. 하지만 추가 생성한 쓰레드가 종료되지 않았다면 메인 쓰레드가 종료되어도 프로그램은 종료되지 않는다. 즉 실행 중인 User 쓰레드가 하나도 없을 때 프로그램을 종료된다. main 쓰레드도 사용자 쓰레드이다

 

 

Scheduling

CPU에 어떤 프로그램이 얼마의 시간동안 실행될지를 OS가 결정하는 것

 

단순히 시간으로만 작업을 분할하지는 않고 다양한 우선순위와 최적화 기법을 사용한다

 

동작 예

  1. OS는 내부에 스케줄링 큐를 가지고 있고 쓰레드들은 큐에서 대기한다
  2. OS는 큐에서 쓰레드 A를 꺼내 CPU를 통해 실행한다
  3. OS는 쓰레드 A를 잠시 멈추고 큐에 다시 넣는다
  4. OS는 쓰레드 B를 꺼내 CPU를 통해 실행한다
  5. 이러한 과정을 반복한다

 

CPU core가 2개 이상이면 위 작업을 물리적으로 동시에 실행할 수 있다