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

[iOS GCD(Grand Central Dispatch)] 소개 및 멀티스레드 프로그래밍

by snapshot 2019. 12. 19.

GCD(Grand Central Dispatch) 란 무엇이냐..?

GCD는 작업(task)을 비동기적으로 실행하기 위한 기술 중 하나.!

개발자가 작업할 것은 작업을 정의하고 적당한 디스패치 큐에 추가하면 GCD는 필요한 스레드를 생성하고 각 스레드가 동작할 수 있도록 스케쥴을 처리해줌.

 

DispatchQueue.global().async {
    /*
     * 이미지 처리, DB 접근 등의 시간이 오래 걸리는 작업을 합시다.
     *
     */
    
    DispatchQueue.main.async {
        /*
         * 여기서는 메인 스레드 작업이 들어감. (사용자 인터페이스(UI) 갱신)
         */
    }
}

DispatchQueue.global().async { }

이 한 줄로 작업을 백그라운드 스레드로 실행해준다.

    

DispatchQueue.main.async { }

이 한 줄의 코드로 작업을 메인 스레드로 실행해준다.

 

그럼 멀티스레드는 왜 쓸까...

 

응답성 높은 응용프로그램을 만들기 위해서라고 말한다. 

일단 응용 프로그램이 사작이 되면 바로 스레드 하나가 시작한다. 이 스레드는 우리가 알고 있는 메인 스레드라고 불리는 것이다. 그런데..이 메인 스레드는 다음 편에 말하겠지만..siral큐로 되어 있다. 하나의 작업이 끝나면 다른 작업을 실행한다.

만일 이 메인 스레드로 이미지처리, 또는 데이터베이스에 접근하는 조금 시간이 걸리는 작업을 함께 한다면 메인 스레드의 유저 인터페이스(UI) 작업은 잠시나마 멈출 수 있을 것이다. 왜냐면 iOS에서는 메인 스레드만이 사용자 인터페이스를 업데이트하기 때문에 런루프가 멈춰서는 안 된다. 사용자 인터페이스(터치, 스크롤, 애니메이션 등)가 업데이트 되지 않고 오랫동안 같은 화면이 나타나게 된다. 

 

 

 

 

 

그래서 멀티스레드를 사용하면 오랜 시간이 걸리는 작업이 실행하는 동안 사용자는 UI를 처리할 수 있다.

 

 

 

 

 

 

단점...

1. 여러 스레드가 리소스를 경쟁적으로 업데이트를하면 예측 불가능한 데이터 문제(레이스 컨디션)을 일으킬 수 있다. 

2. 여러 스레드가 동시에 어떤 이벤트를 기다리는 (데드락, dead lock)을 일으킬 수 있다.

3. 스레드가 너무 많으면 메모리를 많이 사용하기 때문에 느려질 수 있고..메모리가 모자라서 문제가 생길 수 있다. 

 

 

 

참고

iOS와 OS X의 메모리 관리와 멀티스레딩 기법

 

댓글