[iOS] Concurrency Programming (동시성 프로그래밍) 1 : Sync (동기), Async (비동기)

2023. 3. 15. 02:24iOS/iOS

728x90
반응형

👉 시작

프로그래밍을 하면서 가장 어려웠던 부분이 비동기 처리였던 거 같다.

예전에 비동기라는 개념을 몰랐던 학생시절에 프로젝트를 만들면서 엄청난 고생을 했던 적이 떠오른다 ,, ㅎㅎ

서버와 통신하면서 반드시 필요한 비동기처리,, 

iOS에서 비동기를 처리할 때 GCD를 사용하여 구현한다.

디스패치큐와 컴플리션 블럭을 활용하여 처리한다.

그렇다면 비동기와 비슷하게 생긴 동시성은 무엇인가?

이번에는 동기와 비동기, 직렬과 동시에 대해서 알아보았다.

 

 


👉  Sync (동기) / Async (비동기)

✔️ Sync (동기)

  • 프로그램의 흐름과 이벤트의 발생 및 처리를 종속적으로 수행하는 방법이다.
  • 작업이 끝나는 것을 기다린 후 다음 작업을 처리한다.
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        DispatchQueue.global().sync {
            self.function1()
        }
        DispatchQueue.global().sync {
            self.function2()
        }
        DispatchQueue.global().sync {
            self.function3()
        }
    }
    
    func function1() {
        print("메소드1 시작")
        sleep(2)
        print("메소드1 완료----1-----")
    }
    
    func function2() {
        print("메소드2 시작")
        print("메소드2 완료----2-----")
    }
    
    func function3() {
        print("메소드3 시작")
        print("메소드3 완료----3-----")
    }
}
  • sync 를 이용하여 동기로 실행한다.

결과는 완료가 되어야 시작을 할 수 있는 것을 볼 수 있다.

 

 

✔️ Async (비동기)

  • 프로그램의 흐름과 이벤트의 발생 및 처리를 독립적으로 수행하는 방법이다.
  • 작업이 진행되는 동안에 다른 작업을 할 수 있다.
DispatchQueue.global().async {
    self.function1()
}
DispatchQueue.global().async {
    self.function2()
}
DispatchQueue.global().async {
    self.function3()
}
  • async 를 이용하여 비동기로 실행

다른 메소드의 처리에 영향을 미치지 않는다.
시작과 상관없이 완료가 되는 것을 볼 수 있다.

 

 

 

👉  Serial (직렬성) / Concurrent (동시성) / Parallel (병렬성)

✔️ Serial (직렬성)

  • 큐에 들어온 작업을 하나의 쓰레드에서 수행하는 방법이다.
  • 순차적으로 실행하여 순서가 중요한 작업을 처리할 때 사용한다.
순차적으로 진행되는 것은 Sync(동기)도 순차적으로 볼 수 있는 것이 아닌가?
여기서 Serial은 순차적! 앞의 작업이 완료되면 뒤의 작업을 실행하는 개념이고
Sync는 작업이 완료될 때까지 기다린다! 라는 개념이다.
순차에 대한 개념은 동기 비동기와 관련이 없다.

 

✔️ Concurrent (동시성)

  • 큐에 들어온 작업을 여러 개의 쓰레드에서 수행하는 방법이다.
  • 여러 개의 작업이 논리적인 관점에서 동시에 수행되는 것처럼 보이도록 한다.

 

✔️ Parallel (병렬성)

  • 여러 개의 작업이 물리적인 관점에서 동시에 수행되는 방법이다.
병렬성은 실제로 동시에 실행되는 것을 의미하고
동시성은 실제로는 동시에 실행되는 것이 아닌 그렇게 보이게 하는 것이다.

 

✔️ Concurrent (동시성)과 Parallel (병렬성) 차이

예를 들어 맥도날드에서 햄버거를 만든다고 가정하면

병렬성은 직원 3명이 불고기 버거 3개를 만드는 것이고

동시성은 직원 1명이 불고기 버거 3개를 동시에 만드는 거처럼 보이는 것이다.

여기서 병렬성은 동시에 버거 3개가 만들어지지만 동시성은 동시에 만드는 거처럼 보이지만 실제로는 손이 세개가 아니니까 그렇게 보이는 것일 뿐이다.

동시성은 싱글코어 및 멀티코어 둘 다 구현가능하지만 병렬성은 멀티코어에서만 구현가능하다.

 

 

 

👉 그러면 Concurrent(동시성)은 Async(비동기)와 같은 걸까 ?

그것은 아니다.

동시성 프로그래밍을 처리하기 위해서 비동기을 사용하는 것이다.

동시성은 말 그대로 동시에 하기 위해서 처리하는 것이고 비동기는 다른 처리에 영향을 미치지 않게 하는 일이다.

그러니까 일을 동시에 하기 위해서 다른 처리에 영향을 미치게 하지 않게 하는 것이다.

Sync(동기)와 Serial(직렬성) 의 개념이 다른 것 처럼 

Async(비동기)는 작업이 완료될 때까지 기다리지 않고 다른 작업을 시작한다는 개념이고

Concurrent(동시성)은 큐에 들어온 다른 작업들은 여러 개의 쓰레드에서 동시에 시작한다는 개념이다.

 

 

 


📂 정리

Sync (동기) Async (비동기)
요청에 대한 응답이 끝날 때까지 기다린다. 요청에 대한 응답이 끝나는 것과 상관없이 진행한다.

 

Concurrent (동시성) Parallel (병렬성)
싱글 코어 및 멀티 코어 멀티 코어

 

 

 

 

👉 다음 글

 

[iOS] Concurrency Programming (동시성 프로그래밍) 2 : GCD, DispatchGroup, DispatchWorkItem

👉 시작 2023.03.15 - [iOS/iOS] - [iOS] Concurrency Programming (동시성 프로그래밍) 1 : Sync (동기), Async (비동기) [iOS] Concurrency Programming (동시성 프로그래밍) 1 : Sync (동기), Async (비동기) 👉 시작 프로그래밍

nlestory.tistory.com

 

 

 

 

 

 

 

 

 

 

 

[참고자료]

https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html

 

Introduction

Introduction Concurrency is the notion of multiple things happening at the same time. With the proliferation of multicore CPUs and the realization that the number of cores in each processor will only increase, software developers need new ways to take adva

developer.apple.com

 

 

 

 

728x90
반응형