220929_병렬성/동시성 & 비동기/동기

Csw·2022년 9월 29일
1

ComputerScience

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

병렬성 vs 동시성

병렬성

  • 2개 이상의 Core에서 동시에 여러 작업이 처리되는 것
    • 물리적 용어
    • 실제로 작업이 동시에 처리되는 것
    • 멀티 코어에서 멀티 스레드를 동작시키는 방식
    • 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질
    • 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분
  • Core란?
    • CPU에 내장된 처리회로
    • 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛

동시성

  • 1 코어 내에서 여러 스레드를 빠르게 교차하면서 동시에 실행되는 것처럼 보이는 것 (그림자 분신술!!!!!)
    • 논리적인 용어
    • 동시에 실행되는 것처럼 보임
    • 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식
    • 멀티 코어에서도 동시성은 사용 가능
    • 멀티 태스킹을 위해 여러 스레드가 번갈아가면서 실행되는 성질
    • 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것
  • context switching
    • 여러 스레드를 왔다갔다하면서 현재 진행되고 있는 태스크의 상태를 저장하고 다음 진행할 태스크의 상태 값을 읽어 적용하는 것

코어와 쓰레드

  • 그럼 무조건 코어 개수 = 스레드 개수? No
  • 작업관리자를 보면 수천, 수백개의 쓰레드가 돌고 있는 것을 볼 수 있음.

쓰레드의 종류

1. 물리적인 쓰레드

  • 물리적인 코어를 논리적으로 쪼갠 논리적 코어

  • 코어가 2개뿐이라 쓰레드를 2개만 병렬처리할수 있을거 같지만, cpu가 컴퓨터를 속여서 코어가 4개가 있는 것처럼 작업을 진행

  • 예시를 통한 설명

    1. 레스토랑에서 점원이 손님에게 주문을 받으면 주문서를 작성해서 셰프에게 전달

    2. 주방에서 주문서를 받은 셰프는 주문서에 적힌 음식에 맞는 레시피로 바꿔서 일을 시작하게 됨.

    3. 여기서 레시피는 기계어로 번역된 프로그램, 레시피대로 일을 하는 셰프는 컴퓨터에서 코어

      • 만약 컴퓨터에 1코어 2물리적 쓰레드가 있다면? 두 팔 달린 셰프 1명
      • 2코어 2물리적쓰레드 : 두 팔달린 셰프 2명
      • 2코어 4물리적쓰레드 : 네 팔달린 셰프 4명
        → 이게 바로 하이퍼 쓰레딩 기술
        • 코어가 2개지만 4개라고 속일 수 있는 기술
        • 병렬처리도 4개까지 가능
      • 셰프의 능력은 cpu의 능력이며, 셰프의 수를 정하는건 사장님의 마음 (이윤 vs 인건비)
        • 이렇듯 코어의 수도 cpu 제조사의 마음임

2. 논리적 쓰레드

  • 프로세스 내부에서 실행되는 세부적인 단위
  • 논리적인 쓰레드는 프로그램에서 생성할 수 있는 쓰레드

3. 정리

  • 소프트웨어 쓰레드들은 이렇게 각각 다른 하드웨어 스레드 내에서 돌아가서 병렬처리를 할수 있음

  • 프로세스와 쓰레드는 일정량의 메모리를 점유하기 때문에 메모리가 허용하는 범위 내에서 생성 가능

  • 하지만 병렬로 실행될수 있는 개수는 (코어 개수) × (물리적 쓰레드 개수)
    - 나머지 쓰레드는 유휴상태로 남아있거나 셰프들이 빠르게 교차하면서 여러 요리들을 하는 것임

비동기성 vs 동기성

비동기성

  • 해야할 일을 위임하고 기다리는 방식
  • 회사에서 팀장님이 팀원들에게 일을 배분해놓고 팀장님은 보고만 받는 방식

동기성

  • 순차적으로 일을 끝내 나가는 방식
  • 팀장님이 한사람씩 그 일을 마칠때까지 계속 지켜보면서 기다리는 것.
    • 그 팀원이 일을 마치면 다음 팀원에게 일을 맡김

