프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍과 스레드를 많이 쓸수록 항상 성능이 좋을까..?

GoldenDusk·2023년 8월 21일
0

CS지식

목록 보기
8/26
post-thumbnail

🥕 사전 배경 지식

1. 프로그램

  • 컴퓨터가 실행할 수 있는 명령어들의 집합

2. 프로세스

  • 컴퓨터에서 실행 중인 프로그램
  • 각각의 프로세스는 독립된 메모리 공간을 할당 받음
  • 명령어들과 데이터를 가진 집합

3. CPU

  • 명령어를 실행하는 연산 장치

4. 메인 메모리

  • 프로세스가 CPU에서 실행되기 위해 대기하는 곳

5. IO(input/output)

  • 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것
  • 입출력 장치와 데이터를 주거나 받는 것

🥕 단일 프로세스 시스템

의미

  • 한 번에 하나의 프로그램만 실행

단점

  • CPU 사용률이 좋지 않음
  • P1이라는 것이 CPU에서 작업을 하다가 I/O 작업을 하는 동안에는 CPU가 놀고 있음

🥕 멀티 프로그래밍의 등장과 특징

단일 프로세스의 해결책

  • 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자!
  • I/O작업이 발생하면 다른 프로세스가 CPU에서 실행

멀티프로그래밍 예시

멀티프로그래밍의 목적

  • CPU 사용률을 극대화시키는데 목적

멀티프로그래밍의 단점

  • CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기

🥕 멀티태스킹의 등장

멀티프로그래밍의 단점 해결책

  • 프로세스는 한번 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하자

멀티태스킹(multitasking) 예시

  • 짧은 시간 = 밀리세컨드 시간까지 짦게 구분
  • 타임 슬랏 시간 안에서만 각 프로세스들이 최대한 CPU 사용
  • 프로세스들이 번갈아가면서[교대로] 사용하면서 마치 어떤 프로그램을 실행시키거나 동작 했을 때 즉각 즉각 반응을 받을 수 있도록 해서 동시에 여러 프로그램이 실행되는 것 같은 느낌을 주는 것

멀티태스킹의 목적

  • 프로세스의 응답 시간을 최소화 시키는데 목적
  • 응답 시간을 최소화 했다는 것은 사용자 입장에서는 여러 프로그램들이 동시에 실행되는 것처럼 느껴짐
  • 아주 짧은 시간 안에서 여러 프로세스들이 교대로 실행되면서 즉각적인 응답을 줘서 동시에 여러 프로그램이 실행되는 느낌을 주는 것

아쉬움

  1. 하나의 프로세스가 동시에 여러 작업을 수행하지는 못함
  2. 프로세스의 컨텍스트 스위칭은 무거움
  • 컨텍스트 스위칭이란 cpu 실행되기 위해 어느 한 프로세스에서 다른 프로세스로 교체되는 것
  1. 프로세스끼리 데이터 공유가 까다로움
    1. 프로세스는 독립된 메모리 공간을 가짐
    2. 서로 공유되지 않는 독립된 공간
  2. 듀얼 코어가 등장했는데 잘 쓰고 싶음
    1. 한 cpu 안에 두 개의 코어를 둬서 전체적인 성능 향상을 노림
    2. 2000년 초반에 등장

🥕 스레드

멀티태스킹의 해결책 : 스레드(thread)의 특징

  1. 프로세스는 한 개 이상의 스레드 가질 수 있다.
    1. 한 프로세스 안에서 여러 개의 작업을 동시에 실행하기 위해 이 여러 개의 하나하나를 맡아 줄 것이 필요한데 그것이 스레드
  2. CPU에서 실행되는 단위(unit of execution)
    1. 예전에는 프로세스가 cpu에서 실행되는 단위였다면… 지금은 스레드가 cpu가 실행되는 단위
  3. 같은 프로세스의 스레드들끼리 컨텍스트 스위칭은 가볍다.
  4. 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유
    1. 그렇기 때문에 3번인 컨텍스트 스위칭이 가볍고
    2. 두 번째로는 같은 프로세스 안의 스레드들끼리는 데이터 공유가 쉽다.

메모리 구조 비교(싱글 스레드 vs 멀티 스레드)

💡 파란색과 녹색은 스레드들이 속한 메모리 영역

싱글 스레드

  1. 싱글 스레드를 가지는 프로세스
  2. 스레드가 나오기 전에 프로세스만의 메모리 구조

멀티 스레드

같은 프로세스를 가진 스레드들은 같은 메모리 공간을 공유하되, 스레드들 만의 고유한 영역도 있다.

  • 스레드가 등장하고 난 뒤 메모리 구조
  • 힙 메모리 영역을 공유
  • 자신의 고유한 영역이 바로 스택
  • 각각의 스레드마다 프로그램 카운터들이 따로 있음
    • 프로그램 카운터 : 다음번에 실행돼야 할 명령어가 있는 메모리 주소를 가짐

