해결된 질문
작성
·
101
·
수정됨
0
📌자주하는 질문 모음
자주하는 질문을 먼저 확인 부탁드리며, 질문은 최대한 구체적으로하셔야 빠르게 답변드릴 수 있습니다.
[질문 예시]
(1) 몇강, 몇초의 내용이 잘 이해가 안갑니다. (제가 적어놓은 강의 번호 "10강, 7분 강의 내용 중에... " )
(2) 강의자료 몇 페이지의 내용이 잘 이해가 안갑니다.
(3) 정확하게 어떤 포인트에 대한 내용이 이해가 안갑니다. 다시 설명해주실 수 있나요
안녕하세요. 실행자(executor)와 액터 홉핑(actor hopping)과 관련해 질문이 있어요. 액터에 실행자 개념까지 나오니 너무 헷갈리네요.
액터 홉핑이 일어나게 되면, 액터에 내장되어 있는 실행자(executor)가 전환되고, 이는 곧 액터에서 실행되는 스레드의 묶음이 바뀌는 것이니, (실행 컨텍스트는 물론) 스레드 컨텍스트 스위칭이 일어날 수 있다라고 보는 게 맞을까요?
메인 액터-일반 액터 간 홉핑은 메인 스레드와 협력형 스레드 풀 간의 전환이니, 실행 컨텍스트와 스레드 컨텍스트 전환이 무조건 일어나는 게 맞을까요?
일반 액터-일반 액터 간 홉핑은 모두 Swift 동시성이 기본으로 제공해주는 직렬 실행자(serial executor)에서 실행되고, 이 직렬 실행자는 협력형 스레드 풀에서 실행되는 것이니, 실행 컨텍스트 전환은 일어날 수 있어도 스레드 컨텍스트 스위칭은 일어날 수도 있고, 일어나지 않을수도 있다고 보는 게 맞을까요?
(플레이그라운드에서 Thread.current로 찍어 실험을 해봤을 땐, 모두 동일한 스레드에서 실행되는 걸로 보입니다)
답변 1
1
네 안녕하세요!
질문 주신 내용에 대한 이해가.. 바로 앞의 질문하고 연관이 조금 있어서, 바로 앞의 질문/답변도 읽어보시면 좋을 것 같고요!
(우선 참고적으로 말씀드리면, 플레이그라운드에서 실험하는게 크게 의미가 없을 수도 있습니다. 플레이그라운드의 경우 내부적으로 2개의 쓰레드만 사용되도록 설정이 되어 있어요. 그래서 강의 중간에 액터 프로젝트를 사용해서 (Instruments를 사용해서 설명드리고 있으니) 홉핑 문제를 다뤘던 부분을 잘 생각해보시면 좋을 것 같기도 합니다.)
(첫번째 질문)
액터 홉핑이 일어나게 되면, 액터에 내장되어 있는 실행자(executor)가 전환되고, 이는 곧 액터에서 실행되는 스레드의 묶음이 바뀌는 것이니, (실행 컨텍스트는 물론) 스레드 컨텍스트 스위칭이 일어날 수 있다라고 보는 게 맞을까요?
네. CPU(쓰레드)가 바뀌는 것이지 (정확하게 표현하자면 컨텍스트 스위칭이라고 표현하기는 조금 애매한데) (바로 앞 질문 답변에서 말씀드렸듯이 실행하는 CPU(쓰레드)가 바뀌는 개념하고, 컨텍스트 스위칭과는 조금 달라서요.) 무튼 (동일한 실행자를 커스텀으로 설정한게 아니라면) CPU(쓰레드)가 바뀌는 것은 맞습니다. 중간에 제가 보여드린 프로젝트의 Instrument에서 확인가능하세요!
(여기서 참고적으로 말씀드릴 수 있는 것은, 단순히 프린트를 찍어보는 것하고, 실제 오래걸리는 작업들로 실험하는 것은 많이 달라질 수 있습니다. 왜냐면, 짧게 짧게 끝나는 단순 프린트 같은 작업들은.. 쓰레드를 이동하지 않는 것처럼 보일 수도 있습니다.)
(두번째 질문)
메인 액터-일반 액터 간 홉핑은 메인 스레드와 협력형 스레드 풀 간의 전환이니, 실행 컨텍스트와 스레드 컨텍스트 전환이 무조건 일어나는 게 맞을까요?
네. CPU(쓰레드)가 바뀌어요. 위와 동일한 질문으로 보여서. 위의 답변과 비슷합니다.
(세번째 질문)
일반 액터-일반 액터 간 홉핑은 모두 Swift 동시성이 기본으로 제공해주는 직렬 실행자(serial executor)에서 실행되고, 이 직렬 실행자는 협력형 스레드 풀에서 실행되는 것이니, 실행 컨텍스트 전환은 일어날 수 있어도 스레드 컨텍스트 스위칭은 일어날 수도 있고, 일어나지 않을수도 있다고 보는 게 맞을까요?
(일단은 쓰레드 컨텍스트 스위칭이라고 표현하셨는데, 저는 CPU(쓰레드) 전환이라고 표현할께요. 어떤 의미로 말씀하셨는지 모르지만.. 정확하게 표현하기 위해서요.)
뭐 그렇게 생각하실 수도 있지만.. 기본적으로 일어날 수도 있고/일어날 수 있지 않을 수도 있다라고 생각하는 것보다는 이런 경우 이론적으로 무조건 일어난다고 보는 것이 맞다고 생각합니다. 왜냐면, CPU(쓰레드) 간의 전환은 운영체제가 알아서 해주는 부분인데, 예를 들어 액터A가 (2, 3, 4번 쓰레드를 쓸수도 있고) 액터B가 (4, 5, 6번 쓰레드를 쓸 수도 있는데) (일부러 4번 쓰레드는 같이 쓸 수도 있다고 가정해서 말씀드리고 있음..) 근데, 그런식으로 접근하면.. 우리가 통제할 수 있는 부분이 아니죠. (실행할때마다 달라질 수 있습니다.)
그렇다면, 만약에 우리가 퍼포먼스를 엄청 중요시 하는 프로젝트를 만들어야 한다고 가정해보면.. 전환이 안 일어날 수도 있는 가능성이 개선을 하지 말아야 할까요? 저는 아니라고 생각합니다. 경우에 따라서 달라지는 경우의 수를 따지는게 아니라, 무조건 액터 홉핑(CPU(쓰레드) 전환)이 일어난다고 생각하고 프로젝트를 개선해야 한다고 봅니다.
(질문 주신 것들보니.. 제 생각에는, 너무 디테일하게 접근하고 계시는 것 같은데) 액터의 경우도 그림 그리신 것처럼 생각하는 것보다는 그냥 1개의 쓰레드라고 "이론적으로" 접근하는게 더 맞다고 생각해요.
(내부적으로 CPU(쓰레드) 전환은... Swift Concurrency와 운영체제가 알아서 해주는 부분이니까요.)
감사합니다. 이해가 안되시는 부분이 있으시면 다시 질문 부탁드립니다.
감사합니다. :)
감사합니다. 제가 완전히 착각하고 있었네요.