나만의 백과사전 - 멀티 스레드, 멀티 프로세스, 멀티 프로그래밍, 멀티 태스킹

Jiwon An·2021년 8월 8일
0

CS/운영체제

목록 보기
3/10

1. 멀티 스레드

일단 프로세스와 스레드의 차이를 보자면,
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

1) 멀티 스레드의 구조

  • 하나의 프로세스에 여러 스레드로 자원을 공유하며 여러개의 작업을 나누어 수행하는 것이다.

2) 멀티 스레드의 장단점

📌 장점

  • 응답성 (Responsiveness)
    싱글 스레드 프로그램에선 수행 중이던 스레드가 입출력(I/O)로 인해 block 된다면 프로세스 전체가 block될 것이다. 멀티 스레드 프로그램에선 하나의 스레드의 실행 시간이 길거나 입출력 요청으로 인해 block 되더라도 다른 스레드들은 계속 실행되는 것을 허용한다. 그래서 사용자 입장에선 그 프로그램이 interactive하다고 볼 수 있다.

  • 자원 공유 (Resource sharing)
    프로세스 내 스레드간에 메모리 및 다른 자원들을 공유한다.

  • 경제성 (Economy)
    만약 각각의 작업을 위해 fork() 시스템 콜을 사용하는 등 여러개의 프로세스를 생성한다면, 프로세스 생성 및 컨텍스트 스위칭으로 인해 오버헤드가 발생한다. 이에 비해 멀티 스레딩 방식은 비용이 적게 소모되어 훨씬 경제적이다.

  • 확장성 (Scalability)
    멀티 프로세서 시스템에서 병렬성이 증가한다. 즉, 여러개의 스레드가 각각 다른 프로세서에서 동시에 실행이 가능하다. (하나의 프로세스라 컨텍스트 스위칭될 일이 없기 때문에 CPU가 여러개일 때 병렬적으로 사용될 수 있음)

  • 시스템 자원소모 감소 (자원의 효율성 증대)
    프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.

  • 시스템 처리율 향상 (처리비용 감소)
    스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
    또한, 스레드 사이 작업량이 작아 컨텍스트 스위칭이 빠르다. (캐시 메모리를 비울 필요가 없다.)

  • 간단한 통신 방법으로 프로그램 응답시간 단축
    스레드는 프로세스 내 스택영역을 제외한 메모리 영역을 공유하기 때문에 통신 비용이 적다.
    힙 영역을 공유하므로 데이터를 주고 받을 수 있다.

📌 단점

  • 자원을 공유하기 때문에 동기화 문제가 발생할 수 있다. (병목현상, 데드락 등)
  • 주의 깊은 설계가 필요하고 디버깅이 어렵다.
    (불필요한 부분까지 동기화하면, 대기시간으로 인해 성능저하 발생)
  • 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.

2. 멀티 프로세스

1) 멀티 프로세스의 구조

  • 두 개 이상의 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것이다. (병렬 처리)
  • 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야할 경우 사용한다.
  • 부모-자식 관계라도 자신만의 메모리 영역을 가지게 된다.
    • fork를 통해 부모프로세스를 복사하여 자식 프로세스를 다수개로 늘린다.
    • 환경변수와 프로세스 핸들 테이블이 상속 가능할 뿐 결국 독립적인 관계다.
  • 프로세스 간 통신을 하려면 IPC(Inter Process Communication : 세마포어, 큐, 공유메모리)를 통해야 한다.

2) 멀티 프로세스의 장단점

📌 장점

  • 독립된 구조로 안정성이 높다.
  • 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 손해정도는 생기지만 정지되거나 하는 문제는 발생하지 않는다.
  • 여러개의 프로세스가 처리되어야할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서(CPU)가 이를 공유하면 비용적으로 저렴하다.

📌 단점

  • 독립된 메모리 영역이기 때문에 작업량이 많을수록(컨텍스트 스위칭이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능저하가 발생할 수 있다.
  • 컨텍스트 스위칭 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생한다.

컨텍스트 스위칭

  • CPU는 한번에 하나의 프로세스만 실행 가능하다.
  • CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 컨텍스트 스위칭이라고 한다.
  • 구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.

오버헤드
어떤 처리를 하기 위해 들어가는 간접적인 처리 시간, 메모리 등을 말한다.
ex) A라는 처리를 단순하게 실행하면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는 처리를 추가한 결과 처리시간이 15초 걸렸다면, 오버헤드는 5초가 된다. 또한, 이 처리 B를 개선해 B’라는 처리를 한 결과, 처리시간이 12초가 되었다면 이 경우 오버헤드가 3초 단축되었다고 말한다.

3) 멀티 프로세스와 멀티 스레드를 사용하는 이유

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

  • fork를 통해 부모프로세스를 복사하여 자식 프로세스를 다수개로 늘려 여러 프로그램들을 병렬로 처리하며, 멀티 스레딩은 하나의 프로세스 안에서 병렬 처리를 한다.

  • 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 컨텍스트 스위칭이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료될 위험을 가지고 있다.

  • 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.

    즉, 멀티 프로세스 구조에선 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 자식 프로세스 하나만 죽고 다른 곳에 영향을 끼치지 않는다. 하지만 멀티 스레드 구조에선 자식 스레드중 하나에 문제가 생긴 경우엔 전체 프로세스가 영향을 받게 된다. (ex. thread I/O)

  • 두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단점이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.

