동시성 프로그래밍과 비동기 프로그래밍 개념 알아보기

고라니·2023년 8월 18일
0

TIL

목록 보기
23/67

개발관련 공부를 하다보면 동시성, 동기, 비동기 같은 용어들을 자주 듣게 된다.
동시성프로그래밍은 다양한 작업을 효울적으로 처리하고, 반응성을 유지하며, 성능을 최적화하는 등 앱의 품질과 사용자 경험을 크게 향상시킬 수 있는 개념으로 이번에는 활용하는 방법보다는 이와 관련된 개념들에 대해 알아보도록 하겠다.

프로세서, 코어, 프로그램, 프로세스, 스레드

프로세서

프로세서는 컴퓨터의 중앙처리장치 또는 CPU(Centarl Processing Unit)로서, 컴퓨터의 계산과 제어를 수행하는 핵심 부품이다. 프로세서는 컴퓨터의 주요한 계산 작업을 담당한다. 명령어를 해석하고 실행하여 프로그램의 동작을 제어하며, 데이터를 처리하고 저장장치와의 상호작용을 관리한다.

코어

코어는 프로세서 내부의 실행 단위이다. 하나의 프로세서에는 하나 이상의 코어가 포함된다. 각 코어는 독립적으로 작업을 수행할 수 있는 "작은 프로세서"라고 이해할 수 있다. 즉 멀티코어 프로세서는 여러 개의 코어가 하나의 칩 안에 내장되어 있으며, 각 코어는 별도의 작업을 처리할 수 있다.

멀티코어 프로세서는 병렬성을 활용하여 여러 작업을 동시에 처리하는데 사용된다. 각 코어는 독립적으로 작업을 처리하기 때문에 싱글코어 프로세서와 비교했을때 성능적 이점이 크다.

즉 프로세서는 컴퓨터의 계산과 제어를 수행하고, 코어는 프로세서 내부의 실행 단위를 독립적으로 작업을 수행하는 작은 프로세서라고 이해하면 된다.

가정용 컴퓨터나 대다수의 컴퓨터 및 노트북은 주로 하나의 CPU에 여러개의 코어를 탑재한 멀티코어 프로세서이고, 주로 고성능 서버나 특수한 워크스테이션, 연구용 컴퓨터 등에서는 여러 개의 물리적인 CPU를 탑재한 멀티프로세서 시스템을 많이 사용한다.

프로그램과(Program) 프로세스(Process)

  • 프로그램: 저장 장치에 저장된 명령어들의 집합으로 실행되지 않는 상태의 소프트웨어를 말한다.
  • 프로세스: 프로그램이 실행될 때 운영체제에 의해 메모리에 로드되고 실행되는 상태. 자신만의 메모리 영역, 프로그램 카운터, 레지스터 상태등을 가지고 있다.

동시에 여러 개의 프로세스를 운영하는 시분할 방식을 멀티태스킹이라고 하며 분할 작업은 운영체제에서 적절하게 처리한다. (시분할 방식은 여러 프로세스를 빠르게 번갈아가며 작업하여 동시에 작업이 되는것처럼 보이게 한다.)

스레드(Thread)

프로세스 내에서 실행되는 작은 실행 단위. 모든 프로세스는 적어도 하나 이상의 스레드를 가지고 있음. 스레드는 같은 프로세스의 메모리를 공유하기 때문에, 프로세스 간의 통신보다 스레드 간의 통신이 더 빠르고 효율적이다.
이렇게 프로세스 환경에서 둘 이상의 스레드를 동시에 실행하는 방식을 멀티스레딩이라고 한다. 프로그램 실행이 시작될 때부터 동작하는 스레드를 메인스레드 라고 하며, 이후 생성되는 스레드를 서브 스레드 또는 세컨더리 스레드라고 한다.


동기(Sync)와 비동기(Async)

  • 동기: 프로그램의 흐름과 이벤트의 발생 및 처리를 종속적으로 수행하는 방법, 해당 작업이 끝날때까지 블락상태로 기다린다, 해당 작업이 완료될 때 까지 다음 작업 진행 x

  • 비동기: 프로그램의 흐름과 이벤트의 발생 및 처리를 독립적으로 수행하는 방법, 해당 작업이 얼마나 걸리든 기다리지 않는다. 메인 스레드가 다은 일 처리를 바로 시작할 수 있음

일반적으로 비동기 개념이 필요한 이유는 대부분 서버와의 통신 때문이다(네트워크 작업)

더 자세히 이해하기

동기, 비동기에 대한 설명들을 보면 조금씩 다르게 설명하여 헷갈리는 부분이 생겨 좀더 알아보았다.

