🥕 사전 배경 지식
1. 프로그램
2. 프로세스
- 컴퓨터에서 실행 중인 프로그램
- 각각의 프로세스는 독립된 메모리 공간을 할당 받음
- 명령어들과 데이터를 가진 집합
3. CPU
4. 메인 메모리
- 프로세스가 CPU에서 실행되기 위해 대기하는 곳
- 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것
- 입출력 장치와 데이터를 주거나 받는 것
🥕 단일 프로세스 시스템
의미
단점
- CPU 사용률이 좋지 않음
- P1이라는 것이 CPU에서 작업을 하다가 I/O 작업을 하는 동안에는 CPU가 놀고 있음
🥕 멀티 프로그래밍의 등장과 특징
단일 프로세스의 해결책
- 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자!
- I/O작업이 발생하면 다른 프로세스가 CPU에서 실행
멀티프로그래밍 예시
멀티프로그래밍의 목적
멀티프로그래밍의 단점
- CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기
🥕 멀티태스킹의 등장
멀티프로그래밍의 단점 해결책
- 프로세스는 한번 CPU를 사용할 때
아주 짧은 시간(=quantum)
만 CPU에서 실행되도록 하자
멀티태스킹(multitasking) 예시
- 짧은 시간 = 밀리세컨드 시간까지 짦게 구분
- 타임 슬랏 시간 안에서만 각 프로세스들이 최대한 CPU 사용
- 프로세스들이 번갈아가면서[교대로] 사용하면서 마치 어떤 프로그램을 실행시키거나 동작 했을 때 즉각 즉각 반응을 받을 수 있도록 해서 동시에 여러 프로그램이 실행되는 것 같은 느낌을 주는 것
멀티태스킹의 목적
- 프로세스의
응답 시간을 최소화
시키는데 목적
- 응답 시간을 최소화 했다는 것은 사용자 입장에서는 여러 프로그램들이 동시에 실행되는 것처럼 느껴짐
- 아주 짧은 시간 안에서 여러 프로세스들이 교대로 실행되면서 즉각적인 응답을 줘서 동시에 여러 프로그램이 실행되는 느낌을 주는 것
아쉬움
- 하나의 프로세스가 동시에 여러 작업을 수행하지는 못함
- 프로세스의
컨텍스트 스위칭
은 무거움
컨텍스트 스위칭
이란 cpu 실행되기 위해 어느 한 프로세스에서 다른 프로세스로 교체되는 것
- 프로세스끼리 데이터 공유가 까다로움
- 프로세스는 독립된 메모리 공간을 가짐
- 서로 공유되지 않는 독립된 공간
듀얼 코어
가 등장했는데 잘 쓰고 싶음
- 한 cpu 안에 두 개의 코어를 둬서 전체적인 성능 향상을 노림
- 2000년 초반에 등장
🥕 스레드
멀티태스킹의 해결책 : 스레드(thread)의 특징
- 프로세스는 한 개 이상의 스레드 가질 수 있다.
- 한 프로세스 안에서 여러 개의 작업을 동시에 실행하기 위해 이 여러 개의 하나하나를 맡아 줄 것이 필요한데 그것이 스레드
- CPU에서 실행되는 단위(unit of execution)
- 예전에는 프로세스가 cpu에서 실행되는 단위였다면… 지금은 스레드가 cpu가 실행되는 단위
같은 프로세스의 스레드들끼리
컨텍스트 스위칭은 가볍다.
- 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유
- 그렇기 때문에 3번인 컨텍스트 스위칭이 가볍고
- 두 번째로는 같은 프로세스 안의 스레드들끼리는 데이터 공유가 쉽다.
메모리 구조 비교(싱글 스레드 vs 멀티 스레드)
💡 파란색과 녹색은 스레드들이 속한 메모리 영역
싱글 스레드
- 싱글 스레드를 가지는 프로세스
- 스레드가 나오기 전에 프로세스만의 메모리 구조
멀티 스레드
같은 프로세스를 가진 스레드들은 같은 메모리 공간을 공유하되, 스레드들 만의 고유한 영역도 있다.
- 스레드가 등장하고 난 뒤 메모리 구조
힙 메모리 영역
을 공유
- 자신의 고유한 영역이 바로
스택
- 각각의 스레드마다 프로그램 카운터들이 따로 있음
- 프로그램 카운터 : 다음번에 실행돼야 할 명령어가 있는 메모리 주소를 가짐
스레드 예시
- cpu인데 코어가 2개인 cpu는 병렬적으로 스레드가 실행
🥕 멀티스레딩
개념
- 위에서 예시든 코어가 두 개일 때 동작하는 방식
- 하나의 프로세스가 동시에 여러 작업[스레드]을 실행하는데 목적
확장된 멀티태스킹 개념
- 여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 cpu time을 나눠 갖는 것
🥕 멀티 프로세싱(multiprocessing)
- 두 개 이상의 프로세서나 코어를 활용하는 시스템
🥕 예제
싱글코어 cpu에 싱글-스레드 프로세스 두 개
- cpu가 1개이기 때문에 멀티 프로세싱이 아니다.
- 싱글 스레드라서 멀티 스레딩이 아니다.
- 1개의 cpu를 두 개의 프로세스가 나눠써야 해서 멀티 태스킹은 맞다
싱글코어 CPU에 듀얼-스레드 프로세스 한 개
- 1개의 CPU를 두 개의 스레드가 나눠써야 하기에 멀티태스킹은 맞다.
- 듀얼 스레드랑 멀티 스레딩 맞다.
- 1개의 CPU라 멀티 프로세싱은 아니다.
듀얼 코어 CPU에 싱글 스레드 프로세스 두 개
- 코어가 두 개라 코어 하나 하나가 하는 것이라 멀티태스킹은 아니다.
- 싱글 스레드라 멀티스레딩은 아니다.
- 코어가 두 개라서 멀티 프로세싱은 맞음
듀얼코어 CPU에 듀얼-스레드 프로세스 한 개
- 각 코어 별로 경합하는 게 없음 멀티태스킹 아님
- 듀얼 스레드기 때문에 멀티 스레딩은 맞음
- 코어가 2개 이기 때문에 멀티 프로세싱도 맞음
듀얼코어 CPU에 듀얼-스레드프로세스 두 개
- 코어마다 경합을 하기 떄문에 멀티태스킹이 맞음
- 듀얼 스레드라 멀티 스레딩 맞음
- 두 개의 코어라 멀티프로세싱도 맞다.
🥕 스레드를 많이 쓸수록 항상 성능이 좋아질까..?
멀티스레딩 환경에서 쓰는 것을 말함
- 당장 보통 드는 생각은 스레드를 많이 쓰면 쓸수록 동시에 처리할 수 있는 프로그램 수도 늘어나니 애플리케이션의 성능이 전체적으로 좋아질 것 같다라고 생각할 수 있음
- 그러나, 여기에 전제가 깔림
- 전제 : 해당 어플리케이션은
더 작은 작업들로 잘게 쪼개서 동시에 실행이 가능한 성격
의 애플리케이션
순차적 애플리케이션
순차적
으로 실행되어야 하는 애플리케이션이라면.. 그래서 잘게 쪼개서 동시에 실행하기 매우 어려운 성격의 애플리케이션이라면 스레드를 많이 쓰려고 해도 실제 사용할 수 있는 스레드 수는 제한이 생김
- 코어에서 실행되던 스레드가 다른 스레드로 바뀔 때마다,
context switching
을 하는데, 이런 스위칭 작업도 CPU 코어에서 실행되게 되는 작업
- 즉, 코어에서
스위칭 작업
을 처리하는 동안에는 애플리케이션 코드가 실행되지 않음
overhead
: 이때, 스위칭 작업을 위해 소비되는 CPU time은 애플리케이션과 직접적인 관련은 없지만 멀티스레딩으로 동작하기 위해 필요하기 때문에 간접 방식이라고 부름
- 위의 지식을 바탕으로 CPU의 코어 수는 고정되어 있는데 스레드 수를 계속 늘리게 되면 한 코어에서 경합해야하는 스레드의 수는 더 늘어나기 때문에 OVERHead도 많아짐 ⇒ 한계
CPU bound, I/O bound 관점
CPU bound 애플리케이션
- cpu를 많이 쓰기 떄문에 코어 수와 비슷한 수준 이상으로 스레드 수를 늘려봤자 이점이 없다.
- 오히려 각 코어에서 경합하는 스레드 수가 많아질 수
록 context switching 때문에 overhead만 더 많아져서 성능에 안 좋은 영향
I/O bound 애플리케이션
- I/O 작업이 많기 때문에 CPU가 놀고 있는 시간이 많다.
- 코어 수보다 두~세배 늘려주는 것이 overhead가 늘긴 해도 코어들을 좀 더 효율적으로 사용 가능하기에 성능 이점이 있음
- 물론 너무 많이 늘리면 안좋음