왜 멀티 프로세스로 할 수 있는 작업들을 굳이 하나의 프로세스에서 스레드를 나눠가며 할까?

  • 운영체제가 시스템 자원을 효율적으로 관리하기 위해 스레드를 사용한다.
  • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
  • 또한, 프로세스 간의 통신보다 스레드 간의 통신 비용이 적으므로 작업들 간 통신의 부담이 줄어든다. (처리비용 감소, 프로세스는 독립구조이기 때문)

그렇가면 무조건 멀티 스레드가 좋을까?

  • 스레드를 활용하면 자원의 효율성이 증가하기도 하지만, 스레드 간의 자원 공유는 전역 변수를 이용하므로 동기화 문제가 발생할 수 있으므로 프로그래머의 주의가 필요하다.
  • 또한, 멀티 스레딩을 너무 자주 사용하게 된다면 컨텍스트 스위칭 비용이 상당히 높기 때문에 오히려 시스템 성능 저하를 초래할 수도 있다. 또한 메모리가 공유되기 때문에 안정성 및 보안을 좀 더 추구하는 경우에는 멀티 스레드보단 멀티 프로세싱이 더 좋다.

3. 멀티 프로그래밍

초기의 컴퓨터는 하나의 프로그램이 메모리에 올라가면 하나의 프로그램만 CPU가 처리를 진행할 수 있었다. 이 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해, 입출력이 완료될 때까지 프로세서는 유휴(idle) 상태가 된다. 따라서 이는 프로세서의 자원 낭비로 이루어진다.

그래서 프로세서를 효율적으로 사용할 수 있도록 하는 멀티 프로그래밍이라는 처리방식이 나온 것이다.
프로세서가 입출력 작업의 종료를 대기할 동안 하나의 프로세서에서 다른 프로그램을 수행할 수 있도록 하는 것이 멀티 프로그래밍이다.

따라서, 특정 프로세서가 프로세스 A를 처리할 때, 다른 프로세스 B, C등을 처리하게 만드는 것을 말한다.

4. 멀티 태스킹


Task란 운영체제에서 처리하는 작업의 단위 또는 정해진 일을 수행하기 위한 명령어 집합을 뜻하는데(프로세스보다 확장된 개념), 멀티 태스킹은 task를 OS의 스케줄링에 의해 task를 번갈아가며 수행하는 것을 의미한다. 여러개의 task를 자주 번갈아가며 수행하다보니 사용자는 동시에 여러 task가 수행되고 있다고 느끼게 된다.

멀티 태스킹은 시분할 시스템에서 사용되며, 사용자에게 다수의 작업이 동시에 처리되는 것처럼 느껴지게 할 수 있다.

시분할 시스템(Time Sharing System)
여러 명의 사용자가 사용하는 시스템에서 컴퓨터가 사용자들의 프로그램을 번갈아가며 처리해줌으로써 각 사용자에게 독립된 컴퓨터를 사용하는 느낌을 주는 것으로, 라운드 로빈(Round Robin)방식이라고도 합니다. 멀티 프로그래밍 방식과 결합하여 모든 작업이 동시에 진행되는 것처럼 대화식 처리가 가능하다.

5. 정리

1) 멀티프로그래밍 vs 멀티태스킹

멀티프로그래밍은 자원낭비를 막기 위함이고, 멀티 태스킹은 정해진 시간동안 각각의 task를 번갈아가며 수행하는 것을 의미한다.

2) 멀티 스레딩 vs 멀티 태스킹

멀티 스레딩은 스레드간의 자원 공유가 가능하며, 프로그래밍을 통해 구현 가능하나, 멀티 태스킹은 OS에서 지원하는 것으로 독립된 메모리를 가지며, 서로 간의 자원 공유가 이루어지지 않는다.
자원 공유를 위해 별도의 IPC를 구현해야 하며, 멀티 스레딩에 비해 운영체제에게 부담을 줄 수 있다.

3) 그래서 결국엔?

  • 멀티 프로세스 : 다수의 프로세서가 다수의 프로세스를 동시에 처리하는 것
  • 멀티 프로그래밍 : 하나의 프로세서에 대해 다수의 프로세스를 메모리에 적재하여 프로세스를 번갈아가면서 처리하는 것
  • 멀티 태스킹 : 다수의 작업을 운영체제 스케줄링에 의해 번갈아가면서 처리하는 것
  • 멀티 스레드 : 하나의 프로세스를 여러 스레드로 자원을 공유하며 여러개의 작업을 나누어 처리하는 것


참고
https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/
https://velog.io/@chy0428/OS-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1
https://rebas.kr/850
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bycho211&logNo=220994380643
https://velog.io/@tails5555/Thread-%EC%A0%95%EB%A6%AC

profile
아무것도 모르는 백엔드 3년차 개발자입니다 :)

0개의 댓글