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

nGyu·2022년 4월 3일
1

OS

목록 보기
3/10
post-custom-banner

멀티 스레드

멀티 스레드 하면 무엇이 떠 오르는가?
필자는 하나의 프로세스에 여러개의 스레드가 있다는 생각이 바로든다.

그런데 이런 생각이 과연 맞는 생각일까?

이 멀티스레드에 대하여 조사를 조금 해 보았다.

TCP School 사이트에서 정보를 조금 얻어왔다.

일반적으로 프로세스는 하나의 스레드를 가지고 작업을 수행한다.
하지만, 멀티 스레드는 하나의 프로세스에서 둘 이상의 스레드가 동시에 작업을 하는것을 의미한다.
이와 비슷한 말로 멀티 프로세스가 있는데 이는 여러개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는것을 의미한다.

자 여기서 보았을 때 필자가 생각한 내용이 얼추 맞는것같다.

이처럼 하나의 프로세스 안에서 여러개의 스레드가 존재하는것을 멀티 스레드라 한다고 한다.

그런데 이런 멀티 스레드는 왜 존재하는것이고, 장점은 무엇일까?

등장 배경

컨텍스트 스위칭(Context Switching)이라고 아는가?

컨텍스트 스위칭이란, 프로그램의 실행을 위해서는 해당 프로세스의 정보가 메인 메모리에 올라와야 한다.
이게 무슨소리인가 정말 이해가 가지 않을것이다.

컨텍스트

우선 컨텍스트란 무엇일까? → CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들 이다.
솔직히 이게 무슨말인가 잘 이해가 가지 않는데, 그대로 프로세스의 정보들 이라고 이해하면 편할것이다.

이런 컨텍스트들은 프로세스 제어 블록(Process Control Block , PCB)에 적재가 된다.

여기까지 보면 컨텍스트 가 무엇인지 100%까진 아니지만 어느정도 이해를 할 수 있으리라 생각된다.

이제 스위칭의 개념에 대해서 알아보자.

스위칭

위에 컨텍스트들을 스위칭 하는게 컨텍스트 스위칭이다.

스위칭은 어떤식으로 일어날까?

우선, 한 개의 프로세스가 실행이 되고있다는 가정을 해보자.
이 프로세스는 인터럽트 요청에 의해서 다음 우선 순위인 프로세스가 실행이 되어야 할 때 레지스터 값 즉, 컨텍스트를 저장하고 CPU가 다음 프로세스를 수행하도록 프로세스의 상태 혹은 컨텍스트를 교체하는 작업을 컨텍스트 스위칭 이라고 한다.

말이 좀 어렵다. 이를 쉽게 말하면 아래와 같다

A 프로세스가 현재 실행중 이다. 이 때 B 프로세스를 실행하려 할 때 A프로세스를 저장하고 내린 다음, B프로세스를 실행한다. 여기서 A프로세스를 내린다고 했는데 이 프로세스는 하드디스크로 이동하고, B프로세스는 메모리에 A를 대신하여 올라간다.

자, 여기까지 보았을 때 굉장히 비효율적인 생각이 들지 않는가?

메모리를 내릴 때 CPU에서 HDD로 프로세스를 내린다고 한다. 당장에 우리가 데스크탑을 볼 때 CPU 바로 옆에 HDD가 존재하는가? 아니다. 그렇다고 우리가 프로그램을 끄고키는 간격이 엄청나게 긴가? 그것도 아니다.

위에 설명한 컨텍스트 스위칭의 메모리를 내리고 올리는 과정에 있어 CPU → HDD로 갈 때 상당한 시간이 소요되며 오버헤드 발생으로 성능이 저하된다. 이러한 문제가 있어 컨텍스트 스위칭은 비효율적이라고 할 수 있다.

CPU → HDD과정은 이 블로그가 정말 잘 설명이 되어있어 첨부를 해본다.

인터럽트

구체적으로는 인터럽트 발생 시 컨텍스트 스위칭이 일어나게 되는데, 조건은 아래와 같다.

  • 입/출력을 요청할 때
  • CPU 사용시간의 만료
  • 자식 프로세스 생성
  • 인터럽트 처리 기다릴 때

이러한 단점을 없앤것이 바로 멀티스레드의 등장 배경이다.

장점

장점은 위에 말한 단점을 보안해주는것이 대표적인 장점이라고 할 수 있다.

  1. 효율적인 자원 활용
    1. 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원의 소모가 상당히 줄어든다.
    2. 스레드간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있으며, 프로세스의 컨텍스트 스위칭과는 다르게 스레드의 컨텍스트 스위치는 캐시 메모리를 비우고 채울 필요가 없기에 더욱 빠르다.
  2. 멀티 프로세서의 활용
    1. 다중 CPU구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행이 될 수 있기에 병렬성이 증가한다.
  3. 응답이 빠르다
    1. 병렬성의 증가로 스레드가 중단되거나 긴 작업을 진행을 하더라도 한 스레드의 작업이 오래걸리더라도 작업은 끊기지 않고 계속해서 실행되어 응답성이 증가한다.
    2. 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복을 하게 된다.
    3. 다만, 새로운 스레드의 생성이나 놀고 있는 스레드 처리에 비용이 발생하게 된다.

단점

  1. 컨텍스트 스위칭, 동기화 등의 이유로 싱글 코어 멀티 스레딩은 스레드 생성기간이 오히려 오버헤드로 작용해 단일 스레드보다 느릴 수 있다.
  2. 공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 이런 경우, 동기화가 필요하다.
  3. 운영체제의 지원이 있어야 멀티스레딩이 가능하다.
  4. 해당 모델의 프로그래밍 난이도는 상당히 높다. 또한, 스레드의 수 만큼 자원을 많이 사용한다.

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

위 내용들을 정리하며 정말 다양한 내용들이 많이 나왔다.

바로, 멀티 스레드와 멀티 프로세스인데 이 두가지는 어떤 차이가 있을까? 라는 생각에서 시작을 하게 되었다.
필자는 자원의 사용과 비용의 차이라고만 생각을 하는데, 정확히 어떤 차이가 있는지를 한번 조사를 해보기로 했다.

멀티 프로세스

프로세스가 무엇이라고 했을까? 바로, 프로세서에 의해서 실행되는 프로그램을 프로세스라고 한다.

멀티 스레드는 병렬성 즉, 여러개의 스레드에서 작업을 동시에 진행한다고 했다. 멀티 프로세스도 이와 매우 흡사하다.

한 줄로 정리를 하자면, 하나의 프로그램을 여러 프로세스로 구성하여 각 프로세스가 병렬로 작업을 수행하는것. 이라고 한다.

그렇다면, 이러한 환경에서 장단점은 어떤것들이 존재할까?

장점

메모리 침범 문제를 OS 차원에서 해결하게 된다.
여러 자식 프로세스 중 하나에 문제가 발생하여도 그 프로세스만 타격이 생기지, 다른 프로세스에는 타격이 없다.

단점

각 프로세스가 독립적 메모리 영역을 가지기 때문에 작업량이 많아지면 오버헤드가 발생을 하게 된다.

프로세스 간의 복잡한 통신(IPC)가 필요하다.

profile
지금보다 내일을, 모레를 준비하자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 12월 30일

좋은 자료 감사합니다 : >

답글 달기