⬛ 멀티태스킹과 멀티프로세싱
초기엔 CPU에서 하나의 프로그램을 끝내야 다음 프로그램으로 넘어갔다.
이런 불편함을 해소하기 위해 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 '멀티태스킹' 기술이 등장했다.
🟢멀티프로세싱
컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용하여 여러 작업을 동시에 처리하는 기술
CPU 안에는 실제 연산을 처리할 수 있는 코어가 있다. CPU 코어가 둘 이상이라면 어떻게될까.
🟢멀티프로세싱 vs 멀티태스킹
- 멀티프로세싱
- 하드웨어 장비의 관점
- 여러 CPU(여러 CPU 코어)를 사용하여 동시에 여러 작업을 수행하는 것을 의미
- 멀티태스킹
- 운영체제 소프트웨어의 관점
- 단일 CPU(단일 CPU 코어)가 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것을 의미
- 소프트웨어 기반으로 CPU 시간을 분할하여 각 작업에 할당한다.
⬛ 프로세스와 스레드
🟢프로세스
- 운영체제 안에서 실행중인 프로그램
- 프로그램을 실행하면 프로세스가 만들어지고 프로그램이 실행된다.
- 프로세스는 독립적인 메모리 공간을 가지고 서로 간섭하지 않는다.
🟢프로세스 메모리 구성
- 코드 섹션: 실행할 프로그램의 코드가 저장되는 부분
- 데이터 섹션: 전역 변수 및 정적 변수가 저장되는 부분(그림에서 기타에 포함)
- 힙 (Heap): 동적으로 할당되는 메모리 영역
- 스택 (Stack): 메서드(함수) 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
🟢스레드
- 프로세스 내에서 실행되는 작업의 단위
- 프로세스는 하나 이상의 스레드를 반드시 포함한다.
🟢스레드 메모리 구성
- 공유 메모리: 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
- 개별 스택: 각 스레드는 자신의 스택을 갖고 있다.
⬛ 스레드와 스케줄링
스케줄링은 CPU에 어떤 프로그램이 얼마만큼 실행될지 운영체제가 결정하는 것을 말한다.CPU 코어가 2개 이상이면 한 번에 더 많은 스레드를 물리적으로 동시에 실행할 수 있다.
⬛ 컨텍스트 스위칭
멀티스레드는 대부분 효율적이지만, 컨텍스트 스위칭 과정이 필요하므로 항상 효율적인 것은 아니다.스레드A를 멈추는 시점에 CPU에서 사용하던 이런 값들을 메모리에 저장해두어야 한다. 그리고 이후에 스레드A를 다시 실행할 때 이 값들을 CPU에 다시 불러와야 한다.이런 과정을 컨텍스트 스위칭(context switching)이라 한다.
🟢 CPU-바운드 작업이 많은가, 아니면 I/O-바운드 작업이 많은가에 따른 스레드 숫자?
- CPU-바운드 작업: CPU 코어 수 + 1개
- CPU를 거의 100% 사용하는 작업이므로 스레드를 CPU 숫자에 최적화
- I/O-바운드 작업: CPU 코어 수 보다 많은 스레드를 생성, CPU를 최대한 사용할 수 있는 숫자까지 스레드 생성
- I/O-바운드 작업시 CPU는 상대적으로 유휴(대기) 상태에 있는 경우가 많다. 즉, I/O 작업 완료를 대기한다.
- CPU를 많이 사용하지 않으므로 성능 테스트를 통해 CPU를 최대한 활용하는 숫자까지 스레드 생성
- 단 너무 많은 스레드를 생성하면 컨텍스트 스위칭 비용도 함께 증가 - 적절한 성능 테스트 필요
'Java' 카테고리의 다른 글
[Java] 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 섹션2,3 스레드 제어와 생명주기 (0) | 2024.07.28 |
---|---|
[Java의 정석] chapter13 쓰레드 thread 알아보기 (0) | 2024.07.18 |
[Java] 김영한의 실전 자바 - 중급편2 섹션10 컬렉션 프레임워크 - 순회, 정렬, 전체 정리 (0) | 2024.07.08 |
[Java] 김영한의 실전 자바 - 중급편2 섹션1 제네릭 - Generic1,Generic2 (0) | 2024.06.07 |
[Java] 김영한의 실전 자바 - 중급편 섹션10 예외처리2 - 실습 (0) | 2024.05.23 |