새소식

반응형
CS/OS

(3) 분산 시스템 / 멀티 프로세스 vs 멀티 스레드

  • -
728x90
반응형

 

들어가기 전에

분산 시스템은 PC가 보급되고 인터넷이 활성화되면서 개념이 생겨났다.

  • 병렬 처리 (Parallel Processing) : 하나 이상의 연산을 동시에 수행해 연산 속도를 증가시키는 방법
  • 분산 시스템 : 여러 개의 컴퓨터가 동일한 태스크를 처리하기 위해 네트워크 상에서 서로 통신하며 협력하는 것
    예) 거대 웹사이트 저장소, P2P 파일 공유 등
  • 병렬처리 시스템은 프로세서를 늘려서 여러 일을 동시에 처리 할 수 있게 해주는 시스템
  • 분산처리 시스템은 하나의 컴퓨터 시스템이 처리 또는 제어하고 있던 기능을 여러 개의 컴퓨터 시스템에 분산하여 처리하는 것.
    분산처리는 “하나의 일을 동시에 여럿이서” 처리하는 것

 

 

병렬 처리 시스템 ( 강결합 시스템)

  • 병렬처리 시스템은 컴퓨터를 병렬로 연결하거나, CPU등을 병렬로 연결하여 다수의 프로세서들이 다수의 프로그램들을 분담하여 동시에 처리하는 방식
    예) 한글워드 프로세서를 사용하면서 윈도미디어 플레이어로 음악을 듣고 동시에 메신져를 켜놓을 수 있는 것
  • 여러 개의 프로세서가 하나의 메모리를 공유하는 다중 프로세서(Multi-processor) 구조
  • 프로세서들이 메모리를 공유, 프로세서간 통신은 공유 메모리를 통해 이루어짐
    ➡️ 공유 메모리를 차지하려는 프로세서 간의 경쟁 최소화가 주요 고려 대상
  • 멀티 태스킹, 멀티 프로세싱, 멀티 스레딩이 이에 해당한다.

 

  • 장점 : 경제적이고 처리량이 높고 하나의 CPU가 고장나더라도 다른 CPU가 일을 수행할 수 있어 신뢰성이 높다.
  • 단점 : CPU가 많아질 수록 CPU간 데이터 교환에 따른 오버헤드가 증가한다.

 

 

[ 프로세싱 기법에 따른 구분 ]

🔺 Asymmetric Multiprocessing

하나의 master 프로세스가 다른 프로세스들을 관리감독하는 형태로, master가 load balancing을 모두 결정한다.

 

🔺 Symmetric Multiprocessing

각각의 프로세서가 동등한 권한으로 각자 스케줄링을 진행한다. 대부분의 멀티 프로세스가 이런 형태를 가진다.

 

👆 Load Balancing

  • 특정 CPU가 너무 많은 프로세스를 실행할 때, 스케줄러가 적절히 분배해주는 행위
  • CPU마다 utilization을 체크해서 바쁜 쪽의 일을 덜 바쁜 쪽으로 보내 수행하도록 한다.

 

 

[ 메모리 접근에 따른 구분 ]

🔺 Uniform Memory Access

  • 하나의 공유된 메모리를 여러 개의 프로세서가 공유해 사용한다.
  • 프로세서가 어느 메모리를 참조하든 접근 속도가 동일하다.

 

🔺 Non-uniform Memory Access (NUMA)

  • 물리 주소 일정 부분을 각 CPU의 로컬 메모리로 배정해 사용한다.
  • 다른 프로세서에서 자신의 메모리를 참조할 때 속도가 느리고, 스케줄링 시 이 점을 고려해줘야 한다.

 

👆 Processor Affinity

  • 프로세스 스케줄링 시에 특정 프로세서에 지정해주는 것
  • 보통 이전에 해당 프로세스를 실행한 적 있는 CPU에 해당 코드 일부가 캐시에 담겨 있을 확률이 높으니 이전에 실행했던 CPU를 선택한다.
  • NUMA의 경우 다른 프로세서 데이터 참조 시간이 오래걸리기 때문에 데이터 접근이 있는 프로세스의 경우 접근하려는 데이터가 있는 CPU에서 실행하도록 하는 것이 효율적이다.

 

 