스레드 예시

  • cpu인데 코어가 2개인 cpu는 병렬적으로 스레드가 실행

🥕 멀티스레딩

개념

  • 위에서 예시든 코어가 두 개일 때 동작하는 방식
  • 하나의 프로세스가 동시에 여러 작업[스레드]을 실행하는데 목적

확장된 멀티태스킹 개념

  • 여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 cpu time을 나눠 갖는 것

🥕 멀티 프로세싱(multiprocessing)

  • 두 개 이상의 프로세서나 코어를 활용하는 시스템

🥕 예제

싱글코어 cpu에 싱글-스레드 프로세스 두 개

  1. cpu가 1개이기 때문에 멀티 프로세싱이 아니다.
  2. 싱글 스레드라서 멀티 스레딩이 아니다.
  3. 1개의 cpu를 두 개의 프로세스가 나눠써야 해서 멀티 태스킹은 맞다

싱글코어 CPU에 듀얼-스레드 프로세스 한 개

  1. 1개의 CPU를 두 개의 스레드가 나눠써야 하기에 멀티태스킹은 맞다.
  2. 듀얼 스레드랑 멀티 스레딩 맞다.
  3. 1개의 CPU라 멀티 프로세싱은 아니다.

듀얼 코어 CPU에 싱글 스레드 프로세스 두 개

  1. 코어가 두 개라 코어 하나 하나가 하는 것이라 멀티태스킹은 아니다.
  2. 싱글 스레드라 멀티스레딩은 아니다.
  3. 코어가 두 개라서 멀티 프로세싱은 맞음

듀얼코어 CPU에 듀얼-스레드 프로세스 한 개

  1. 각 코어 별로 경합하는 게 없음 멀티태스킹 아님
  2. 듀얼 스레드기 때문에 멀티 스레딩은 맞음
  3. 코어가 2개 이기 때문에 멀티 프로세싱도 맞음

듀얼코어 CPU에 듀얼-스레드프로세스 두 개

  1. 코어마다 경합을 하기 떄문에 멀티태스킹이 맞음
  2. 듀얼 스레드라 멀티 스레딩 맞음
  3. 두 개의 코어라 멀티프로세싱도 맞다.

🥕 스레드를 많이 쓸수록 항상 성능이 좋아질까..?

멀티스레딩 환경에서 쓰는 것을 말함

  1. 당장 보통 드는 생각은 스레드를 많이 쓰면 쓸수록 동시에 처리할 수 있는 프로그램 수도 늘어나니 애플리케이션의 성능이 전체적으로 좋아질 것 같다라고 생각할 수 있음
  2. 그러나, 여기에 전제가 깔림
  3. 전제 : 해당 어플리케이션은 더 작은 작업들로 잘게 쪼개서 동시에 실행이 가능한 성격의 애플리케이션

순차적 애플리케이션

  1. 순차적으로 실행되어야 하는 애플리케이션이라면.. 그래서 잘게 쪼개서 동시에 실행하기 매우 어려운 성격의 애플리케이션이라면 스레드를 많이 쓰려고 해도 실제 사용할 수 있는 스레드 수는 제한이 생김
  2. 코어에서 실행되던 스레드가 다른 스레드로 바뀔 때마다,context switching을 하는데, 이런 스위칭 작업도 CPU 코어에서 실행되게 되는 작업
  3. 즉, 코어에서 스위칭 작업을 처리하는 동안에는 애플리케이션 코드가 실행되지 않음
    1. overhead : 이때, 스위칭 작업을 위해 소비되는 CPU time은 애플리케이션과 직접적인 관련은 없지만 멀티스레딩으로 동작하기 위해 필요하기 때문에 간접 방식이라고 부름
  4. 위의 지식을 바탕으로 CPU의 코어 수는 고정되어 있는데 스레드 수를 계속 늘리게 되면 한 코어에서 경합해야하는 스레드의 수는 더 늘어나기 때문에 OVERHead도 많아짐 ⇒ 한계

CPU bound, I/O bound 관점

CPU bound 애플리케이션

  1. cpu를 많이 쓰기 떄문에 코어 수와 비슷한 수준 이상으로 스레드 수를 늘려봤자 이점이 없다.
  2. 오히려 각 코어에서 경합하는 스레드 수가 많아질 수

록 context switching 때문에 overhead만 더 많아져서 성능에 안 좋은 영향

I/O bound 애플리케이션

  1. I/O 작업이 많기 때문에 CPU가 놀고 있는 시간이 많다.
  2. 코어 수보다 두~세배 늘려주는 것이 overhead가 늘긴 해도 코어들을 좀 더 효율적으로 사용 가능하기에 성능 이점이 있음
  3. 물론 너무 많이 늘리면 안좋음
profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글