멀티 태스킹 / 멀티 프로세싱
- 프로그램 실행 - 프로그램을 구성하는 코드를 순서대로 CPU에서 연산(실행)하는 일
- 멀티태스킹(Multi Tasking) : 하나의 컴퓨터 시스템이 (하나의 CPU 코어로) 동시에 여러 작업을 수행하는 능력
- 시분할(Time Sharing, 시간 공유) 기법 : 여러 프로그램의 실행 시간을 분할해서 동시에 실행되는 것처럼 하는 기법
- 시분할 기법을 사용하면 CPU 코어가 하나만 있어도 여러 프로그램이 동시에 실행되는 것처럼 느낄 수 있다.
- 운영 체제마다 다르지만 대략 0.01초 단위로 돌아가면서 실행한다.(CPU는 초당 수십억 번 이상의 연산을 수행)
스케줄링(Scheduling) : CPU에 어떤 프로그램이 얼마만큼 실행되는지 운영체제가 결정하는 것
시간만으로 작업을 분할하지 않고 다양한 우선순위와 최적화 기법을 사용한다.
운영체제가 스케줄링을 수행하고 CPU를 최대한 활용해 작업이 골고루 수행될 수 있게 최적화한다.
- 멀티 프로세싱(Multi Processing) : 하나의 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용해 여러 작업을 동시에 처리하는 능력
- 멀티 프로세싱 vs 멀티 태스킹
- 멀티 프로세싱
- 하드웨어 장비의 관점으로 하드웨어 기반으로 성능을 향상시킨다.
- 여러 CPU를 사용하여 동시에 여러 작업을 수행하는 것
- 멀티 태스킹
- 운영체제 소프트웨어의 관점으로 소프트웨어 기반으로 CPU 시간을 분할해 각 작업에 할당한다.
- 단일 CPU가 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것
- 멀티 프로세싱
프로세스 / 스레드
- 프로세스(Process) : 운영체제 안에서 실행중인 프로그램을 의미한다.
- 자바에 비유하면 클래스는 프로그램, 인스턴스는 프로세스와 같다.
- 각 프로세스는 독립적인 메모리 공간을 갖으며, 운영체제에서 별도의 작업 단위로 분리해서 관리한다.
- 프로세스끼리는 서로 간섭하고 접근할 수 없기에 서로에게 영향을 미치지 못한다.
- 프로세스는 하나 이상의 스레드를 반드시 포함한다.
- 프로세스의 메모리 구성
- 코드 섹션 : 실행할 프로그램의 코드가 저장되는 부분
- 데이터 섹션 : 전역 변수 / 정적 변수가 저장되는 부분 (그림에서는 기타에 해당)
- 힙(Heap) : 동적으로 할당되는 메모리 영역
- 스택(Stack) : 메소드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역 (그림에서 스레드에 포함)
- 스레드 : 프로세스 내에서 실행되는 작업의 단위
- 프로세스의 코드를 실행하는 흐름을 의미한다.
- 한 프로세스 내에 여러 스레드가 존재할 수 있으며 프로세스가 제공하는 동일한 메모리 공간을 공유한다.
- 프로세스보다 생성 및 관리가 단순하고 가볍다.
- 스레드의 메모리 구성
- 공유 메모리 : 같은 프로세스의 코드 섹션, 데이터 섹션, 힙은 프로세스 안 모든 스레드가 공유한다.
- 개별 스택 : 각 스레드는 자신의 스택을 가지고 있다.
- 단일 스레드 : 한 프로세스 내에 하나의 스레드만 존재
- 멀티 스레드 : 한 프로세스 내에 여러 스레드가 존재
- 프로그램이 실행 과정
- 운영체제에 의해 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러와 프로세스를 만든다.
- 프로세스 안에 있는 코드가 한 줄씩 실행된다.
- 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할
스레드는 CPU를 사용해서 코드를 하나하나 실행하는 역할
- 멀티 스레드가 필요한 이유?
- 하나의 프로그램도 안에서 동시에 여러 작업을 수행해야 한다.
ex) 워드 프로그램 - 문서 편집, 문서 자동 저장, 맞춤법 검사 ...
- 하나의 프로그램도 안에서 동시에 여러 작업을 수행해야 한다.
- 멀티 프로세스 및 멀티 스레드 예시
- ex) 프로세스 1 - 워드 프로그램
- 스레드 1 - 문서 편집
- 스레드 2 - 문서 자동 저장
- 스레드 3 - 맞춤법 검사
- 프로세스 2 - 유튜브
- 스레드 1 - 유튜브 영상 재생
- 스레드 2 - 댓글
- ex) 프로세스 1 - 워드 프로그램
- 운영체제 내부에는 스케줄링 큐를 가지고 있다.
- 스케줄링 큐 : 어떤 순서대로 스레드를 번갈아 실행할지 관리하는 큐를 의미한다.
- 용어 정리
- 멀티 태스킹 - 동시에 여러 작업을 수행하는 것으로 이를 위해 운영체제는 스케줄링이라는 기법을 사용한다.
- 스케줄링 - CPU 시간을 여러 작업에 나눠 배분하는 방법
- 프로세스 - 실행 중인 프로그램의 인스턴스로 프로세스마다 독립적인 메모리 공간을 갖고 운영체제에서 독립적 실행 단위로 취급되며 실행 환경을 제공함으로 컨테이너 역할을 하며 스케줄러에 의해 직접 실행되지는 않는다.
- 스레드 - 프로세스 내에서 실행되는 작은 단위, 여러 스레드는 하나의 프로세스 내에서 자원을 공유하며 실제로 CPU에 의해 실행되는 단위
- 프로세서 - CPU를 의미한다.
컨텍스트 스위칭
- 컨텍스트 스위칭 : CPU에서 실행 중이던 프로세스 / 스레드가 다른 프로세스 / 스레드로 교체되는 것.
- 현재 작업하는 문맥이 변하기 때문에 컨텍스트 스위칭이라고 한다.
- 여러 스레드를 번갈아 수행할 때 이전에 실행 중이던 값을 메모리에 저장하고, 이후에 다시 실행할 때 저장한 값을 CPU에 다시 불러와야 한다.
- 멀티 스레드는 대부분 효율적이지만 컨텍스트 과정이 필요하므로 항상 효율적인 것은 아니다.
- 컨텍스트 스위칭 과정에서 비용(시간)이 발생하기 때문
- ex) CPU 코어가 한 개에 스레드를 2개로 만들어 연산을 한다고 가정
1 ~ 10,000까지의 합을 구한다면 스레드 A에서는 1 ~ 5,000까지 B에서는 5,001 ~ 10,000까지 연산을 수행
이때 A에서 1 ~ 1,000까지 수행하고 멈추고 B에서 5,001 ~ 6,000 까지 수행하고 멈추고를 반복하다 보면 반복할 때마다 컨텍스트 스위칭 비용(시간)이 발생한다.
스레드 1개로 수행한다면 연산 수행 시간만 소요됐을텐데 2개로 수행하면서 연산 수행 시간 + 컨텍스트 스위칭 시간이 소요되어 더 비효율적이게 되버리는 경우도 생길 수 있다.
- 스레드와 CPU의 관계
- ex) CPU - 4개, 스레드 - 2개
스레드가 CPU에 비해 너무 적으면 모든 CPU를 100% 다 활용할 수 없지만 컨텍스트 스위칭 비용이 줄어든다. - ex) CPU - 4개, 스레드 - 100개
스레드가 CPU에 비해 너무 많으면 모든 CPU를 100% 다 활용할 수 있지만 컨텍스트 스위칭 비용이 늘어난다. - ex) CPU - 4개, 스레드 4개
스레드와 CPU 숫자를 맞춘다면 CPU를 100% 활용할 수 있고, 컨텍스트 스위칭 비용도 자주 발생하지 않기에 최적의 상태가 된다. 이상적으로는 CPU 코어 수 + 1개 정도로 스레드의 수를 맞추면 특정 스레드가 잠시 대기하는 동안 남은 스레드를 활용할 수 있게 된다.
- ex) CPU - 4개, 스레드 - 2개
- CPU 바운드 작업 vs I/O 바운드 작업
- CPU 바운드 작업(CPU-bound tasks)
- CPU의 연산 능력을 많이 요구하는 작업을 의미하며 계산, 데이터 처리, 알고리즘 실행 작업 등이 있으며 CPU 처리 속도가 작업 완료 시간을 결정하는 경우이다.
- I/O 바운드 작업 (I/O-bound tasks)
- 디스크, 네트워크, 파일 시스템 등 입출력 작업을 많이 요구하는 작업을 의미하며 I/O 작업이 완료될 때까지 대기 시간이 많이 발생하고 CPU가 유휴(대기) 상태에 있는 경우가 많다.
이런 경우 스레드가 CPU를 사용하지 않고 I/O 작업이 완료될 때까지 대기한다.
- 디스크, 네트워크, 파일 시스템 등 입출력 작업을 많이 요구하는 작업을 의미하며 I/O 작업이 완료될 때까지 대기 시간이 많이 발생하고 CPU가 유휴(대기) 상태에 있는 경우가 많다.
- 스레드의 숫자는 CPU 바운드 작업이 많은가, I/O 작업이 많은가에 따라 다르게 설정한다.
- CPU 바운드 작업 - CPU 코어 수 + 1개로 스레드 수를 지정
- I/O 바운드 작업 - CPU 코어 수 보다 많은 스레드 수를 지정
- CPU 바운드 작업(CPU-bound tasks)
출처 : [인프런 김영한 실전 자바 - 고급편]
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런
김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?
www.inflearn.com
'Java > [인프런 김영한 실전 자바 - 고급편]' 카테고리의 다른 글
[인프런 김영한 실전 자바 - 고급편] concurrent.Lock (0) | 2024.08.02 |
---|---|
[인프런 김영한 실전 자바 - 고급편] 동기화 - synchronized (0) | 2024.08.02 |
[인프런 김영한 실전 자바 - 고급편] 메모리 가시성 (0) | 2024.08.02 |
[인프런 김영한 실전 자바 - 고급편] 스레드 제어와 생명 주기 1, 2 (1) | 2024.08.02 |
[인프런 김영한 실전 자바 - 고급편] 스레드 생성과 실행 (1) | 2024.07.30 |