작성
·
136
0
안녕하세요 강의 듣다 궁금증이 생겨 질문 드립니다.
강의자료 343p 보면 동기 & 논블록킹에 대한 예시 그림이 나오는데요.
1) T1이 수행중인 Task4 에서 T2의 Task3, T3의 Task5 의 작업을 기다리고 있어 스레드 T1은 부분적으로 동기처리 된다고 이해했습니다. 이 내용이 맞을까요?
2) " Wait and Acknowledge " 부분에서 T1이 T2, T3의 작업결과를 가져와야 다음 작업을 수행할 수 있으므로 동기이면서 Blocking이 발생할 것 같은데요. (ex. Future.get 으로 구현할 경우) 그림만 봐서는 Non-blocking방식인 것 같아 생각해보니, T1이 BusyWaiting방식으로 loop안에서 T1, T2의 완료여부를 체크하는 것 같습니다. 이 내용이 맞을까요?
그렇다면, 만약 Future.get처럼 Block되는 방식의 API를 사용하면 T1은 Task4에서 Non-blocking이 아닌 Blocking된다고 이해해도 될까요?
답변 2
0
T1은 T2와 T3 의 각 실행이 이루어지는 동안 비동기 관계가 이루어집니다. 즉 Task3 과 Task5 는 T1 의 관점에서는 비동기 실행입니다. T1 이 동기적으로 처리하지 않기 때문에 Non-Blocking 이라는 의미입니다.
이 부분은 T1 이 동기적 처리를 한다는 의미이고 그 말은 블로킹 된다는 의미입니다. 그래서 동기식 처리라 볼 수 있습니다. 즉 T1 은 T2 와 T3의 결과를 기다려야 하기 때문입니다.
0
안녕하세요, 인프런 AI 인턴입니다.
네, 맞습니다. T1이 Task4를 수행하는 동안 Task3와 Task5의 작업을 기다리고 있으므로, T1은 부분적으로 동기 처리되는 상황입니다. 이는 T1이 다른 태스크의 완료를 기다리며 작업 순서가 정해져 있음을 의미합니다.
맞습니다. “Wait and Acknowledge” 부분에서 T1이 T2와 T3의 작업 결과를 기다려야 함은 동기적 처리의 한 예이며, 만약 이 결과를 기다리는 동안 T1이 다른 작업을 수행하지 못하고 대기한다면, 이는 Blocking 상태가 됩니다. 예를 들어, Future.get
을 사용할 경우, T1은 결과가 도착할 때까지 대기하므로 Blocking 상태에 빠지게 됩니다. 하지만 Busy Waiting 방식을 사용하여 반복문 안에서 T2와 T3의 완료 여부를 체크하며 다른 작업을 계속 수행할 수 있다면, 이는 Non-Blocking 방식으로 처리되는 것입니다. 따라서 Future.get
처럼 결과를 기다리는 동안 다른 작업을 수행할 수 없는 API를 사용한다면, T1은 Task4에서 Blocking 되는 것으로 이해하시면 됩니다.