1️⃣ 멀티 프로세스

  • 하나의 어플리케이션을 여러 개의 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것
  • 여러 개의 CPU 코어가 하나의 시스템에서 동시에 실행하는 것
  • 각 프로세스들이 독립적으로 동작하고, 자원이 서로 다르게 할당된다. 따라서 여러 개의 자식 프로세스 중 하나에 문제가 발생 하더라도 다른 프로세스들에 영향이 확산되지 않아 안정성이 좋다.
  • Context switching 과정에서의 오버헤드가 크고 프로세스 사이의 통신이 어렵다는 단점이 있다.

 

 

✅ 사용 예시

  • 웹 브라우저의 Tab : 각 브라우저 탭은 같은 브라우저 프로그램에서 실행되지만, 각기 다른 사이트를 실행한다. 만약 하나의 탭에 문제가 생겨도 다른 탭은 문제없이 사용할 수 있는 이유는 탭마다 다른 프로세스로 동작하기 때문이다.

 

✅ 사용하는 이유

  • 프로그램의 안정성을 확보할 수 있다. 각 프로세스가 독립적인 메모리 공간을 가지기 때문에 한 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향을 주지 않는다.
  • 각 프로세스가 독립적이기 때문에 새로운 기능이나 모듈을 추가할 때 다른 프로세스에 영향을 주지 않아 시스템 규모를 쉽게 확장할 수 있다. 예를 들어, 하나의 성능 좋은 컴퓨터에 여러 개의 서버 프로세스를 둠으로써 요청을 분산시켜 처리해 시스템 규모를 쉽게 확장할 수 있다.

 

✅ 멀티 프로세스의 단점

  • context switching overhead가 발생한다.
    -> 멀티 프로세스 환경에서는 이를 최소화하는 방법이 중요하다. 프로세스 수를 적정하게 유지하거나, CPU 캐시를 효율적으로 활용하는 등의 방법이 있다.
  • 각 프로세스가 독립적인 메모리 공간을 가져 자원 공유가 어렵다. 필요한 경우 복잡한 IPC 를 사용해야 한다.

 

  프로세스 간 통신 방법 : Interprocess Communication(IPC)

원칙적으로 프로세스는 독립적이라, 하나의 프로세스가 다른 프로세스에 영향을 주지 못한다. 그러나 협력이 필요한 경우가 있는데 이를 IPC라고 부른다.

  • Message passing : 커널을 통해 메세지를 보내 통신한다.
  • Shared memory : 서로 다른 프로세스가 공유 메모리를 갖는다. 커널에게 공유 메모리 사용을 요청하고 할당되면 이후 사용한다. 한 번 공유 메모리가 설정되면 이후는 커널 도움없이 통신이 가능해진다.

 

 

2️⃣ 멀티 스레드

  • 하나의 어플리케이션을 여러 개의 스레드로 구성해 하나의 스레드가 하나의 작업을 처리하도록 하는 것이다.
  • 프로그램의 일부(하나의 스레드)가 오류 또는 I/O 등의 긴 작업으로 중단되는 상황에서도 프로그램이 계속 수행될 수 있어 응답성이 좋다.
  • 스레드는 프로세스의 자원과 메모리를 공유하므로 자원 공유가 쉽고 비용이 덜 든다는 장점이 있다.
  • 하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 받고, 스레드 간 자원 공유로 인해 동기화 작업이 필요하다는 단점이 있다.

 

✅ 사용 예시

  1. 웹사이트에서 비디오를 보려고 할 때 스레드들 중 한 개는 다른 스트림이 비디오를 검색하는 동안, 배경음악을 검색할 수 있다. 세 번째 스레드는 배너광고에 나오는 애니메이션 광고를 갱신할 수 있다. 멀티 스레드를 사용하면 시스템은 이러한 모든 행위들이 동시에 수행될 수 있다.
  2. 다수의 클라이언트가 동시에 단일 웹 서버로 접속하는 경우, 스레드를 사용하지 않고 프로세스로 구현한다면 웹 서버는 한 사용자의 서비스 요청이 끝나야 다음 사용자에게 서비스를 제공할 수 있다. 멀티스레드로 서비스할 경우 클라이언트들의 응답 속도가 훨씬 빨라진다.

 

✅ 사용하는 이유

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

 

