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
프로세스가 실행되면 기본적으로 하나의 쓰레드가 생성되고, 그 쓰레드가 main 메서드를 호출한다
기본적으로 메인 쓰레드가 종료되면 프로그램이 종료된다. 하지만 추가 생성한 쓰레드가 종료되지 않았다면 메인 쓰레드가 종료되어도 프로그램은 종료되지 않는다. 즉 실행 중인 User 쓰레드가 하나도 없을 때 프로그램을 종료된다. main 쓰레드도 사용자 쓰레드이다
Scheduling
CPU에 어떤 프로그램이 얼마의 시간동안 실행될지를 OS가 결정하는 것
단순히 시간으로만 작업을 분할하지는 않고 다양한 우선순위와 최적화 기법을 사용한다
동작 예
- OS는 내부에 스케줄링 큐를 가지고 있고 쓰레드들은 큐에서 대기한다
- OS는 큐에서 쓰레드 A를 꺼내 CPU를 통해 실행한다
- OS는 쓰레드 A를 잠시 멈추고 큐에 다시 넣는다
- OS는 쓰레드 B를 꺼내 CPU를 통해 실행한다
- 이러한 과정을 반복한다
CPU core가 2개 이상이면 위 작업을 물리적으로 동시에 실행할 수 있다
'Java > Concurrency' 카테고리의 다른 글
| Java > Concurrency > Thread scheduling (0) | 2024.09.03 |
|---|---|
| Java > Concurrency > 4. Thread methods (0) | 2024.08.30 |
| Java > Concurrency > 5. Daemon thread (0) | 2024.08.29 |
| Java > Concurrency > Context switching (0) | 2024.08.29 |
| Java > Concurrency > 2. Thread 생성, 실행 (0) | 2024.08.23 |