[GCD] GCD로 responsive한 프로젝트 만들기

Young Bin Lee·2022년 8월 5일
0

  • 디스크 태스크를 기다리면서 wait 마크가 뜬다

이를 피하려면

싱글코어에서 이런식으로 투 쓰레드 돌리려면 어떻게 할래? -> QOS


QoS 잘 써야하는 이유

에너지를 지키기 위해서 저지른 일

QoS별로 다르게 돌림

아이패드처럼 앱 2개이상 돌리는 건 메인쓰레드가 2개 이상인데 어떡함? -> QoS별로 결정


UI


스크롤이 드르륵 거리는 걸 원치 않을 때(ui는 어떻게든 컨트롤 하는 중)

IN


원하는 정보가 오지 않지만 UI는 움직일 수 있음(그러니까 빨리 가져와야 함)


automatic propagation이라는 걸 하는데 그거 UI를 IN으로 바꿔서 적절히 실행될 수 있게끔 QoS를 바꿔주는 것


상위 QoS는 무시된다(이해 안됨)


규칙은 이러하다

UT


계산같이 긴 작업을 할 떄

  • 여기서도 오토가 된다는데 뭔지 모르겠음

BG

클린업같이 안 보여도 되는 작업을 할 때


Priority inversion


상식적으로는 시리얼 큐에서 QoS가 높더라도 앞에 태스크가 차있으면 먼저 실행될 리가 없다. 근데 큐 한바퀴 돌면서 우선순위 높은 거 찾아준다.

Queues as Locks

내가 이해한 사항들

  • Queue와 thread는 별개다
  • queue에 올라가 있는 작업들은 thread에 분배된다. 이는 OS가 요령껏 해주는 영역이다.
  • Main queue는 main thread에 분배되야 할 작업들이다. Main queue는 제일 높은 우선순위 UI를 가지고 있으며 serial 큐다.
  • Queue를 여러개 만드는 이유는 쓰레드에 어떤 방식으로 작업을 얼마나 잘 올릴 것인가를 정하기 위해서다
  • Concurrent queue는 이 작업들을 동시에 처리해 주세요라는 의미고
  • Serial queue는 이 작업들을 순서대로 처리해 주세요 라는 의미다
  • async는 이 작업이 끝나는 걸 기다리지 않고 thread에 올려버릴 거라는 의미고
  • sync는 이 작업이 끝나는 걸 지켜보겠다는 의미다.
  • 따라서 async/sync는 queue의 dispatch 제어권을 thread가 관리하는 방식을 정의하는 것이다.
  • 하나의 thread는 하나의 task만을 처리하며 그러므로 thread는 작업의 단위가 되는 것이다. 그래서 task는 자신을 위한 thread가 할당될 때까지 기다리는 것이다.

Queues, Threads, Run loops



쓰레드가 i/o를 기다린다. 그러면 다음 블록이 쓰레드를 새로 받는데 그러다보면 쓰레드가 너무 많아짐. 그러다 개수 리밋을 쳐버리면 데드락이 발생함.


싱크 쳤는데 남은 쓰레드가 없으면 데드락(쓰레드 줄 떄까지 계속 기다리고 쓰레드에서 작업을 돌려야 리턴을 할 건데 그러질 못하니까 데드락이 생겨버림)

버그 잡기


웬만하면 시리얼 큐 쓰세요.

profile
I can make your dream come true

0개의 댓글