병렬성과 비동기성의 차이?

  • 둘다 멀티태스킹 느낌이지만, 근본적으로 다른 개념이라 비교하기 어려움.

    • 병렬성은 말그대로 쓰레드나 프로세스에 작업이 2개 이상 동시에 실행되는 것
    • 비동기성은 이전 작업을 기다리지 않고 실행되는 것 뿐임
  • 싱글스레드에서도 부담은 크지만 비동기로 동작할 수 있음.

    • 해당 스레드가 능력이 좋거나 쉬운 일이라면 굳이 팀원 3명에게 일을 따로 가르치고 보고받아서 합치는 것보다 빠를수도 있음.
    • 이것은 상황에 따라 다름.

병렬성 비동기성의 사용 예시

Web을 예시로!!

  • Node.js, Apache 등 Web Framework들은 Multi Client 처리를 위해 다양한 방식을 채택함.
    • Web Server에 하나의 Client에 대한 요청을 처리한다고 다른 Client가 연결을 못하면 안됨.
  • 많은 Client 요청을 처리하기 위해 Node.js와 Apache가 채택한 방식은?

Node.js

  • Javascript와 연관이 있는 Framework인데, Browser에서만 돌 수 있던 Javascript라는 프로그래밍 언어를 Browser 밖으로 꺼내서 유저가 사용하게 해준 것임.

  • 이로써 Javascript 언어로 Frontend뿐만 아니라 Backend도 개발할 수 있게 된 것임.

  • 위에서 Web Framework들은 멀티 클라이언트 처리를 위해 다양한 방식을 채택하였다고 언급하였는데, Node.js는 싱글 쓰레드만으로도 비동기 처리를 가능하게 했음.

  • 바로 ‘이벤트 루프’방식 덕분임.

    • 여기서 싱글스레드는 이벤트 루프가 동작하는 방식을 말하는 것이고, 내부적으로는 멀티 스레드를 사용해서 병렬처리를 하고 있음.
    • 비동기로 동작할 수 있다는 것 자체가 일을 맡길 수 있는 쓰레드나 프로세스가 여럿이 돌고 있다는 뜻.
      • 클라이언트로부터 요청이 들어오면 이벤트 루프가 요청을 Event Queue에 넣음.
      • 들어와 있는 요청들을 이벤트 루프가 순차적으로 Thread Pool에 있는 쓰레드들에게 작업을 할당해줌.
      • 작업이 끝난 이벤트들을 감지하여 해당 콜백을 다시 Event Queue에 집어넣음.
      • 계속 이렇게 이벤트 루프가 돌면서 비동기&병렬적으로 처리를 하는 것임

Apache

  • 아파치 소프트웨어 제단에서 관리하는 HTTP 웹 서버.
  • 구축이 쉽고 무료이기 때문에 세계에서 가장 많이 쓰는 웹 서버중 하나임.
  • Apache는 쓰레드 또는 프로세스 기반 구조로 요청 하나당 쓰레드 하나가 처리하는 구조.
    • 하나의 쓰레드당 하나의 클라이언트라는 구조임.
  • 그래서 Client 동시 접속 개수가 제한되어 있음.
    • 사용자가 많으면 많은 쓰레드 생성, 메모리 및 CPU 낭비가 심하기 때문임

그럼 언제 node.js를 써야하고 언제 Apache를 사용해야 하나?

  • Node.js : 많은 양의 트래픽 + 가볍고 빠르게 끝나는 작업을 다룰때 적합함.
    • 싱글 쓰레드로 Request를 처리하기 때문에 개수에 제한이 없고 오버헤드도 적음.
    • 단, 싱글 쓰레드이기 때문에 Task들 중 하나라도 CPU 작업이 오래걸리는게 있으면 전체가 느려짐.
  • Apache : 유지보수를 생각하면 유리.
    • 요청마다 Thread or Process를 처리해야 하는데 자원이 한정적이기 떄문에 많은 양의 트래픽을 감당하기 어려움.
    • 하지만 옛날부터 개발된 만큼 기능이 많고 강력한 커뮤니티로 인한 방대한 자료가 있기 때문에 초보자에 적합함.
      • 안정성도 높고 디버깅에서도 유리함.



출처

코딩하는 초롱
유셩장

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 6월 19일

병렬성과 동시성 때문에 계속 헷갈려서 방문하게 되었는데 "그림자 분신술" 단어 덕분에 한번에 이해하고 갑니다:)

답글 달기