Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[레벨 0] 4주차 8. 동시성 프로그래밍의 개념과 iOS에서의 동시성 처리 방식에 대해 설명해주세요. #8

Open
longlivedrgn opened this issue May 1, 2024 · 6 comments
Assignees
Labels

Comments

@longlivedrgn
Copy link
Contributor

  • 병렬 처리와 동시 처리의 차이, iOS에서의 멀티코어 활용 방안에 대해 설명해주세요.
@longlivedrgn longlivedrgn self-assigned this May 1, 2024
@longlivedrgn
Copy link
Contributor Author

병렬 처리와 동시 처리의 차이, iOS에서의 멀티코어 활용 방안에 대해 설명해주세요.

  • 병렬 처리
    • 여러 작업이 실제로 동시에 처리되는 것이다.
    • 여러 CPU 코어를 사용하여 한번에 여러 작업을 하는 것이다.
      • 다중 코어
  • 동시 처리
    • 여러 작업이 동시에 처리되는 것처럼 보이게하는 것이다.
    • 하나의 CPU에서 여러 작업이 번갈아가며 실행되는 것을 의미한다.
    • 이는 단일 CPU 시스템에서 발생할 수 있는 형태이며, 작업 간에 작은 시간 간격으로 전환되어 실행됩니다.
      • 여러 Thread를 활용해서 작업을 처리한다.

동기 VS 비동기

  • 동기는 하나의 작업이 끝나기 전까지 기다리는 것
  • 비동기는 작업이 끝나기를 기다리는 것이 아니라, 다음 코드 블럭을 바로 실행한다.

멀티 프로세싱

  • 서로 다른 여러 개의 CPU(Processor)가 하나의 작업을 서로 협력해서 처리하는 것

멀티 코어란?

  • 코어

    • 중앙 처리 장치 중에서 가장 핵심이 되는 부품으로, 기본 연산과 계산 작업을 수행한다.
  • CPU ≠ 코어(현재에 와서는)

  • 멀티 스레딩

    • CPU가 한 프로세스의 여러 작업을 동시에 실행할 수 있도록 하는 기술

in DispatchQueue

  • Serial/Concurrent

    • Serial
      • 단일 스레드만을 활용한다.
      • 작업 순서가 중요할 경우 활용한다.
    • Concurrent
      • 다중 스레드를 활용한다.
  • global/main

    • main
      • serial queue이다.
      • 순서대로 queue에 있는 작업들을 처리한다.
    • global
      • concurrent queue이다.
  • DispatchQueue.global().sync {} ⇒ concurrent + 동기

    • 원래의 작업이 진행되고 있던 곳(메인 스레드)에서 global 큐로 보낸 작업이 끝낼 때까지 기다린다.
    • main 스레드 말고 새로운 스레드를 만들어서 작업을 한다.
    • 현재 나의 작업이 끝날 때까지 기다려야한다.
  • DispatchQueue.global().async {} ⇒ concurrent + 비동기

    • 원래의 작업이 진행되고 있던 곳(메인 스레드)에서 global 큐로 보낸 작업이 끝낼 때까지 기다리지 않는다.
    • main 스레드 말고 새로운 스레드를 만들어서 작업을 한다.
    • 다음 작업이 있으면 현재 나의 작업을 기다리지말고 처리를 한다.
    • async를 만나면 DispatchQueue에 코드를 넘겨주고, 바로 다음 코드로 넘어간다.

async vs sync

작업을 보내는 시점에서 기다릴지 말지에 대해 다루는 것

concurrent vs serial

Queue(대기열)로 보내진 작업들을 여러개의 스레드로 보낼 것인지 한개의 스레드로 보낼 것인지에 대해 다루는 것

즉, 비동기가 항상 concurrent한 것은 아니다!!

따라서 비동기지만 serial할 수 있다!

@ohdair
Copy link

ohdair commented May 7, 2024

블로그 기재

@llimental
Copy link

1. 병렬 처리와 동시 처리의 차이, iOS에서의 멀티코어 활용 방안에 대해 설명해주세요.

