인프런 커뮤니티 질문&답변

sujinnaljin님의 프로필 이미지
sujinnaljin

작성한 질문수

앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해

4강 관련 질문있습니다!

작성

·

190

1

안녕하세요 앨런님! 오랜만에 4강을 듣다가 궁금한점이 이것저것 생겨 질문 남깁니다!

1. Qos 에서 User interactive initiated 차이가 명확히 와닿지 않아서요 ㅜㅜ initiated쪽에서 “비동기적으로 처리된 작업이라는 설명이 있는데 그럼 전자는 동기적으로 처리된 작업인가요?

2. 강의 자료 (88페이지)에서 “iOS 알아서 우선적으로 중요한 일임을 인지하고 쓰레드에 우선순위를 매겨  여러개의 쓰레드를 배치하고 배터리를  집중해서 사용 하도록 ” 이라고 써있는데 쓰레드에 우선순위를 매긴다는게 무슨 뜻일까요?? 큐에 우선 순위를 매겨  많은 스레드를 배치하는  아니었나요스레드 자체에도 순위가 있는건가요???

3.  task qos(async 보낼때 지정하는 qos) utility이고 queue qos 더 낮은 상황(.background)에서는 task qos 영향을 받아 queue 품질이 utility 상승하게 된다. 라고 말씀 주셨는데  global(qos: .background)큐가 utility 자체로 바뀐다는건지(그럼 background queue 없어지는건가여..??? 이건 아닐거 같긴 한데..), 해당 task qos: utility 큐로 간다는건지,, 설명 부탁드려도 될까요?

4. 만약 task qos 큐의 품질보다 낮은 상황에서는 어떻게 되나요?

감사합니다 :)

답변 3

1

sujinnaljin님의 프로필 이미지
sujinnaljin
질문자

오 자세한 설명 감사합니다!! 많은 부분에 도움이 되었어요! 3번 설명주신 부분이 좀 헷갈려서 다시 댓글을 달았었는데 쓰다보니까 내용이 정리가 되어서 삭제했습니다 ㅎㅎ 

만약 아래와 같은 코드가 있다면,

let queue = DispatchQueue.global(qos: .background)

queue.async(qos: .utility) {}

queue.async {}

우선 .background queue 품질이 .utility 올라간 상태에서, 첫번째 async에서 들어온 task 다른 스레드로 모두 할당될때까지 queue 품질은 utility 유지 되겠네요. 두번째 async에서 들어온 task 어차피 같은 queue 쓰기 때문에 선입선출의 특성상 먼저 다른 스레드에 할당될 없을테고.. 첫번째 task 할당이 끝나자마자 queue qos 다시 background 바뀌고 두번째 task background 맞는 스레드를 할당받게 되는 거겠죠?

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 정확하게 이해하신 것이 맞습니다 ^^ㅎㅎ

👍🏻👍🏻👍🏻

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

안녕하세요, sujinnaljin 님! 

열심히 공부하고 계시군요 ^^

여러가지의 의문점을 남겨주셔서 제가 뿌듯하네요!

일단 질문하신 내용들에 대해 답변드려 볼께요ㅎㅎ

1번 질문에 대한 답변 >>>>>

“비동기적으로 처리된 작업”은 제가 그런의미로 pdf파일에 사용한 것은 아니고요! 어쨌든 큐를 사용한다는 것은 다 비동기적인 처리라고 생각해야합니다. 다만, 여기서는 그 단어자체보다는 예시를 위주로 생각하시는 편이 좋을 것 같습니다^^

1) userInteractive의 경우에는 예를 들어서 버튼을 눌렀을때 “애니메이션이 뿅하고 바로 나와줘야 내가 누른 것에 대한 동작을 하는 구나” 라고 느낄 수 있는 그런 경우에 사용하고, 아마도 일반적으로는 이런 동작같은 경우는 주로 이렇게 global큐를 사용하지 않고 그냥 메인쓰레드에서 처리할 것입니다. 다만, 메인쓰레드에서 처리했을때 많은 로드가 걸려서 화면이 버벅이거나, 또는 그 동작을 하는 동안 유저가 다시 버튼을 입력했을때 반응을 못하게 막을 수 있는(즉, 메인쓰레드를 버벅이게 만드는) 그런 작업인 경우에 global큐의 userInteractive 우선순위를 사용해서 비동기적이지만 아주 빠르게 일처리를 하도록 만들어서 바로 동작하는 것처럼 보이게 만들어야 하는 경우에 사용하시면 됩니다.

