FeelingXD

[OS] 프로세스 와 스레드 본문

CS/OS

[OS] 프로세스 와 스레드

FeelingXD 2024. 3. 2. 03:38

프로세스 와 스레드

이 글에서는 프로세스와 스레드 의 공통점 과 차이점 에대해 다룹니다. 👀

프로그램

우리가 프로그램을 실행하면 작업관리자에 프로세스로 등록되고 우리가 사용하는 서비스가 실행 됩니다. 어떻게보면 정적인 상태의 코드 이며 프로그램이 실행되면 정적이였던 코드가 메모리에 올라가고 실행되면서 동적인 프로그램 이며 실행단위인 프로세스가 됩니다.

프로세스

컴퓨터에서 연속적으로 실행되고 있는 컴퓨터의 프로그램으로 컴퓨터가 실행하는 프로그램의 단위 입니다. OS는 프로세스 단위로 컴퓨터 자원을 할당 하며 실행되는 프로그램으로 볼 수 있습니다.

동적 프로그램(작동되고 있는 프로그램) OS로부터 자원을 할당받아 메모리에 적재되어 실행되고있는 상태의 프로그램 이기도 합니다.

스레드

스레드는 프로세스 내에서 실행되는 여러 흐름의 단위 이며 한 프로세스가 여러 스레드를 가질 수 있습니다. 경량 프로세스로 표현하기도 합니다.

멀티 프로세스 와 멀티 스레드

멀티 프로세스와 멀티 스레드는 어떤 차이가 있으띾

  • 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 멀티 프로세스에 비해서 빠른 장점이있다.(Context Switching이 일어나긴 한다.), 하지만 멀티 스레드는 동기화 문제와 함께 한 스레드에 문제가 생기면 해당 문제가 프로세스 전체로 퍼지는 문제를 가지고있다. 이로인해 한 스레드에 장애가 생길경우 프로세스가 강제로 종료되기도 한다.

  • 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.(OS에서는 각 다른 프로세스로 인식하고 각각에맞는 PCB를 생성한다. 또 프로세스 간 전환시 문맥교환context switching 의 오버헤드를 발생한다.)

  • 멀티 스레드와 멀티 프로세스는 모두 동시에 여러 작업을 수행하는 관점에서는 동일하지만, 각각의 장단점이 있으므로 개발자가 판단하에 적합한 방법을 선택해야한다.

🤔 그럼 무조건 스레드가 많으면 좋은가요 ?

스레드는 프로세스가 일할수 있는 흐름의 단위니까.. 스레드가 많으면 많을수록 더 일을 잘 할 수 있을까? 라는 궁금증이 든다.

이걸 이해하려면 당신의 프로그램은 어떤일을 많이 하는지를 알아야 한다.

CPU 바운드 와 I/O 바운드

프로세스 가 실행 될때 어떤 작업이 많은지에 따라 CPU 바운드, I/O 바운드로 나눈다.

[!NOTE]
CPU 바운드
CPU 바운드는 프로세스가 진행될 떄, CPU 사용 기간이 I/O Wating 보다 많은 경우다. 주로 행렬곱이나 고속 연산등 연산을 할 때 나타나며 cpu성능에 의해 작업 속도가 결정된다. (게임, 포토샵 등 cpu,gpu 연산등이 많은 작업등이 이에 해당한다.)

[!NOTE]
I/O 바운드
I/O 바운드 는 프로세스가 진행될 떄, I/O Wating 이 보다 CPU 사용 기간 많은 경우다.
주로 데이터를 주고받고 혹은 DB 등 외부의 입출력이 많이 일어나는 경우이다.

👀 스레드 수와 바운드의 관계

스레드와 바운드의 관계를 알아보기전에 우선 스레드가 많으면 어떤일이 생기는지 알아보자.
프로세스의 스레드가 많다면 해당 프로세스가 실행될때 각 스레드가 실행을위해 cpu 자원을 두고 경합이 일어난다. 이떄 스레드 끼리 의 작업 전환(context swiching) 이 일어나면 스레드 간의 전환동안 cpu는 thread 의 정보를 저장/불러오기 하는등의 불필요한 연산이 추가되는 오버헤드가 발생한다.

[!NOTE]
CPU BURST ✨
대부분의 프로그램은 CPU 는 평균적으로 아주 짧은시간 (약 8ms) 간 cpu를 사용하고 cpu가 유휴상태에 들어간다.
img

CPU 바운드에서 적정 스레드 수

대부분의 프로그램에서 cpu는 아주 짧은시간동안 사용한다고 잠깐 언급했지만 cpu 버스트가 큰 프로그램 (동영상 편집, AI 등 복잡한 연산을 필요로 하는 프로그램)들이 실행 될때는 cpu 자원을 많이 사용하게 된다. 이로 인해 스레드를 많이 사용하는것은 오히려 불필요한 문맥교환(context switching)을 야기 함으로써 오히려 성능을 떨어뜨릴 수 있다.

🤔 - 그럼 cpu 를 많이 사용하는 프로그램에서 적정 스레드 수는 어떻게 될까요 ?

브라이언 괴츠는 cpu bound 프로세스의 적정 스레드의 갯수는 PC의 코어+1 을 권장 했다.
Goetz (2002,2006)

threads = number of CPUs + 1

IO 바운드에서 적정 스레드 수

IO 바운드 수에서는 조금 명확하지 않을 수 있는데 이는 IO 바운드의 프로세스(프로그램) 이 더라도 스레드별 IO 대기시간이 얼마인지 각각의 기준이 다르기 때문이다. 이에 Subramaniam 과 Goetz 는 다음과 같은 공식으로 스레드의 적정갯수를 설명 했다.
Subramaniam(2011)

threads = number of cores /  (1 – blocking coefficient)

Goetz(2002)

 threads = number of cores * (1 + wait time / service time)

여담으로 두 공식은 달라보이지만 같은 공식이다.

참고

'CS > OS' 카테고리의 다른 글

[OS] 운영체제란? 🤔  (0) 2024.02.22