저번 시간에 이어, 이번엔 Sync, Async, Blocking, Non-blocking에 대한 면접 질문들을 알아보겠습니다. 출제 빈도가 조금 있는 편이라고 생각합니다. 많이 헷갈리는 부분이지만, 꼼꼼히 학습하여 대비하시길 바랍니다.
Q: Sync와 Async를 설명해보세요
- Sync: A 함수가 B 함수를 호출할 때, B 함수의 작업이 완료될 때까지 A 함수가 대기하고, B 함수의 결과를 A 함수가 처리합니다.
- Async: A 함수가 B 함수를 호출할 때, B 함수의 작업을 요청한 후, 대기하지 않고 다음 코드를 실행합니다. B 함수의 작업이 완료되면 콜백이 호출되거나 이벤트를 발생시켜 결과를 처리합니다.
Q: Blocking과 Non-blocking은 무엇인가요?
- Blocking: A 함수가 B 함수를 호출할 때, B 함수의 작업이 완료되기 전까지 A 함수에게 제어권을 돌려주지 않고 대기합니다. A 함수는 B 함수가 작업을 마칠 때까지 멈추어 있습니다.
- Non-blocking: A 함수가 B 함수를 호출할 때, B 함수가 바로 제어권을 A 함수에게 돌려주면서, A 함수가 다른 작업을 수행할 수 있도록 합니다. B 함수의 작업이 완료되면 알림이나 콜백을 통해 결과를 전달받을 수 있습니다
Q: 그렇다면 동기(Sync)와 비동기(Async)를 각각 어떤 상황에서 사용해야 하나요?
동기(Sync)는 서비스의 순서가 중요하거나, 이전 작업의 결과물이 영향을 끼칠 때 사용합니다.
- 파일을 읽은 후 데이터를 처리하는 프로세스를 예로 들 수 있습니다.
비동기(Async)는 작업끼리의 순서가 중요하지 않고 시간이 오래 걸리거나 외부 리소스에 접근해야 하는 경우에 사용합니다.
- 네트워크 호출이나 대규모 파일 다운로드 등을 예로들 수 있습니다.
Q: 그럼 Blocking과 Non-blocking은 어떤 상황에서 쓰이나요?
Blocking은 사용자의 입력을 기다리거나 쿼리의 결과를 기다리는 등, 이전에 호출한 작업이 완료될 때까지 대기하는 상황에서 사용됩니다.
Non-blocking은 여러 Web Page를 동시에 로드하면서 하나의 Page 로딩이 지연 되어도, 다른 Page의 로딩이 계속되는 것으로 설명할 수 있습니다.
Q: Blocking과 Non-blocking 사용 시 주의할 점이 있을까요?
블로킹은 오래 걸리는 작업이 있으면, Application 전체가 멈출 수 있으므로, 긴 작업은 별도의 스레드나 프로세스에서 처리하는 것이 권장됩니다.
논블로킹은 Callback hell을 방지하기 위해 프로미스(Promise)나 async/await을 사용하는 것이 좋습니다.
- Callback hell: 무한 콜백
Q: Sync와 Async, 그리고 Block과 Non-Block은 비슷하게 들리는데, 차이점을 더 상세하게 설명해주세요.
Sync(동기)와 Async(비동기)는 작업의 완료 시기와 결과물에 초점을 둔다면, Block(블로킹)과 Non-Block(논블로킹)은 제어권과 대기 여부에 초점을 맞춥니다.
마치며
이번 시간에는 Sync와 Async, 그리고 Blocking과 Non-blocking에 대해 알아보았습니다. 굉장히 어려울 수 있는 부분이라고 생각합니다. 운영체제 카테고리도 지금까지 다양한 질문을 다루어 왔습니다. 한 번에 익힐 수 있는 양이 아니기 때문에 반복적인 복습이 필요합니다.
꼼꼼하게 숙지하셔서 좋은 결과 있으시길 바랍니다.
답글 남기기