✅ 멀티태스킹
초창기의 컴퓨터는 하나의 CPU 코어로 한 번에 하나의 프로그램만 실행이 가능했음
이를 해결하기 위해서 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 멀티태스킹
기술이 등장
현대의 CPU는 초당 수십억 번 이상의 연산을 수행함
CPU 가 빠르게 두 프로그램의 코드를 번갈아 수행하면 두 프로그램이 동시에 실행되는 것처럼 느껴짐
이렇게 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력을 멀티태스킹
이라고 한다
스케줄링
임✅ 멀티프로세싱
과거에는 하나의 CPU
안에 하나의 코어
만 들어있어서 따로 용어의 차이를 두지 않았음
하지만 최근에는 하나의 CPU
안에 보통 2개 이상의 코어
가 들어있음
코어
가 2개이상인것은 1개인 것보다 처리 속도가 빠름
멀티프로세싱
은 컴퓨터 시스템에서 두개 이상의 코어
를 사용하여 여러 작업을 동시에 처리하는 기술임
✅ 멀티프로세싱 vs 멀티태스킹
멀티프로세싱
은 하드웨어 장비의 관점 (여러 CPU 코어)
으로 보면 된다
하드웨어 기반으로 성능을 향상시키는 것
멀티태스킹
은 소프트웨어의 관점으로 CPU 시간을 분할하여 각 작업에 할당하는 것
단일 CPU 코어로 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것
위의 예시는 여러 CPU 코어를 사용하면서 각각의 단일 코어에 여러 작업을 분할하여 수행하기 때문에멀티프로세싱
이면서멀티태스킹
이라고 한다.
운영체제
안에는프로세스
가 있고프로세스
안에는스레드
가 존재한다
✅ 프로세스
프로세스
라고 한다프로세스
가 만들어지고 프로그램이 실행된다프로세스
프로세스
는 실행중인 프로그램의 인스턴스이다✅ 프로세스의 메모리 구성
코드 섹션
: 실행할 프로그램의 코드가 저장되는 부분데이터 섹션
: 전역 변수 및 정적 변수가 저장되는 부분 (그림에서 기타로 표현)힙
: 동적으로 할당되는 메모리 영역스택
: 메서드 호출시 생성되는 지역 변수와 반환 주소가 저장되는 영역 (스레드에 포함)✅ 스레드
스레드
를 반드시 포함한다 -> 코드를 실행시키기 위해 (프로그램 실행)단일 스레드
: 한 프로세스 내에 하나의 스레드만 존재멀티 스레드
: 한 프로세스 내에 여러 스레드가 존재스레드
는 프로세스 보다 생성 및 관리가 단순하고 가벼움✅ 스레드의 메모리 구성
공유메모리
: 프로세스의 모든 스레드는 위 그림의 초록색 부분(코드, 데이터, 힙) 을 공유개별 스택
: 각 스레드는 자신의 스택을 가지고 있음프로그램이 실행된다는 의미?
(1) : 운영체제가 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만듬
(2) : 프로세스 안에 있는 코드가 한줄씩 실행되는 것임 (main 문에서 한줄씩 아래로 절차지향적)
✅ 프로세스 vs 스레드
프로세스
: 실행 환경과 자원을 제공하는 컨테이너 역할을 함
스레드
: CPU를 사용해서 코드를 하나하나 실행
✅ 멀티스레드가 필요한 이유
단일 스레드로 충분할 거 같은데 멀티스레드
가 필요한 이유가 무엇일 까?
하나의 프로그램 내에서도 동시에 여러 작업이 필요함
EX) 유튜브 영상을 시청하는 동안 댓글을 달려면 이러한 작업이 필요함
✅ 컨텍스트 스위칭
CPU 코어가 1개일 때 가정하고
스레드 1, 2 가 존재할 때 멀티태스킹 작업을 하면
스레드 1 작업을 하다가 잠시 멈추고 스레드 2 작업을 진행한다
하지만 멈춘 스레드 1 작업을 하던 것을 메모리에 저장을 해두어야 한다
이후에 다시 스레드 1 작업을 진행할 때 저장해둔 값들을 CPU에 다시 불러와야한다
이러한 과정을 컨텍스트 스위칭
이라고 하며 이 과정에서 약간의 비용이 발생한다
컨텍스트 스위칭
: 멀티스레드
에서 한 스레드 작업을 멈추고 다른 스레드 작업을 진행할 때 하는 것
쉽게 말해서 사람이 빨래를 돌려놓고 분리수거를 하러 가면 까먹을 수도 있다
그러한 사태를 막기 위해서 저장을 해두는 것이다
✅ 멀티스레드
는 대부분 효율적이지만, 컨텍스트 스위칭
과정이 있어서 항상 효율적인 것은 아니다
스레드 A : 1~5000까지 더하는 작업
스레드 B : 5001 ~10000까지 더하는 작업
CPU가 코어 수가 2개가 있으면 스레드 A와 스레드 B로 나누어 병렬처리하면 효율적이다
하지만 아래에서 보여줄 예시는 CPU가 한개일 때 가정하겠다
CPU 코어수가 한개고 스레드가 2개일 때 각 작업을 진행할 때 마다
다른 스레드로 갈 때, 컨텍스트 스위칭
과정을 진행한다
결과적으로 연산시간 + 컨텍스트 스위칭 시간 이다
예시는 값을 작게 설정했지만, 값이 커지고 스레드가 많아질수록 컨텍스트 스위칭
비용이 커진다
이러면 차라리 단일 스레드
로 컨텍스트 스위칭
없이 1 ~ 10000까지 더하는 것이 더 효율적이다
CPU의 코어 수 보다 많은 스레드를 만드는 것이 좋으며, 성능 테스트를 통해서
CPU를 최대한 사용할 수 있는 숫자까지 스레드를 생성해주는것이 좋다