1-1) 동시성 프로그래밍

  • 동시성 프로그래밍은 동시에 여러 작업을 수행하는 프로그램을 개발하는 것을 의미합니다. 동시성은 다음과 같은 몇 가지 주요 개념을 가집니다.

  • 스레드: 프로그램 내에서 독립적으로 실행되는 작은 실행 단위입니다. 하나의 프로세스 내에서 여러 스레드를 사용하여 동시성을 구현할 수 있습니다.

  • 동시성 vs 병렬성: 동시성은 여러 작업이 동시에 진행되는 것처럼 보이지만, 하나의 프로세서에서 번갈아가며 실행됩니다. 그러나 병렬성은 여러 작입이 실제로 동시에 여러 프로세서에서 실행되는 것을 의미합니다.

  • 공유 자원과 동기화: 여러 스레드가 공유 자원에 접근할 때 데이터 일관성 문제가 발생할 수 있습니다. 동기화 기법을 사용하여 공유 자원에 대한 접근을 조절하고, 데이터의 일관성을 유지합니다.

  • 데드락과 경쟁 조건: 동시성 프로그래밍에서 주의해야 할 문제로는 데드락과 경쟁 조건이 있습니다. 데드락(교착상태)는 두 스레드가 서로 상대방의 작업이 끝나기를 기다리면서 멈춰있는 상태를 말하며, 경쟁 조건은 여러 스레드가 공유 자원에 대해 경쟁하며 원치 않는 결과가 발생하는 상황을 의미합니다.

  • 동시성 제어 기법: 동시성을 다룰 때 사용되는 여러 가지 기법이 있습니다. 뮤텍스, 세마포어, 스핀락 등이 포함됩니다.

  • 뮤텍스(Mutex): 상호배제를 위한 동기화 기법 중 하나로, 공유 자원에 대한 동시 접근을 제어합니다. 임계 영역에 진입하기 전에 먼저 락을 얻어야 하며, 임계 영역을 빠져나올 때 락을 해제해야 합니다. 이를 통해 임계 영역에 한 번에 하나의 스레드만 접근할 수 있도록 합니다.

  • 세마포어(Semaphore): 동시에 여러 스레드가 특정 자원에 접근하는 것을 허용할 수 있습니다. 정수형 변수로, 이 값에 따라 동시 접근 스레드의 수를 조절합니다.

  • 스핀락(Spinlock): 락을 얻을 때까지 반복적으로 락을 시도하는 무한 반복 루프를 돌면서 대기하는 동기화 기법입니다. 다른 스레드가 락을 해제할 때까지 계속 CPU를 점유하며, 대기 시간이 짧을 때 유용합니다. 다만 락을 얻을 때까지 반복하기에 CPU 자원을 낭비할 수 있는 단점이 있습니다.

1-2) 병렬 처리

  • 병렬 처리(Parallel Processing)은 여러 작업을 동시에 실행하여 시간을 절약하거나 성능을 향상시키는 것을 말합니다. 하나의 시스템에서 여러 개의 프로세서나 코어가 동시에 여러 작업을 수행함으로써 이루어집니다. 동시 처리와 다르게 실제로 동시에 여러 작업이 진행되는 것을 의미하고(여러 개의 프로세스 또는 스레드가 실행)의미하고, 여러 작업을 동시에 수행하여 성능을 향상시키는데 주로 사용되기에 대용량 데이터 처리, 과학 및 엔지니어링 시뮬레이션, 그래픽 처리 등에 활용됩니다.

1-3) 동시 처리

  • 동시 처리(Concurrent Processing)는 여러 작업이 동시에 실행되는 것처럼 보이지만, 실제로는 병렬적으로 실행되는 것이 아니라 번갈아가며 실행되는 것을 말합니다. 보통 한 개의 프로세서나 코어에서 여러 작업을 번갈아 가면서 처리하며, 시간 분할을 통해 각 작업에 CPU 시간을 할당합니다. 여러 작업을 동시에 처리하는 것이 아니라 여러 작업을 번갈아 가면서 처리함으로써 효율적으로 시스템 자원을 활용하는 데 사용되고 이러한 점에서 병렬 처리와 차이점이 있습니다. 멀티태스킹 운영 체제에서 여러 응용 프로그램이 동시에 실행되는 것을 동시 처리라고 합니다.

1-4) iOS에서의 멀티코어 활용 방식

  • 멀티스레딩: GCD나 Operation Queue를 사용하여 멀티스레딩을 구현할 수 있습니다. 병렬로 실행될 수 있는 작업들을 백그라운드 스레드에서 처리하여 UI를 차단하지 않고 애플리케이션의 반응성을 유지할 수 있습니다.
  • GPGPU(General-Purpose computing on Graphics Processing Units) 활용: iOS에서는 Metal 프레임워크를 사용하여 그래픽 처리 장치를 활용하여 일반 계산 작업을 수행할 수 있습니다. GPU를 사용하여 병렬 계산을 수행하면 CPU보다 더 빠르고 효율적으로 작업을 처리할 수 있어 게임, 그래픽 애플리케이션, 머신 러닝 등 작업을 최적화하는데 사용됩니다.
  • 코어 데이터 병렬 처리(Core Data Concurrency): Core Data Programming Guide - Concurrency

