ssausand-sunny / cs-study

면접.. 붙으려면 CS 공부 해야겠지?
0 stars 0 forks source link

동기와 비동기, 블로킹과 논블로킹의 차이에 대해 설명해 주세요. #32

Open kgh2120 opened 3 months ago

kgh2120 commented 3 months ago

문제

예상 꼬리 질문 - 그렇다면, 동기이면서 논블로킹이고, 비동기이면서 블로킹인 경우는 의미가 있다고 할 수 있나요? - I/O 멀티플렉싱에 대해 설명해 주세요. - 논블로킹 I/O를 수행한다고 하면, 그 결과를 어떻게 수신할 수 있나요?

들어가야 할 키워드 정리

kjy0349 commented 2 months ago
예상 답안

동기와 비동기는 해당 작업의 완료 여부에 따라 다음 작업을 수행하는지에 대해 차이를 갖고 있습니다. 동기와 같은 경우, 이전 작업이 완료되지 않으면 이후 작업을 수행하지 않는 방식입니다. 비동기는 이와 반대로 작업의 완료여부와 상관없이 다음 작업을 수행합니다. 블로킹과 논블로킹은, 해당 작업을 호출한 함수에게 제어권을 넘기느냐의 여부에 따라 구분하는 방식입니다. A 작업이 B 작업을 호출하고, B 작업이 완료될 때 까지 A 작업의 결괏값을 return하지 않고 기다리는 경우를 블로킹, 반대를 논블로킹이라고 합니다.

예상 꼬리질문 답안

1. 동기이면서 논블로킹일 경우는 전체 프로그램의 실행흐름은 해당 작업을 호출할 경우 작업의 return이 나와 콜백함수를 호출할 때 까지 기다리므로 polling 작업과 같은 경우에 의미가 있습니다. 비동기이면서 블로킹인 경우는 의미가 없습니다.
2. I/O 멀티플렉싱은 여러 I/O 작업을 동시에 처리하기 위해 사용하는 기술로, 주로 여러 소켓을 동시에 모니터링하고 처리하기위해 사용됩니다.
3. 논블로킹 I/O의 경우, polling 방식으로 해당 I/O 작업의 결과를 계속해서 체크해줌으로써 완료되었을 때에 결과를 수신할 수 있습니다.

Hunnibs commented 2 months ago
질문 답변

동기/비동기는 요청과 반환을 순서대로 처리하는지 아닌지의 차이가 있고 블로킹/논블로킹은 호출 시 제어권을 넘기는가 안 넘기는가의 차이가 있습니다. 동기는 요청 후 반환이 돌아와야 다음 요청을 보내는 방식이고 비동기는 요청을 보내고 반환이 돌아오지 않아도 다음 요청을 보낼 수 있습니다. 블로킹은 요청을 보내는 순간 제어권이 넘어가서 요청을 보낸 스레드는 반환을 기다리는 상태이고 논블로킹은 제어권을 가지고 있어 요청을 보낸 이후에도 쓰레드 내 다른 작업을 계속할 수 있음을 의미합니다.

꼬리 질문

1. 그렇다면, 동기이면서 논블로킹이고, 비동기이면서 블로킹인 경우는 의미가 있다고 할 수 있나요? 동기이면서 논블로킹인 경우는 요청을 보내고 제어권은 쓰레드 내에서 관리하여 다른 작업을 수행할 수 있기 때문에 의미가 있습니다. 이는 다운로드나 게임 내 맵 로딩과 같이 진행률을 보여줘야하는 경우 많이 사용됩니다. 반대로 비동기이면서 블로킹인 경우는 의미가 없다고 생각합니다. 제어권을 넘기고 해당 작업이 완료될 때까지 기존 쓰레드는 아무런 동작을 하지 못하는데 이는 동기 작업과 다른 것이 없기 때문입니다. 2. I/O 멀티플렉싱에 대해 설명해 주세요. I/O 멀티플렉싱은 하나의 소켓 내에서 여러 I/O 동작 처리를 수행하기 위한 방식입니다. 3. 논블로킹 I/O를 수행한다고 하면, 그 결과를 어떻게 수신할 수 있나요? JavaScript 기준으로 콜백함수를 사용한 결과 수신 방법이 있습니다.