2) 그리고, 두번째 userInitiated 작업 같은 경우는 이것도 예시로 보시면 될 것 같은데요, 즉 아마 아이폰을 사용하시면서 pdf파일을 열거나 이메일을 열거나 하는 그런 경우를 생각하시면 됩니다. 아무래도 위에 들었던 바로 동작하는 그런 경우보다는 생각보다 조금 더 오래걸려도 유저가 원래 이런 작업은 좀 오래 걸리지? 라고 생각할 수 있는 수준의 작업이라고 생각하시면 될 것 같습니다. 그리고 아이폰에 저장되어있는 pdf파일을 열거나, 동영상파일을 여는 이런 작업은 (파일을 컴파일링해서 메모리에 올리기 때문에) 생각보다 오래 걸리게 됩니다. 그래서 아 이런 종류에 처리하는 구나 라고 생각하시면됩니다.

그리고 참고적으로 애플 공식문서 내용을 남겨드립니다^^

=================================

userInteractive

userInteractive 작업은 시스템에서 가장 높은 우선 순위를 갖습니다. 유저와 상호 작용하거나 앱의 유저 인터페이스를 적극적으로 업데이트하는 작업 또는 대기열에 이 클래스를 사용합니다. 

예를 들어, 애니메이션 클래스 또는 상호적 이벤트 추적에 사용합니다.

userInitiated

userInitiated 작업은 시스템에서 우선 순위가 userInteractive 작업에 이어 두 번째입니다. 사용자가 수행하는 작업에 대한 즉각적인 결과를 제공하거나 유저가 앱을 사용하지 못하게하는 작업에 이 클래스를 할당합니다. 

예를 들어, 이 서비스 품질 클래스를 사용하여 사용자에게 표시할 이메일 콘텐츠를 로드 할 수 있습니다.

=================================

아, 그리고 한가지 더 설명드릴 것은 

애플이 개발자가 이렇게 사용하면 편할 수 있으니 이런 것을 사용하면된다는 이런 권장의 개념이지 반드시 꼭 이렇게 처리할 필요는 없습니다.^^ 아무래도 개발하는 서비스의 방향에 보다 맞는 큐를 나중에 사용하면 되겠구나! 라고 생각하시는 편이 좋을 것 같습니다. ^^

2번 질문에 대한 답변 >>>>>

해당 내용에서 “쓰레드에 우선순위를 매긴다”라는 의미는 그런 의미로 사용한 것은 아닌데..! 제가 표현을 잘못한것 같네요! 해당자료에서 “쓰레드”가 아닌 “큐”라는 말이 더 정확할 것 같습니다.ㅠㅠ 네 큐에 우선순위를 매겨 더 많은 쓰레드를 배치한다는 표현이 더 정확합니다 ^^ 쓰레드 자체에 우선순위가 아닙니다!!ㅠ 자료를 수정해야겠네요!!ㅠ 정확한 지적 감사합니다 ^^

3번 질문에 대한 답변 >>>>>

큐 자체의 품질이 해당작업이 있는 동안에 일시적으로 상승하는 개념입니다! (백그라운드 큐가 없어지는 것이 아니고요!) 일단 큐 자체가 클래스 이기 때문에 어떤 객체라는 개념으로 생각하신다면 일단은 그 객체의 품질을 일시적으로 올려서 사용한다고 보시면 될 것 같습니다^^

4번 질문에 대한 답변 >>>>>

task가 큐의 품질보다 더 낮은 상황에서는 큐의 품질을 따라가도록 설계되어 있다고 합니다! (일반적으로 큐의 품질을 따라가지만, 우선순위가 더 높은 task가 들어왔을때만 일시적으로 더 많은 쓰레드를 사용한다고 생각하시면 될 것 같습니다. ^^)

여러가지 질문 감사합니다! 궁금하시던 부분들이 해소 되셨으면 좋겠네요^^

좋은 주말되세요! 고맙습니다. :)

sujinnaljin님의 프로필 이미지
sujinnaljin

작성한 질문수

질문하기