오호,, 저는 개인적으로 이론적으로 깊게 파고드는걸 좋아해서 오늘 말씀 주신 내용이 다 흥미롭네여 ( o̴̶̷᷅ᴗo̴̶̷᷄ ) 물론 앨런님이 처음 시리얼 큐를 설명할 때 "하나의 스레드"를 사용하는 큐가 아닌, 여러개의 스레드 객체를 사용할 수 있되 Task는 "한번에 하나씩" 처리하는 큐 라고 했으면 개념이 명확히 잡히지 않았을 것 같긴 합니다. (네,,,,,,,,머라구요,,????🤔 하면서 강의를 들었겠죠,,??) 하지만 시리얼 큐에 대한 이해를 한차례 하고 나서 실제로 OS 단에서는 어떻게 돌아간다! 는 사실을 접하니 개념과 실제 동작을 알게 된 것 같아 좋네용 오늘도 감사합니다~!
상세한 답변 감사합니다. 결국 MainThread를 제외한 나머지 스레드 객체는 사용할 때만 잠깐 생성되었다가 사라짐. 즉, 시리얼 큐라도 중간에 사용하는 스레드 객체가 변경될 수 있음. 하지만 시리얼 큐는 하나의 스레드 객체를 사용하는 것처럼 설명을 하는 것이 이해에 훨씬 직관적이기 때문에 그렇게 설명해 주신것. 이 되겠네욤 답변 주신 것을 읽고, 원래 처음에 링크 주신 답변을 한번 더 읽어봤는데 이때 말씀 중 두가지 헷갈리는 부분이 있습니다. 1. 위의 링크를 붙여주신 것과 같이 실제로는 한번에 하나의 쓰레드를 사용하는 것이 맞습니다 . 그게 실제로는 하드웨어적인 여러개의 쓰레드 일수도 있겠지요 . -> 여기서 하드웨어적인 여러개의 쓰레드를 언급해주신 것은, “소프트웨어적인 여러개의 스레드를 쓸 수 있는 것은 당연하고, 해당 스레들이 심지어 다른 물리 스레드에 속하는 애들일 수도 있다”의 의미를 담고 있는건가요? 2. 앱을 실행할때 특정하는 메인쓰레드조차도 , 어쩌면 하드웨어적으로 여러쓰레드를 사용할지도 모릅니다 . 하지만 , 아무도 메인쓰레드가 한번에 하나의 쓰레드를 사용하는 개념이라고 생각하지 않지요 ..) -> 제가 드린 질문의 답변에서는 “ 메인 쓰레드 객체 는 실제로 객체 자체가 절대로 변하지가 않습니다 . ( 동일한 메모리 주소를 가진 인스턴스라는 것이지요 .)” 라고 말씀주셨는데 , 저 글의 답변에서는 메인 스레드 객체마저 변할 수 있는 것으로 해석됩니다 . 혹시 메인스레드조차 하드웨어적으로 여러 스레드를 사용할 수 있다는 의미가 어떤 뜻인지 조금 더 설명 부탁드려도 될까요 ?
안녕하세요 앨런님! (아니 도대체 인프런은 글씨 크기를 어떻게 키우는걸까요..🤔) 물리 스레드라고 설명주신 개념이 생소해서 조금 공부해봤더니, 제가 생각한건 “ 1 코어 = 1 물리스레드 ” 이라고 가정하고 질문 드린거였네요. 그래서 저는 싱글 코어 에서는 여러 논리스레드가 할당될 때 무조건 멈춤 현상이 발생하고, 멀티 코어 에서는 동일 코어에 여러 논리 스레드가 할당 될때 멈춤 현상이 발생한다고 생각했어요. 하지만 하이퍼스레딩 개념이 등장함에 따라 하나의 코어에 여러 개의 물리 스레드 가 존재할 수 있게 되었고 , 따라서 우선 순위에 밀려 task 가 멈출 수 있는 상황을 ‘ 여러개의 논리 스레드가 동일한 코어 에 몰려있는가 ’ 로 판단하는 것보다 , ‘ 동일한 물리 스레드 에 몰 려있는가 ’ 로 판단하는 것이 더 정확하겠군요 . 조만간 강의 내용도 업데이트 된다니 그 내용도 기대하고 있겠습니다! 감사합니다 :)
아하 네넵 우선은 제 이해력의 한계로...! 애플에서는 unspecified 로 설정 되어 있다.. 정도로만 가져가야겠네요 🤔 나중에 unspecified 일때 default를 따라가는 경우도 있다..? 정도의 비슷한 내용을 보게 되면 그때 다시 설명주신 내용 참고해보도록 하겠습니다 답변 감사합니다!! :)
뭔가 unspecified 는 공식 문서에 나와있는 설명도 그렇고.. 다른 글들을 살펴봐도 명확하지 않은거 같아요ㅜㅜ 그렇다면 앨런님이 설명주신 "qos 가 global 을 따라간다"는 의미는, (사실 global 이라는 qos 는 없기 때문에) global dispatchQueue 의 기본 qos 인 default를 따라간다는 말씀이실까요..? ( 쓰고 보니 뭔가 더 잘못 이해하고 있는거 같네요..? )
아하 cell이 재사용되기 때문에 생기는 문제겠군요,,! cell A가 "a"라는 url 을 전달받고 이미지를 로드하고 있는 와중에, 사용자가 스크롤을 하면 cell A 가 다시 재사용되고 새로운 url이 indexPath를 통해 전달 될테니까요! 이는 기존에 요청했던 네트워크 요청을 했던 "a" url 과 일치하지 않는 상황이기때문에 return 시켜주는 거군요.. (맞..겠죠? ㅎ) 답변 감사합니다~!
오호.. 디스패치 그룹의 wait()을 쓰는 경우는 꽤 복잡한 경우군요 🤔 ! 우선은 개념만 좀 더 정확히 다지고, " 시리얼큐와 Sync, 객체설계시 주의할점"에서 한번 더 유의해서 봐야겠네요 👀 오늘도 자세하고 알기 쉽게 설명주셔서 감사합니다! 앨런님도 새해복 많이 받으셔요~ 감사합니다. :)
오 자세한 설명 감사합니다! DispatchQueue.global() 로 다른 gloabl 큐 객체를 각각 생성해주는걸로 이해했어요.. 근데 같은 객체를 지칭하는거였나 보군요,,🤔 🤔 그럼 DispatchQueue.global().async { DispatchQueue.global().sync } 에서 큐가 서로 같은 객체일때 DispatchQueue.global(qos: .utility).async { DispatchQueue.global().sync } 의 큐는 각각 다른 객체인가요 같은 객체인가요? (즉 QOS에 따라 객체가 달라지는건지...???)
오 자세한 설명 감사합니다!! 많은 부분에 도움이 되었어요! 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 에 맞는 스레드를 할당받게 되는 거겠죠 ?