첫 번째 설명: 비동기는 해당 작업을 다른 스레드로 보내고 바로 리턴하여 다른 작업을 수행한다. 반면 동기는 다른 스레드로 작업을 보내고, 해당 작업이 끝날때까지 블락상태로 기다린다. 그리고 해당 작업이 완료되면 다음 작업을 실행한다.

두 번째 설명: 첫 번째 설명과는 다르게 다른 스레드로 보내지 않고 하나의 스레드에서의 상황을 설명한다. 동기는 작업을 종속적으로, 순차적으로 실행하고, 비동기는 작업이 끝나지 않아도 다른 작업이 언제든 실행가능한 방식으로 설명한다.

설명이 조금 달라서 헷갈리지만 두 경우 모두 동기 비동기의 예이다.
첫 번째 방법은 보통 외부 리소스를 사용하는 작업처럼 자주 지연이 발생하고 완료까지 시간이 걸리는 경우에 유용한 방식이다. 두 번째 방법은 주로 CPU 연산이 많은 작업을 다룰 때 유용하다. 하나의 스레드에서 여러 작업을 번갈아가며 처리하면서, 작업 간의 의존성이 낮은 경우에는 비동기 작업을 만들지 않도고 동시성을 화용 할 수 있다.

즉 핵심은 해당 작업이 완료될 때 까지 기다리는지, 안기다리는지 의 여부에 따라 동기와 비동이의 작업방식을 구분한다.


동시성(Concurrency)프로그래밍

여러 작업이 번갈아가며 실행되는 것처럼 보이는 상태. 실제로는 동시에 실행되지 않더라도, 사용자나 다른 시스템에게는 동시에 실행되는 것처럼 보일 수 있다.

그렇다면 동시성 프로그래밍은 싱글코어의 한계를 극복하기 위한 방법인가?라는 생각이 들어서 멀티코어 환경에서 동시성이 어떤 의미가 있을지 알아보았다.

멀티코어 환경에서의 동시성의 의미

  1. 코어 수보다 많은 작업(듀얼코어라고 가정할 때 작업 수가 두개 이상이라면 결국 동시성 방식 필요)
  2. 리소스 공유: 멀티코어 프로세스에서도 모든 코어가 모든 리소스를 독립적으로 갖고 있지는 않음, 한 작업이 리소스를 기다리는 동안, 다른 작업을 실행하는 것이 더 효율적일 수 있음
  3. 부하 분산: 특정 코어에 많은 부하가 집중되지 않도록 작업을 균등하게 분산하는게 중요
  4. 응답 시간 최적화: 실시간 시스템이나 사용자 응답을 기다리는 작업에서는, 한 작업이 오랫동안 CPU를 독점하면 안됨. 이런 경우에 동시성을 통해 여러 작업이 번갈아가며 빠르게 실행되도록 관리 필요

병렬성(Parallelism)프로그래밍

물리적으로 동시에 실행되는 것을 말한다. 멀티코어에서 멀티 스레드를 동작시키는 방식으로 데이터 병렬성(Data Parallelism)과 작업 병렬성(Task Parallelism)구분 됨

  • 데이터 병렬성: 전체 데이터를 나누어 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리해서 작업을 빠르게 수행하는 방법, 즉 하나의 작업을 여러 개의 작은 부분으로 나누어 동시에 처리하는 것이다. 이때 각각의 작은 부분에 동일한 작업을 적용하여 결과를 얻는다. 컴퓨터가 데이터의 일부분을 동시에 처리하여 전체 작업을 빠르게 완료한다.

  • 작업 병렬성: 서로 다른 작업을 병렬 처리하는 방법 즉, 각 작업은 서로 독립적이어서, 하나의 작업이 다른 작업의 결과에 의존하지 않는다. 컴퓨터가 각 작업을 번갈아가며 처리하여 빠르게 여러 작업을 완료한다.


마치면서

동시성과, 동기, 비동기와 관련된 여러 개념에 대해 알아보았다. 개념을 알고보니 복잡하기도 하지만 정말 중요한 개념인듯 하다. 특히 iOS에서는 메인 스레드가 UI를 비롯한 많은 작업을 하기 메인 스레드의 작업 분산처리가 필요하다.
그렇기 때문에 동시성 프로그래밍은 성능 / 반응성/ 최적화와 관련이 있다. 최적화를 위해 분산처리를 해야하고 이것을 iOS프로그래밍에서 GCD나 Operation을 통해 효과적으로 제어한다. 다음에는 이 두 개념에 대해 알아보겠다.

profile
🍎 무럭무럭

2개의 댓글

comment-user-thumbnail
2023년 8월 18일

많은 것을 배웠습니다, 감사합니다.

1개의 답글