✅ 멀티 스레드의 단점

  • 컨텍스트 스위칭, 동기화 등의 이유로 싱글 코어 멀티 스레딩은 스레드 생성기간이 오히려 오버헤드로 작용해 단일 스레드보다 느릴 수 있다.
  • 공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 이런 경우, 동기화가 필요하다.
    • 동기화로 인한 병목 현상으로 성능 저하 가능성이 높다.
  • 운영체제의 지원이 있어야 멀티스레딩이 가능하다.
    • 윈도우, 리눅스, 맥os 에선 모두 기본적으로 지원하기 때문에 현재 문제점은 아니다.
  • 해당 모델의 프로그래밍 난이도가 높고 스레드의 수 만큼 자원을 많이 사용한다.
  • 디버깅이 어렵다. 여러 개의 스레드가 동시에 실행되기 때문에 각 스레드 동작을 추적하기 어려울 수 있다. 

 

✅ mutl-thread 에서의 context switching

  • 프로세스 context switching은 CPU 캐시를 모두 초기화하고, 새로운 PCB를 적재해야 하기 때문에 높은 비용이 든다.
  • 스레드 context switching은 스레드 간 공유하는 자원을 제외한 스레드 정보(stack, register)만 교체하면 되기 때문에 상대적으로 오버헤드가 적다.
  • 그럼에도 무시할 수 없다. 스레드 수가 많아지면 context switching 이 많이 발생하게 되고 성능 저하로 이어지게 된다. 

 


분산 처리 시스템 ( 약결합 시스템)

  • 두 개 이상의 독립된 컴퓨터 시스템이 통신망을 통하여 연결된 시스템
  • 각 시스템마다 독자적인 운영체제, 메모리, 입출력장치를 가지고 독립적으로 운영됨
  • 프로세서 간의 통신은 메시지 전달이나 원격 프로시저 호출을 통해서 이루어짐
    -> LAN 같은 네트워크 인프라를 필요로 한다. 
  • 자원을 가지고 있는 사이트는 서버(server)가 되며, 반면 다른 사이트에서의 클라이언트(client)나 사용자는 그 자원을 사용한다.

  • 분산처리 시스템은 대형 메인 프레임 컴퓨터를 사용하는 것보다 개인용 컴퓨터를 여러 개 사용하여 하나로 묶어 대형 컴퓨터에 버금가는 시스템을 만드는 것

 

🔺 분산 컴퓨팅 환경 실현하기 위해 필요한 기술

  • 복수의 컴퓨터상의 프로그램 간 통신을 위한 원격 절차 호출(RPC)
  • 분산 파일 시스템(distributed file system)
  • 디렉터리 서비스(directory service) : 쿼리를 이용한 검색기능 제공
  • 인증 서비스(authentication service)

 

✅ 분산 시스템의 고려 사항

  • Transparency(투명성) : 유저 입장에서 Single computer system으로 제공
    ⇒ 어떤 시스템을 통해 접근하더라도 똑같은 인터페이스를 제공하기
  • Scalability (확장성) : 유저가 많아지면 많아지는 대로, 적어지면 적어지는 대로 규모를 효율적으로 사용하는 것
  • Concurrency (일관성) : 각 task들의 동시에 접근할 때, 각 자원들의 상태가 동일해야 한다.
  • Failure Handling : 일부 컴퓨터들이 고장 난다 하더라도 그 시스템이 계속해서 사용자에게 일관성 있는 컴퓨팅 서비스를 제공할 수 있어야 한다.

 

✅ 장점

  • 빠른 속도
    • 분산 처리를 통한 빠른 데이터 처리 속도
    • 동시에 수행 가능한 시스템 환경이 제공되므로 연산 속도가 향상된다.
  • 자원 활용도 향상
    • 한 사이트에 있는 자원을 다른 사이트가 이용할 수 있다.
  • 높은 신뢰성 : 하나의 시스템에 오류가 발생해도 시스템 전체 성능에 크게 영향을 주지 않는다.
  • 서버가 물리적으로 떨어져 있어도 사용할 수 있다.

 

 단점

  • 보안/통신 관리가 복잡하다.
  • 네트워크 리소스가 많이 필요하다.
  • 유지 보수가 어려울 수 있다.

 

 

✅ HADOOP

  • 분산 컴퓨팅을 위한 오픈소스 소프트웨어
  • 클러스터 상 분산 저장되어 있는 대용량 데이터셋을 대상으로 분산처리를 가능하게 한다.
  • 물리적으로는 다 다른 서버지만 하둡이라는 소프트웨어를 깔면 마치 하나의 서버처럼 작동하도록 만드는 것
  • HDFS에 데이터를 저장하고, YARN으로 리소스를 관리하고 MapReduce로 데이터를 처리한다.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.