GCD(Grand Central Dispatch)

슆공부·2022년 7월 5일
0

코어와 스레드 알아보기

코어란?

CPU의 프로세서, 컴퓨터에서 일을 하는 녀석이다.
싱글 코어는 한명이 컴퓨터에서 일을 하고 있는 것이다. => 그래서 동시에 두개의 일을 하지 못한다.
하지만 우리의 앱은 음악 실행, 크롬 실행 등 여러 작업들을 동시에 할 수 있다!
한 명이 일을 하지만 이것을 매우매우매우 빠르게 번갈아가면서 일을 해서 우리가 보기에는 동시에 실행되고 있는 것처럼 느껴지는 것이다.

  • 그럼 싱글코어에서 듀얼 코어 등등으로 왜 코어의 수가 늘어났을까??
    예~전에는 싱글코어로도 계산 작업 등이 충분했었다. 만약 느리다싶으면 cpu를 채찍질해서 클럭 수를 올려버리면 됐었다. (무어의 법칙 성립하여 cpu 계속 발전했음)

하지만 빠르게 계산할 수는 있지만 발열이 심해서 cpu가 타버리는..현상이 발생했다.
그래서 하나의 코어 성능을 높이는 것보다는 두 개 이상의 코어끼리 통신하는 것에 집중하기 시작했다. 두명한테 시켰을 때 더 빠르게 계산하고 비용도 절감하게끔..

스레드란?

  • CPU의 스레드
    CPU 제조사의 기술의 이름.
  • 프로그래머들이 말하는 스레드
    소프트웨어 스레드.

1코어 2스레드라고 하면, 물리적인 코어는 한개지만 밖으로 보이는 코어는 두개처럼 보이는 것이다.

  • 코어가 많으면 무조건 빠를까?
    실행하려는 프로그램이 멀티코어에 최적화되어있느냐에 따라 달라진다.

결론, 코어는 물리적인 cpu의 프로세서이고, 스레드는 하이퍼스레딩기술을 이용하여 실제로는 하나지만 두 개의 코어처럼 보여지는 논리적인 cpu인 것이다.

  • 화면이 버벅이는 이유는
    너무 많은 작업들을 메인 스레드 하나에만 시켰기 때문이다. (다운로드 등등)
    여러 스레드가 존재하는데 그것들을 사용하지않고 한놈에게만 일을 다 시키니까 화면이 refresh되는 간격이 너무 멀어진 것이다.

그래서 작업을 어떻게 분산시킬 수 있을까?

= 작업들을 어떻게 다른 스레드에서 실행시킬 수 있을까와 같다.

작업을 대기행렬(queue)에 보내기만 하면 된다!

알아서 ios가 스레드를 찾아서 분산시킨다. 큐는 선입선출이어서 먼저 들어온 작업들이 먼저 배치된다. 하지만 먼저 배치된 작업이 먼저 끝나는 것은 아니다.

작업을 큐로 보내자. 어떻게?

ios에서는 방법이 GCD, Operation 이렇게 두 가지가 있다.
우리는 대기열 큐에 넣기만 하면 ios가 알아서 스레드를 생성하여 작업을 분산 처리한다!
=> 오래걸리는 작업들이 다른 쓰레드에서 비동기적으로 동작하게 해준다.

  • 어떻게 대기열로 보낼까?
    DispatchQueue (= 큐에 보내다.)
    DispatchQueue.global().async { }
    요거는 클로저 안에 들어가는 작업을 큐에 보낼건데 글로벌큐로 보낼거고 비동기적으로 보내겠다는 의미이다. 클로저 하나 안에 들어가는 것이 작업의 한 단위 이다.
    그래서 작업의 한 뭉탱이는 순차적으로 실행이 된다.

GCD

dispatchqueue라고 하고, 클로저로 묶을 수 있는 여러 개의 간단한 작업을 다룰 때 사용한다. (함수 위주)

Operation

GCD기반으로 만들어진 기술이다. + 여러가지 기능. 취소, 순서 지정, ..
클래스로 만들어진 객체이다.
operation queue라고 한다. 복잡한 일에 사용, 데이터와 기능을 캡슐화한 객체 개념이다. (?)

동기와 비동기 알아보기

비동기란?

작업을 메인스레드에서 대기열로 보낼 때 알아서 다른 스레드로 작업을 보내게 되는데, 작업을 보낸 시점에서 즉시 리턴하는 개념이 비동기이다.
작업이 완료되는 것을 기다리지 않고 그 다음작업을 처리할 수 있는 것이다.
일을 시작만 시키고 끝날 때까지 안 기다리는 것!
=> 그래서 1번 스레드가 다른 일처리를 할 수 있다!
DispatchQueue.global().async { }

동기란?

반대로 원래 작업이 진행되던 메인 스레드에서 다른스레드로 작업을 보내고, 일이 끝날 때까지 기다리고 있는 것이다.
DispatchQueue.global().sync { }
그런데 이렇게 짜면 사실 의미가 없어지기 때문에 실질적으로는 메인쓰레드에서 일을 하게 된다.

어떤 일을 할때 한 명에게 일을 시키면 한번에 한가지의 일만 할 수 있기 때문에 그 한명이 일을 끝내기까지 기다리는 것은 시간도 오래 걸리고 매우 비효율적이다. (동기적)

그래서 여러명에게 일을 나눠준다면 더 효율적이게 일을 처리할 수 있다.

스레드에 적용하면,
메인스레드에만 할당되었던 일을 여러 스레드에 분배하면 메인 스레드 포함 다른 스레드들도 동시에 일을 할 수 있다.
이것이 동시성 프로그래밍이라고 한다.

동시성 프로그래밍은 동시에 실행되는 것처럼 보이는것을 말한다. 싱글코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 스레드를 번갈아 가면서 실행되는 방식이다. 논리적 개념.

직렬serial 과 동시concurrent

큐의 특성.
직렬큐는 단하나의 스레드로만 보내는 대기열이다.
동시큐는 여러 스레드로 분산처리를 하는 것이다.

  • 여러 스레드로만 보내는 게 좋을 듯한데 왜 직렬큐가 존재할까?
    순서가 중요한 작업을 처리할 때 사용한다!

반면 동시큐는 독립적이지만 중요도나 작업이 유사한 여러개의 작업을 처리할 때 사용한다.
뭔말?
데이터 받아와서 화면에 보여주는 셀 하나하나의 작업들..

  • 동시적인 것과 비동기는 다른 것!

0개의 댓글