병렬 처리 (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 등의 긴 작업으로 중단되는 상황에서도 프로그램이 계속 수행될 수 있어 응답성이 좋다.
스레드는 프로세스의 자원과 메모리를 공유하므로 자원 공유가 쉽고 비용이 덜 든다는 장점이 있다.
하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 받고, 스레드 간 자원 공유로 인해 동기화 작업이 필요하다는 단점이 있다.
✅ 사용 예시
웹사이트에서 비디오를 보려고 할 때 스레드들 중 한 개는 다른 스트림이 비디오를 검색하는 동안, 배경음악을 검색할 수 있다. 세 번째 스레드는 배너광고에 나오는 애니메이션 광고를 갱신할 수 있다. 멀티 스레드를 사용하면 시스템은 이러한 모든 행위들이 동시에 수행될 수 있다.
다수의 클라이언트가 동시에 단일 웹 서버로 접속하는 경우, 스레드를 사용하지 않고 프로세스로 구현한다면 웹 서버는 한 사용자의 서비스 요청이 끝나야 다음 사용자에게 서비스를 제공할 수 있다. 멀티스레드로 서비스할 경우 클라이언트들의 응답 속도가 훨씬 빨라진다.
✅ 사용하는 이유
시스템 자원을 효율적으로 관리하기 위해 멀티 스레드를 사용한다.
프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원의 소모가 상당히 줄어든다.
프로세스를 생성해 자원을 할당하는 시스템 콜도 줄어들다.
통신이 필요한 경우에도 프로세스 간 통신보다 쉽게 데이터를 주고 받을 수 있다.
스레드의 컨텍스트 스위치는 캐시 메모리를 비우고 채울 필요가 없기에 더욱 빠르다.
다중 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로 데이터를 처리한다.