iOS Concurrency 동시성 프로그래밍


Published on December 19, 2021 by Hyle

iOS개발자 되기

2 min READ

동시성 프로그래밍

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

CPU: Central Processing Unit

코어

싱글코어

한명이 그림판 -> 유튜브 -> 인터넷 순서대로 일을 함!

듀얼코어

두명이 그림판, 유튜브, 인터넷을 분업해서 함

스레드

한개의 코어가 n개인 코어인 것처럼 속이는 것

복사기가 8대나 있는데 왜 한 대의 복사기만 사용해?

💡 다른 복사기도 사용해보자!

어떻게 작업을 다른 쓰레드에서 동시에 일을 처리할 수 있을까? 💡 1번 쓰레드에 있던 작업을 대기행렬/큐에 넣어주자!

Gcd / Operation

  • 직접적으로 쓰레드를 관리하지 않고, “큐” 대기열/대기행렬 이라는 개념을 이용하여 작업을 분산 처리한다.
  • GCD / Operation을 사용해 시스템에서 알아서 쓰레드 숫자를 관리한다.(직접 쓰레드를 생성하는 것은 하드웨어나 일의 부하(load)와 같은 시스템에 대한 지식없이 사용하면, 오히려 앱이 느려질 수 있음)
  • 쓰레드 보다 더 높은 레벨 / 차원에서 일을 한다고 보면됨
  • 쉽게 다른 쓰레드에서 (오래걸리는) 작업들이 “비동기적으로 동작”하도록 만들어 줌 (어떤 API들은 내부적으로 다른 쓰레드에서 비동기적으로 실행되도록 설계되어 있음)

어떻게 큐로 보낼까?

// 글로벌 큐에 비동기적으로 보낼 거다.
DispatchQueue.global().async{
    // 작업들을
}

or

let queue = DispatchQueue.global()
queue.async {

}

하나의 클로저에 들어간 작업은 동기적으로 동작한다.

비동기함수GCD Operation
작업의 크기간단한 일 복잡한 일
작업의 종류함수를 사용하는 작업(메서드 위주)+ 여러가지 기능 ->데이터와 기능을 캡슐화한 객체
   취소 / 순서지정 / 일시중지 (상태추적)
   재사용 용이성
  프로젝트 효율성이나 사례 적합성을 따져 적절히 사용 

동기 vs 비동기

Synchronous vs Asynchronous

동기

다른 쓰레드에게 일을 시키고 작업이 끝날 때까지 보고있는다.(기다린다.) (실질적으로는 메인쓰레드에서 일한다.)

DispatchQueue.global().sync {

}

비동기

다른 쓰레드에게 일을 시키고 작업이 끝날 때까지 내 할 일 한다.(기다리지 않는다.) -> 메인쓰레드가 다른 일 처리를 시작할 수 있다.

DispatchQueue.global().async {

}

비동기 라는 개념이 일반적으로 필요한 이유는?

대부분은 서버와의 통신 때문(네트워크와 관련된 작업들은 내부적으로 비동기적으로 구현)

직렬 vs 동시

Serial vs Concurrency

  • Serial queue 다른 한 개의 쓰레드에서 분산 처리
-> 순서가 중요한 작업을 처리할 때 사용 - Concurrency queue   > 다른 여러 개의 쓰레드에서 분산 처리

-> 각자 독립적이지만, 유사한 여러개의 작업을 처리할 때 사용

비동기란 말과 동시란 말이 같은 말인가?

비동기 vs 동기

작업을 보내는 시작 점에서 기다릴지 말지

직렬 vs 동시

대기열로 보내진 작업이 한 개의 쓰레드로 처리할 것 인지 여러 개의 쓰레드로 처리할 것 인지

비동기적으로 사용할 때 같은 큐를 반복하여 사용하면 동기적으로 동작하게 됨. ```

More

엘런님의 인프런 강의 를 보고 정리한 내용입니다.