iOS 프로그래머라면 꼭 이해해야하는 개념들이다.
전에 GCD에 대해서 다룬 적이 있는데, GCD를 사용하기 위해선 동기와 비동기에 대해 이해하고 있어야 한다.
인프런에 무료로 강의를 올려주셨다. 이 강의 내용을 듣고 정리해보았다.
둘 다 다른 쓰레드로 작업을 보내는 것은 동일하다.
동기(Sync)
: 다른 쓰레드로 작업을 보내고, 그 작업이 끝날 때까지 기다린다. 작업이 끝나야 다른 작업을 시작할 수 있다.
비동기(Async)
: 다른 쓰레드로 작업을 보내고, 그 작업이 끝나는 것을 기다리지 않고 다른 작업을 시작한다.
예를 들어보자. 나는 대학교에 있는 프린트집 사장이다. 나에게는 A, B, C,D 복사기가 4대가 있다. 학생 2명이 나에게 300장짜리 복사를 맡겼다.
동기(Sync) 일 경우 : A복사기에 100장 복사를 시작했다. 근데, 다른 복사기를 사용할 수 없다. A 복사기의 복사가 먼저 끝나야 하기 때문이다.
비동기(Async) 일 경우 : A 복사기에 100장 복사를 시작했다. A 복사기의 복사가 끝나는 것에 상관없이 B, C복사기에도 100장 복사를 시작했다.
작업의 순서에만 집중해서 보면, 차이가 극명하게 보일 것이다.
동기는 설계가 간단하고 직관적이지만, 결과가 주어질 때 까지 대기를 해야하는 단점이 있고, 비동기는 설계는 복잡하지만 자원을 효율적으로 사용할 수 있다는 장점이 있다.
동기와 비동기의 개념을 이해했으면 Serial 과 Concurrent에 대해서도 알아보자.
직렬(Serial)
: 분산처리 시킨 작업을 오직 한 개의 쓰레드에서만 처리하는 것이 직렬이다. 즉, A 쓰레드에서 4개의 작업을 분산처리 시켰는데, B 쓰레드에서만 처리하는 것이다.
동시(Concurrent)
: 몇 개의 쓰레드로 분산할지는 시스템이 정하지만, 시스템이 정한 여러개의 쓰레드로 분산 처리하는 것. 작업들이 각자 독립적이지만 유사한 작업들일 때 굉장히 유용하다.(예를 들면 테이블뷰 셀 같은 것들을 서버에서 받아오는 것)
여기서 드는 의문
동시랑 비동기랑 비슷한 개념인가?
직렬은 대체 왜 사용하지? 동시가 모든 경우에 좋아보인다.
동기와 비동기는 메인 쓰레드 에서 대기열을 어떤 방식으로 처리할지 정하는 것.
직렬과 동시는 어떤 대기열을 사용할 지 정하는 것
작동되는 개념이 비슷하다고 절대 혼용하지 말자. 아예 다른 개념이다.
바로 작업의 '순서'가 중요할 때 직렬이 사용된다,
동시는 여러개의 쓰레드에서 분산 작업하기 때문에 순서를 상관하지 않고 쓰레드에 할당된 작업은 각 쓰레드가 모조리 처리한다. 따라서, 만약 어떤 작업이 꼭 먼저 이뤄져야 한다면, 그럴때는 직렬을 사용하는게 좋다.
프로그램의 성능/반응성 을 올리고 최적화를 하기 위해서 하는 것이 동시성 프로그래밍이다.
iOS에서는 GCD, Operation 을 이용하여 동시성 프로그래밍을 한다고 하는데, 내가 개발을 하다가 다루게 될 때 그때 자세히 다룰 것이다!
(GCD는 이미 얘기한 적 있지만 정확히 사용해본 적은 없으므로)