[CS/운영체제] 멀티스레드와 동시성 - 1부

황제연·2025년 6월 24일
0

CS학습

목록 보기
115/193
post-thumbnail

멀티태스킹이란?

각 프로그램의 실행 시간을 분할해서 마치 동시에 실행되는 것처럼 하는 방법을
시분할 방법이라고 합니다
이 방식을 사용하면 CPU 코어 하나만 있어도 여러 프로그램이 동시에 실행되는 것처럼
느낄 수 있습니다
또한 이렇게 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 것을 멀티태스킹이라고 합니다

멀티프로세싱

컴퓨터 시스템에서 둘 이상의 CPU 코어(프로세서)를 사용하여 여러 작업을 동시에 처리하는
방법을 말합니다
멀티 프로세싱은 하나의 CPU 코어만을 사용하는 시스템보다 동시에 더 많은 작업을
처리할 수 있습니다

멀티프로세싱 VS 멀티태스킹

멀티프로세싱멀티태스킹
여러 CPU코어를 사용해서 동시에 여러 작업을 수행단일 CPU코어가 여러 작업을 동시에 수행하는 것처럼 보이는 것
하드웨어 기반으로 성능 향상소프트웨어 기반으로 CPU시간을 분할해서 각 작업에 할당

프로세스

프로세스는 실행중인 프로그램의 인스턴스로 각 프로세스는 독립적인 메모리 공간을 가지고 있습니다
운영체제에서 별도의 작업단위로 분리되어 관리되며,
각 프로세스는 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않습니다

그리고 프로세스가 서로의 메모리에 직접 접근할 수 없도록 격리되어 관리됩니다
따라서 하나의 프로세스가 충돌해도 다른 프로세스에도 영향을 미치지 않습니다

프로세스의 메모리 구성

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

스레드

프로세스는 하나 이상의 스레드를 반드시 가집니다
여기서 스레드는 프로세스 내에서 실행되는 작업의 단위입니다
한 프로세스 내에서 여러 스레드가 존재할 수 있으며,
프로세스가 제공하는 동일한 메모리 공간을 공유합니다

스레드는 프로세스보다 단순하므로 생성 및 관리가 쉽고 가볍습니다

메모리 구성

  • 공유 메모리: 같은 프로세스의 코드섹션, 데이터 섹션, 힙(메모리)는 프로세스 안의 모든 스레드가 공유합니다
  • 개별 스택: 각 스레드는 자신의 스택을 가지고 있습니다

단일 스레드 VS 멀티스레드

둘의 차이는 한 프로세스 내에 하나의 스레드만 있는지와 여러 스레드가 있는지 입니다

멀티 스레드가 필요한 이유

하나의 프로그램도 그 안에서 여러 작업이 필요하기 때문입니다

스레드와 스케줄링

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

프로세스의 역할

프로세스는 실행환경을 제공합니다
마치 프로세스가 컨테이너 역할을 하는 것처럼 보입니다

또한 프로세스 자체는 운영체제의 스케줄러에 의해 직접 실행되지 않고
프로세스 내의 스레드가 실행됩니다

컨텍스트 스위칭

컨텍스트는 현재 작업하는 문맥을 뜻합니다
현재 작업하는 문맥이 변하기 때문에 컨텍스트 스위칭입니다

컨텍스트 스위칭 과정에서는 이전에 실행중이던 값을 메모리에 잠깐 저장하고,
이후에 다시 실행하는 시점에 저장한 값을 CPU에 다시 불러와야합니다
결과적으로 컨텍스트 스위칭 과정에는 약간의 비용이 발생합니다

멀티스레드는 대부분 효율적이지만, 컨텍스트 스위칭 과정이 필요하기 때문에
항상 효율적은 아닙니다
1 ~ 10,000까지 더하는 연산을 한다고 했을 때, 두 스레드를 활용해서 더한다고 했을 때,
cpu 코어가 2개일 때는 상관없지만 CPU 코어가 1개일 때는
중간에 컨텍스트 스위칭 비용이 발생하며, 연산시간 + 컨텍스트 스위칭 시간이 듭니다
차라리 이럴 때는 단일 스레드로 연산하는 것이 컨텍스트 스위칭 비용을 없애기 떄문에
더 효율적일 수 있습니다

CPU 바운드 작업

CPU의 연산 능력이 많이 요구되는 작업을 말합니다
이러한 작업은 주로 계산, 데이터 처리, 알고리즘 실행 등 CPU의 처리 속도가
작업 완료시간을 결정하는 경우입니다

I/O 바운드 작업

디스크, 네트워크, 파일 시스템 등과 같은 입출력 작업을 많이 요구하는 작업을 말합니다
이러한 작업은 I/O 작업이 완료될 때까지 대기 시간이 많이 발생하며,
CPU는 상대적으로 유휴(대기) 상태에 있는 경우가 많습니다

웹 애플리케이션 서버에서는..

일반적인 웹 애플리케이션 서버는 I/O 바운드 작업이 많습니다
이 말은 스레드가 CPU를 많이 사용지 않는 I/O 바운드 작업이 많다는 것을 말합니다

따라서 스레드의 숫자를 결정할 때 CPU 바운드 작업이 많은지
I/O바운드 작업이 많은지에 따라 다르게 설정해야 합니다

CPU 바운드 작업이 많은 경우

  • CPU 코어 수 + 1개
    CPU를 거의 100% 사용하기 떄문에 스레드를 CPU 숫자에 최적화합니다

I/O 바운드 작업이 많은 경우

CPU 코어 수보다 많은 스레드를 생성합니다
CPU를 최대한 사용할 수 있는 숫자까지 스레드를 생성합니다

CPU를 많이 사용하지 않으므로 성능 테스트를 통해 CPU를 최대한 활용하는 숫자까지 스레드를 생성합니다
너무 많은 스레드를 생성하면 컨텍스트 스위칭 비용도 함께 증가하므로, 적절한 성능 테스트가 필요합니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글