본문 바로가기
개발 블로그/아이폰개발

[iOS GCD(Grand Central Dispatch)] 기본 1 단계

by snapshot 2019. 12. 30.

디스패치 큐(Dispatch Queues)란?

 

디스패치 큐는 실행할 작업을 저장하는 큐이다. 큐 이기 때문에 선입선출로 작업을 실행한다. 간단히 블록 구분으로 되어 있고

DispatchQueue.main.async {} 로 디스패치 큐에 추가 할 수 있다. 

 

 

디스패치 큐는 두 종류가 있다.

하나는 순차적으로 실행하는 디스패치 큐이다. 현재 동작하고 있는 작업이 있다면 다른 작업은 시작하지 않는다.

 

 

 

다른 하나는 동시에 일어나는 디스패치 큐이다. 이것은 기다리지 않고 실행을 한다.

 

 

 

시리얼 디스패치 큐

 

let sirialQueue = DispatchQueue(label: "free")

sirialQueue.async { print("blk1") }
sirialQueue.async { print("blk2") }
sirialQueue.async { print("blk3") }
sirialQueue.async { print("blk4") }
sirialQueue.async { print("blk5") }
sirialQueue.async { print("blk6") }
sirialQueue.async { print("blk7") }


blk1
blk2
blk3
blk4
blk5
blk6

한 번에 하나의 작업만 실행을 하고 결과값은 항상 같다.( 단일 쓰레드 )

 

 

 

컨커런트 디스패치 큐

let concurrentQueue = DispatchQueue(label: "concurrentFree", attributes: .concurrent)
concurrentQueue.async {print("blk1")}
concurrentQueue.async {print("blk2")}
concurrentQueue.async {
    
    for i in 0..<100 {
        print("blk3333......\(i)")
    }
}
concurrentQueue.async {print("blk4")}
concurrentQueue.async {print("blk5")}
concurrentQueue.async {print("blk6")}


blk1
blk2
blk3333......0
blk3333......1
blk4
blk3333......2
blk3333......3
blk5
blk3333......4
blk3333......5
blk3333......6
blk3333......7
blk6
blk3333......8
blk3333......9
blk3333......10
.....

동시에 여러개의 작업이 실행이 되고 실행되는 작업의 수는 현재 시스템의 상태에 따라 달라진다.

CPU 코어의 수, CPU 사용 레벨과 같은 현재 시스템 상태에 따라 결정 (멀티스레드)

 

 

 

컨커런트 디스패치 큐에서 쓰레드가 어떻게 사용되는지 예를 보자. 이건 환경 마다 다르기 때문에 다를 수 있다.

 

4개의 쓰레드가 컨커런트 디스패치 큐를 위해서 준비되어 있다고 가정 한다면 멀티 쓰레드이기 blk0 은 쓰레드 0, blk1은 쓰레드 1, blk2 은 쓰레드 2, blk3은 쓰레드3에서 실행이 된다. blk0이 끝나면 blk4가 실행이 되고 blk1이 끝나면 blk5가 실행되는 식으로 실행이 된다. 

컨커러는 디스패치 큐를 사용하는 경우 실행 순서는 시스템의 상태에 따라 달라지며 만약에 순서가 중요하거나 작업을 동시에 실행햐지 말아야 할 때는 시리얼 디스패치 큐를 사용해야 한다. 

 

 

댓글