동기 / 비동기 공부 정리

준우·2023년 8월 23일
0

CS 이야기

목록 보기
1/3
post-thumbnail

동시성 프로그래밍 && 병렬 프로그래밍

✅목록

  1. 동시성
  2. 동기 / 비동기

Concurrency Programming : 동시성 프로그래밍

  • 동시성 프로그래밍은 멀티 스레드 환경에서 여러 가지 작업을 동시에 처리하는 기술
    동시성을 이해할려면, 코어와 스레드에 대한 이해가 필요합니다.

Core : CPU에서 실제로 일을 처리하는 부분

  • 코어는 한 번에 한 가지 일만 처리할 수 있음.
  • 만약 코어가 여러 개라면? --> 코어가 여러 개라면 여러 개의 일을 동시에 처리가능

✅ 질문

질문 : 코어가 많으면 무조건 빠른가?

답변 :
1. 코어가 많다고 해서 무조건 빠르지는 않음. 코어가 여러 개라면 코어의 일을 분배를 잘 해야 최적의 성능을 보여줄 수 있음
하지만, 코어의 일을 빠르게 정해주지 않는다면, 하나의 코어보다 처리 속도가 늦어질 수 있음
2. 소프트웨어 중 싱글 코어에만 최적화가 된 소프트웨어가 존재함.
이러한 경우 코어의 갯수에 상관없이 하나의 코어에서 일을 처리하기 때문에 더 빠르다고 할 수 없음.

Thread : 스레드(1) -> 하드웨어의 스레드 / 소프트웨어 스레드로 구분됨.

  • 하드웨어의 스레드 :
    하이퍼스레딩 기술(2)을 이용하여 하나의 코어로 2가지 작업을 동시에 수행할 수 있도록 하는 논리적인 '코어'라고 할 수 있습니다.
    1코어 2스레드라면 실제로 코어는 1개이지만 코어가 2개인 것처럼 작업을 처리하게 됩니다.

  • 소프트웨어의 스레드 :
    소프트웨어에서의 스레드는 논리적인 '스레드'로 프로세스(프로그램) 내부에서의 작업 단위가 되는 가상의 스레드
    스레드는 "프로그램의 작업을 처리하는 녀석들"
    경우에 따라서 스레드는 하나일 수도, 여러 개(멀티 스레드)가 있을 수도 있습니다.
    하나의 스레드가 모든 작업을 처리하는 것보다 여러 개의 스레드에 분산 시켜 작업을 처리하는 것이 효율적일 수 있음.

병렬 프로그래밍

  • 여러 개의 CPU(코어)가 하나의 작업(Task)을 분담해서 처리하는 것
  • 병렬 프로그래밍은 물리적인 개념으로 CPU(코어)가 여러 개 있을 때에 가능함
  • 싱글 코어에서는 병렬 프로그래밍을 할 수가 없습니다. 왜냐하면 병렬 프로그래밍은 실제로 동시에 작업을 처리하는 것이기 때문입니다. --> 싱글은 혼자이며, 코어는 한 번에 한 가지 일만 처리할 수 있음(이 사실을 있지 말자)

직렬성 프로그래밍

  • 단 하나의 스레드에서만 작업을 하는 것
  • 동시에 작업을 처리하지 못하고, 순서대로 작업을 처리해야함.

병렬 / 동시성 프로그래밍에 대한 오해

1️. 동시성 프로그래밍은 병렬 프로그래밍과 반대되는 개념은 아닙니다.

  • 병렬 프로그래밍은 다중 코어를, 동시성 프로그래밍은 다중 스레드를 활용하는 것이며 이 둘은 동시에 일어날 수도 있습니다.
  • 어떤 코어에서, 어떤 스레드에서 작업을 처리해줄지에 대해서는 직접 구현할 일이 없고 시스템이 알아서 처리해줄 것이기 때문입니다.

2️. 여러 가지 일을 여러 개의 코어에서 담당하는 것은 병렬 프로그래밍이 아닙니다.
정확히는 병렬 프로그래밍일 수도 있고, 아닐 수도 있습니다.

  • 병렬 프로그래밍은 한 가지의 일을 여러 코어가 분담해서 하는 것입니다. 이 상황은 각 코어가 일을 하나씩 맡아서 처리하는 상황일 뿐입니다.

동기(Synchronous) / 비동기(Asynchronous)

동기 - Synchronous

  • 동기 프로그래밍은 작업이 끝나기를 기다리는 것
  • 동기로 처리되는 작업은 무조건 작업이 종료되길 기다리게 되니 작업이 종료된 후에 할 일을 정해줄 수 있음

비동기 - Asynchronous

  • 비동기 프로그래밍은 작업이 끝나기를 기다리지 않고, 다음 코드 블록을 바로 실행시키는 것
  • 비동기의 경우에는 언제 작업이 종료되는지를 알 수 없기 때문에, 작업이 끝나기를 기다리지 않음

둘의 차이점은 실행 종료 시점을 알 수 있는가?로 구분되어짐

동시성과 동기/비동기의 개념 이해 정리

  • 동시성: Serial이냐, Concurrent인가는 스레드가 단일 스레드인가, 다중 스레드인가의 구분
  • 동기/비동기: 스레드의 수와는 무관하게 작업이 끝나기를 기다리냐, 기다리지 않느냐의 구분

동시성 프로그래밍은 왜 필요할까?

1️. 효율적으로 동작하는 소프트웨어
동시성 프로그래밍은 여러 개의 스레드를 이용해서 일을 나누어 효율적인 작업 처리를 할 수 있게 합니다. 동시성 프로그래밍을 하지 않으면 모든 일을 하나의 스레드에서 담당하게 됩니다.

2️. 사용성, 반응성이 좋은 소프트웨어
효율적으로 동작한다는 이점은 결국 사용성, 반응성이 좋아진다로 귀결됩니다. 우리는 동시성 프로그래밍을 통해 사용자들에게 보다 나은 사용성을 제공할 수 있습니다.

참고

  1. 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위

  2. 하이퍼스레딩 기술(=Hyper-Threading Technology) : 1코어를 가지고 있는 CPU를 2코어 CPU로 만들어주는기술

  • 실제로 하이퍼스레딩 기술을 적용을하면, 마치 듀얼 CPU를 쓰는듯한 효과를 가져올수 있음
  • 그러나 1코어를 2개로 나눈 기술이다보니 진정한 듀얼 코어의 성능을 바라긴 힘듭니다.
  • 전체적인 점유율이 50%만 넘어도 벌서 코어성능을 100%사용하고있기 때문이죠
  • 결과적으로는 프로그램이 지원을 한다면 성능향상이 이뤄지지만, 지원을 안하면 비슷하거나 오히려 성능이 낮아진다.

관련 자료 주소 : https://yagom.net/courses/동시성-프로그래밍-concurrency-programming/lessons/동시성-프로그래밍/topic/코어와-스레드/

0개의 댓글