프로세스와 스레드

최주영·2025년 1월 8일
0

스레드

목록 보기
1/1

✅ 멀티태스킹

초창기의 컴퓨터는 하나의 CPU 코어로 한 번에 하나의 프로그램만 실행이 가능했음
이를 해결하기 위해서 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 멀티태스킹 기술이 등장

현대의 CPU는 초당 수십억 번 이상의 연산을 수행함

CPU 가 빠르게 두 프로그램의 코드를 번갈아 수행하면 두 프로그램이 동시에 실행되는 것처럼 느껴짐

이렇게 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력을 멀티태스킹 이라고 한다

  • 참고로 CPU에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정하는데 이것을 스케줄링
    -> 단순히 시간만으로 작업을 분할하는게 아니라, 다양한 우선순위와 최적화 기법을 사용

✅ 멀티프로세싱

과거에는 하나의 CPU 안에 하나의 코어 만 들어있어서 따로 용어의 차이를 두지 않았음
하지만 최근에는 하나의 CPU 안에 보통 2개 이상의 코어 가 들어있음

코어 가 2개이상인것은 1개인 것보다 처리 속도가 빠름

멀티프로세싱 은 컴퓨터 시스템에서 두개 이상의 코어 를 사용하여 여러 작업을 동시에 처리하는 기술임


✅ 멀티프로세싱 vs 멀티태스킹

멀티프로세싱 은 하드웨어 장비의 관점 (여러 CPU 코어) 으로 보면 된다
하드웨어 기반으로 성능을 향상시키는 것

멀티태스킹 은 소프트웨어의 관점으로 CPU 시간을 분할하여 각 작업에 할당하는 것
단일 CPU 코어로 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것


위의 예시는 여러 CPU 코어를 사용하면서 각각의 단일 코어에 여러 작업을 분할하여 수행하기 때문에 멀티프로세싱 이면서 멀티태스킹 이라고 한다.


운영체제 안에는 프로세스 가 있고 프로세스 안에는 스레드 가 존재한다

✅ 프로세스

  • 운영체제 안에서 실행중인 프로그램을 프로세스 라고 한다
  • 프로그램을 실행하면 프로세스 가 만들어지고 프로그램이 실행된다
  • 프로세스는 독립적인 메모리 공간을 가지고 있으며, 각 프로세스는 서로 간섭하지 않는다
    -> 각 프로세스는 본인것만 사용 가능함 (운영체제에서 분리해서 관리함)
    -> 하나의 프로세스가 충돌해도 다른 프로세스는 영향 x -> 게임이 팅겨도 멜론은 그대로 나옴
  • 자바로 비유하면 클래스는 프로그램, 인스턴스는 프로세스
    -> 프로세스 는 실행중인 프로그램의 인스턴스이다

✅ 프로세스의 메모리 구성

  • 코드 섹션 : 실행할 프로그램의 코드가 저장되는 부분
  • 데이터 섹션 : 전역 변수 및 정적 변수가 저장되는 부분 (그림에서 기타로 표현)
  • : 동적으로 할당되는 메모리 영역
  • 스택 : 메서드 호출시 생성되는 지역 변수와 반환 주소가 저장되는 영역 (스레드에 포함)

✅ 스레드

  • 프로세스 내에서 실행되는 작업의 단위
  • 프로세스는 하나 이상의 스레드 를 반드시 포함한다 -> 코드를 실행시키기 위해 (프로그램 실행)
    -> 단일 스레드 : 한 프로세스 내에 하나의 스레드만 존재
    -> 멀티 스레드 : 한 프로세스 내에 여러 스레드가 존재
  • 프로세스가 제공하는 동일한 메모리 공간을 공유
  • 스레드 는 프로세스 보다 생성 및 관리가 단순하고 가벼움
  • 프로세스의 코드를 실행하는 흐름

✅ 스레드의 메모리 구성

  • 공유메모리 : 프로세스의 모든 스레드는 위 그림의 초록색 부분(코드, 데이터, 힙) 을 공유
  • 개별 스택 : 각 스레드는 자신의 스택을 가지고 있음

프로그램이 실행된다는 의미?
(1) : 운영체제가 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만듬
(2) : 프로세스 안에 있는 코드가 한줄씩 실행되는 것임 (main 문에서 한줄씩 아래로 절차지향적)


✅ 프로세스 vs 스레드

프로세스 : 실행 환경과 자원을 제공하는 컨테이너 역할을 함
스레드 : CPU를 사용해서 코드를 하나하나 실행


✅ 멀티스레드가 필요한 이유

단일 스레드로 충분할 거 같은데 멀티스레드 가 필요한 이유가 무엇일 까?

하나의 프로그램 내에서도 동시에 여러 작업이 필요함

EX) 유튜브 영상을 시청하는 동안 댓글을 달려면 이러한 작업이 필요함

  • 유튜브 - 프로세스
    • 영상 재생 - 스레드 1
    • 댓글 작성 - 스레드 2

✅ 컨텍스트 스위칭

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를 최대한 사용할 수 있는 숫자까지 스레드를 생성해주는것이 좋다

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글