Leeminw commented 2 months ago
질문 답변

동기와 비동기의 경우 작업의 진행 순차에 대한 차이를 가지고 있습니다. 동기의 경우 해당 작업이 끝난 후 다음 작업으로 넘어가지만, 비동기의 경우 병렬적으로 처리되어 작업이 끝나지 않더라도 다음 단계로 넘어갑니다. 블로킹 논 블로킹의 차이점은 함수 호출에 따른 제어권의 소유 차이입니다. 현재 작업이 블로킹 되거나, 안되거나의 차이가 있습니다.

예상 꼬리 답변

- 그렇다면, 동기이면서 논블로킹이고, 비동기이면서 블로킹인 경우는 의미가 있다고 할 수 있나요? 동기이면서 논블로킹인 경우, 제어권을 원 함수에서 가지고 있기때문에 추가 작업이 가능하기 때문에 의미가 있지만, 비동기이면서 블로킹인 경우, 기존의 동기방식과 큰 차이가 없어지기 때문에 의미가 없습니다. - I/O 멀티플렉싱에 대해 설명해 주세요. 여러 입출력 스트림을 하나의 쓰레드나 프로세스로 동시에 처리할 수 있게 하는 기술입니다. - 논블로킹 I/O를 수행한다고 하면, 그 결과를 어떻게 수신할 수 있나요? polling 방식으로 주기적으로 완료가 되었는지 체크하거나, 콜백함수를 통해 완료여부를 체크합니다.

kgh2120 commented 2 months ago
예상 답변 동기와 비동기는 작업의 완료 순서에 대한 개념입니다. 동기의 경우 작업의 완료 순서가 실행 순서와 일치해야하고, 비동기의 경우 작업의 실행 순서와 완료 순서가 일치하지 않을 수 있습니다. 블로킹과 논블로킹은 제어권 소유에 대한 개념입니다. 여기서 제어권이란 동작을 수행하는 것을 의미합니다. 블로킹의 경우 함수 A가 함수 B를 호출하면, 함수 A는 대기해야 합니다. 논 블로킹의 경우 함수 A가 함수 B를 호출하더라도 여전히 함수 A는 동작할 수 있는 것을 말합니다.
예상 꼬리 질문 답변 - 그렇다면, 동기이면서 논블로킹이고, 비동기이면서 블로킹인 경우는 의미가 있다고 할 수 있나요? 동기이면서 논블로킹의 경우는 함수 A가 함수 B를 호출한 상황에서 함수 B가 완료되기 이전까지 함수 A의 작업을 할 수 있다는 점에서는 의미가 있을 수 있다고 생각합니다. 그에 반면 비동기 블로킹의 경우, 함수 A는 함수 B가 호출되는 동안은 기다려야하기 때문에, 동기-블로킹과 동일하여 의미가 없다고 생각합니다. - I/O 멀티플렉싱에 대해 설명해 주세요. 하나의 통신 채널(쓰레드, 프로세스)를 통해 여러 개의 클라이언트와의 통신하기 위한 기술입니다. 다수의 클라이언트와의 통신 과정에서 발생하는 오버헤드를 줄일 수 있다는 장점이 있습니다. - 논블로킹 I/O를 수행한다고 하면, 그 결과를 어떻게 수신할 수 있나요? 콜백 함수를 사용해 호출한 함수가 종료될 때 동작하는 함수를 등록해 수신할 수 있습니다. JavaScript의 경우 콜백함수, Promise객체, 이벤트 등록을 통해 결과를 수신할 수 있고, Java의 경우 CompletableFuture와 같은 클래스를 사용해서 결과를 수신할 수 있습니다.