@SunnnySong
Copy link

1️⃣ 병렬 처리와 동시 처리의 차이, iOS에서의 멀티코어 활용 방안에 대해 설명해주세요.

병렬성(Parallelism)

  • 멀티 코어에서 멀티 스레드를 동작시키는 방식이다.
  • 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행된다.
  • 물리적 개념으로 여러 개의 코어가 있을 때 동작이 가능하다. 싱글 코어에서는 동작이 불가하다.

동시성(Concurrency)

  • 싱글 코어에서 멀티 스레드를 동작시키는 방식이다.
  • 멀티 태스킹을 위해 여러 개의 스레드가 ‘번갈아가면서’ 실행된다.
    • 동시에 동작하는 것 처럼! 보이지만 실제 동시에 작동되는 것은 아니다.
    • 논리적 개념의 스레드를 이용하기 때문에 싱글 코어에서도 작동이 가능하다.
  • Swift에서는 GCD, Operation, Async/await로 구현할 수 있다.

iOS 멀티코어 활용 방안

  • GCD(Grand Central Dispatch)
    • Dispatch Queue에 Task를 추가해 멀티코어에 코드를 실행하는 방법이다.
    • Serially or Concurrency하게 작업을 실행할 수 있다.
    • Dispatch Queue에 들어있는 작업들은 시스템이 관리하는 스레드풀에서 실행된다.
  • Operation Queue
    • Operation 객체들을 우선순위(priority)에 의해 실행시키는 큐이다.
  • Async/await
    • Swift 컴파일러가 비동기 함수를 실행할 때 필요한 스레드 및 관련 자원을 자동으로 할당한다.
      • 비동기 코드를 만날 경우, 스레드 제어권을 시스템에게 반납한다.

@qwerty3345
Copy link
Member

병렬 처리와 동시 처리의 차이, iOS에서의 멀티코어 활용 방안에 대해 설명해주세요.

  • 병렬 처리는 물리적인 개념으로, 실제 여러 코어에서 여러 스레드가 동작하며 동시여 여러가지 작업을 수행하는 것을 말하고,
  • 동시 처리는 논리적인 개념으로, 물리적인 코어와 상관없이 개념적으로 멀티스레딩을 지원하는 것을 말합니다.
  • iOS개발자 관점에서 병렬처리는 사실 신경 쓸 필요가 없고, 동시성 측면을 주로 신경쓰며 개발하게 됩니다.
  • 우리가 많이 사용하는 Swift Concurrency / GCD / Combine / OperationQueue 등이 모두 이 동시성을 지원하기 위한 기술이라 할 수 있습니다.

@soo941226
Copy link

병렬 처리와 동시 처리의 차이, iOS에서의 멀티코어 활용 방안에 대해 설명해주세요.

  • 단어를 뜯어보면,
    • 병렬은 일을 실행하는 주체가 여러개임
    • 동시는 일을 실행하는 주체가 특정되지 않음
  • 병렬처리는 일을 실행하는 주체가 여러개이기 때문에, 물리적으로 동일한 시간에 여러개의 이벤트가 함께 처리됨
    • 현실에서 사람이 오감을 사용하거나, 사람끼리 상호작용을 하는 등 같은 시간(yyMMdd-hh:mm:ss~~)에 여러개의 이벤트가 함께 처리 됨
  • 동시처리는 물리적으로 동일한 시간에 여러개의 이벤트가 처리가 될 수도 있으면서, 찰나의 순간에 여러개의 이벤트가 처리 될 수 있음
    • 휴대폰이랑 컴퓨터로 동시에 게임을 하는 사람 -> 병렬로 처리가 되는 순간도 있으면서,
    • 게이머가 판단을 하거나 처리를 하는 동안에는 각 게임이 병렬로 처리 될 수 없음. 하지만 동시에 진행하기는 함
  • iOS에서는 크게 NSThread, GCD, OperationQueue, Swift concurrency 등을 활용하여 동시성 처리를 할 수 있음

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants