ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] - 비동기와 동기(3/4)
    iOS/iOS 2024. 3. 16. 16:59
    728x90
    반응형
    이전 포스팅
     

    [Swift] - GCD에 대해서(2/4)

    이전 포스팅을 읽고 읽어주길 바란다. https://quarang.tistory.com/71 [Swift] - GCD를 알아야하는 이유(1/4) 오늘은 최근에 했던 컴퓨터구조 스터디를 기반으로 포스팅을 해보겠다. 스터디의 내용은 메인스

    quarang.tistory.com

     

     

     

    동기와 비동기

     

    자 이제 메인스레드도 못참겠다. 밀린 작업들을 처리해줄 스레드를 찾아야 겠다

    메인스레드에서 GCD에게 밀린작업을 보내줄 것이다. 그럼 GCD가 queue를 통해 작업을 다른 스레드에게 context switcing을 할것이다. 자 근데, 여기서 방식이 나뉜다.

     

    동기(synchronuos)

     

    동기방식을 쓰게 되면, 메인스레드는 작업을 보내고 그 작업이 끝날때까지 다음 작업을 보내지 않고 계속 기다린다.

    그리고 그 작업이 끝나게 되면, 그 다음 밀린 작업을 보낼 것이다. 그렇게 메인스레드는  작업을 다른 스레드로 보내도 앞에 보낸 작업이 끝날 때까지 다른 작업을 할 수가 없는 상태가 된다.

    //GCD 큐 생성
    let queue = DispatchQueue(label:"queue")
    
    print("1")
    queue.sync{
        print("2")
    }
    print("3")
    
    //출력
    //1
    //2
    //3

    문법은 queue.sync{} 를 사용한다. 

     

    내용을 이해했다면, 저 코드는 메인스레드에서 동작 중인 것을 알것이다. 그리고 "queue"라는 이름의 큐를 생성하고 print를 찍어볼텐데 2를 출력하는 코드가 sync블록안에 들어있다. 저 블록에 들어있는 코드들은 더이상 메인스레드에서 작업되는 코드가 아니다. 왜냐면 생성한 큐에 의해 다른 스레드로 넘어갔을 것이기 때문이다. 큐의 타입을 지정해주지 않으면 GCD에서 알아서 아무 스레드에 할당해준다.

    그래서 저 코드는 곧 "GCD queue를 생성해서 다른 스레드로 넘겨 동기적으로 실행시키겠다."라는 말이다.

     

    그래서 다른 스레드에서 옮겨진 print("2")는 나머지 print("1")과 print("3")과 독자적으로 작동은 되지만 출력은 순서대로 실행된다.

    왜냐? 계속 얘기했듯이 메인스레드에선 다른 스레드에 있는 작업이라도 sync이기 때문에 print("2")가 끝날 때까지 print("3")을 실행 시키지 않을 것이기 때문이다.

     

    비동기(Asynchronour)

     

    그럼 비동기는 뭐냐, 작업을 GCD로 보내고 다음 작업을 보낼때, 작업이 끝나건 끝나지 않았건 기다리지 않고 바로바로 작업을 넘긴다.

    그래서 아무리 오래걸리는 작업이 메인스레드에 밀려 있어도, 메인스레드는 다른스레드에게 짬처리를 하고 본인은 자기할 걸 할 수 있게 된다.

    //GCD 큐 생성
    let queue = DispatchQueue(label:"queue")
    
    print("1")
    queue.async{
        print("2")
    }
    print("3")
    
    //출력
    //1
    //3
    //2

    문법은 queue.async{} 를 사용한다. 

     

    이번엔 출력값이 이상하다. 분명 코드를 순서대로 실행 시켰는데, 가장 마지막에 출력되야할 print("3")가 먼저 출력이 됐다. 

    이번엔 aysnc이기 때문에 메인스레드가 print("1")작업을 실행하는것 까지는 동기처리방식과 동일하다. 하지만 이번에는 print("2")의 작업이 끝날때까지 기다리는 것이 아닌, "아 이거 다른 스레드에서 해줄텐데.. 난 걍 내할일이나 해야겠다."라는 말이다.

     

    print("1")을 실행한 후 print("3")을 바로 실행하고, 동시에 다른스레드에서도 print("2")를 실행하는데 그럼에도 3이 2보다 먼저 출력되는 이유는 무엇일까?

     

    나의 개인적인 생각이지만, 메인스레드는 작업을 넘기고 바로 작업을 실행하지만 print("2")가 GCD에 의해서 큐로 이동하고 다른 스레드에 할당될때 까지의 아주 작은 지연이 있어서 늦게 출력할 것 같다.  만약 print("3")전에 딜레이를 주면 1,2,3 순서로 출력이 된다.

     

     

    뭔가 sync는 정직하고 칼같으며 흐트러짐 없는 개발자의 모습을 했을것 같고,

    async는 껄렁껄렁하며 쌈마이지만 엄청 효율적으로 일처리 잘하는 개발자의 모습일 것같다..

     

     

     

    동기와 비동기의 큰 차이는 기다린다 VS 안기다린다이다. 다들 직렬과 동시 및 동기와 비동기를 헷갈린다고 많이 하는데, 요즘은 이런글을 잘 정리해주시는 분들이 너무 많아서 모르는 사람이 없을 것같다. 그럼에도 글을 작성하는 것은 내가 아는 내용을 정리하고 상기시키기 위함인것 같다.

     

    다음 내용은 직렬과 동시에 대한 내용이다. 왜 직렬과 병렬이지 동시를 쓰냐? 이건 다음 포스팀에서 설명하겠다.

     

    다음 포스팅
     

    [iOS] - 직렬과 동시(4/4)

    이전 포스팅 [iOS] - 비동기와 동기(3/4) 이전 포스팅 [Swift] - GCD에 대해서(2/4) 이전 포스팅을 읽고 읽어주길 바란다. https://quarang.tistory.com/71 [Swift] - GCD를 알아야하는 이유(1/4) 오늘은 최근에 했던

    quarang.tistory.com

     

    'iOS > iOS' 카테고리의 다른 글

    [iOS] - protocol이란?  (0) 2024.08.31
    [iOS] - 직렬과 동시(4/4)  (3) 2024.03.16
    [iOS] - GCD에 대해서(2/4)  (1) 2024.03.16
    [iOS] - GCD를 알아야하는 이유(1/4)  (0) 2024.03.16
    [iOS] - Swift에 대하여(Feat. UIkit,SwiftUI)  (0) 2024.01.09
Designed by Tistory.