멀티테스킹
멀티태스킹이란 뭘까요?
페이커 선수가 여러 게임을 플레이 하는 것 처럼 보이지만 실제 CPU는 한번에 한 작업 밖에 하지 못합니다.
실행이 너무 빠르기 때문에 눈으로 봤을땐 마치 동시에 실행 되는 것 처럼 보이는데요
이렇게 컴퓨터 시스템이 동시에 여러 작업을 수행 하는 능력을 멀티태스킹 이라고 합니다.
프로세스
- 프로그램이 실행 되기전 까진 단순한 파일에 불과 합니다.
- 운영체제 안에서 실행중인 프로그램을 프로세스라고 합니다.
- 프로세스는 실행 중인 프로그램의 인스턴스 입니다.
프로세스는 독립적인 메모리 공간을 가지고 있습니다.
따라서 프로세스는 자신의 메모리 공간만을 참조 하며 다른 프로세스는 간섭 하지 않습니다.
즉. 프로세스가 작동이 중단 되어도 다른 프로세스에 영향을 주지 않습니다.
스레드
스레드는 프로세스의 작업의 단위 입니다.
하나의 프로세스는 여러 스레드가 존재 가능 하며 프로세스의 메모리를 공유 합니다.
또는 코드를 한줄씩 읽으며 실행 하는 흐름을 스레드 라고 합니다.
(자바 main 스레드가 코드를 한줄씩 읽으며 실행 합니다.)
하나의 프로세스 내에서도 여러 작업이 동시에 필요 할 수 있기 때문에 멀티 스레드가 필요합니다.
그렇다면 이 코드는 어떻게 실행 되는걸까요?
바로 CPU를 활용해 스레드가 코드를 실행 하는 것 입니다.
운영 체제는 내부에 스케줄링 큐를 가지고 있습니다.
스케줄링 큐는 실행 가능한 스레드들이 줄을 서 있다고 이해 하시면 됩니다.
참고로 CPU가 프로세스를 얼마만큼 실행 할지는 운영체제가 결정 합니다. 이것을 스케줄링 이라고 합니다
CPU는 코어는 하나의 작업만 할수 있습니다. 스레드 1번이 수행 됩니다.
멀티테스킹을 위해 잠시 스레드 1번을 수행 하고 다시 스케줄링 큐에 돌려 줍니다.
스레드 3번이 선택 되었습니다.
스레드 3번 코드를 CPU를 통해서 실행 합니다. 이런 과정을 계속 반복 합니다.
만약 CPU 코어가 여러개 라면 위와 같은 그림으로 실행 됩니다.
글을 읽다 보면 궁금 한점이 생길 수 있는데 코드의 일부만 실행 하고 다시 스레드를 CPU에 올려서 사용 한다면
"어느 부분 부터 실행 할지 어떻게 알 수 있을까?" 라는 물음이 생깁니다.
CPU는 스레드의 코드가 어디 까지 수행 되었는지 메모리에 저장 해두고
다시 스레드를 실행 할 때 이 값들을 CPU로 불러 옵니다.
이런 과정을 컨텍스트 스위칭(context switching) 이라고 합니다.
그렇다면 컨텍스트 스위칭이 덜 발생하게 CPU 수와 스레드 수를 동일 하게 하면 되나요?
이에 대해선 스레드 작업을 알 필요가 있습니다.
스레드의 작업은 2가지로 분류 할 수 있습니다.
1. CPU 바운드 작업
- CPU 연산을 많이 요구 하는 작업입니다.
- 알고리즘, 수학 연산, 비디오 인코딩 등이 포함 됩니다.
2. I/O 바운드 작업
- 네트워크, 파일 시스템과 같이 I/O 작업이 많이 필요한 작업을 의미 합니다.
- 데이터베이스 쿼리 처리, 파일 읽기/쓰기, 네트워크 통신 등이 포함 됩니다.
웹 어플리케이션의 경우 CPU 바운드 작업보다 I/O 바운드 작업이 많습니다.
한 사용자 요청은 1개의 스레드가 필요 하며, 만약 3코어 3스레드 라면 3명의 요청 밖에 받지 못합니다.
I/O 바운드 작업은 CPU 소모가 적기 때문에 CPU를 잘 활용 하고 있는 것이 아니게 됩니다.
CPU 바운드 작업이 많다면 CPU 코어 수 + 1개
I/O 바운드 작업이 많다면 CPU를 활용 가능한 수 까지 스레드를 늘립니다.
물론 컨텍스트 스위칭 비용도 발생 하기 때문에 적절한 테스트가 필요 합니다.
위 글을 김영한 선생님 실전 자바 고급 1편을 보고 요약 한 것입니다.
자세한 내용이 궁금 하시다면 강의를 추천 드려요!
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런
김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?
www.inflearn.com
'Java' 카테고리의 다른 글
[Java] LockSupprot, ReentrantLock (1) | 2024.11.19 |
---|---|
[Java] 메모리 가시성, 임계 영역 (4) | 2024.11.15 |
[Java] Join, Interrupt, Yield (0) | 2024.11.12 |
[Java] 스레드의 생성과 생명주기 (0) | 2024.11.10 |
[자바의 정석] 람다 (1) | 2023.10.30 |