개발하는 자몽

[OS] 동기와 비동기, 블로킹과 논블로킹 본문

개발 지식

[OS] 동기와 비동기, 블로킹과 논블로킹

jaamong 2023. 1. 18. 14:59

동기, 비동기에 대해 막연하게만 알고 있다는 생각이 들어 정리하게 되었다. 첫 부분은 아래 글을 번역하고, 번역글 아래에는 여러 자료를 찾으면서 이해한 내용을 정리해 보자.

 

Synchronous vs Asynchronous

Next: Buffering of Messages Up: Message Passing Previous: Remote Assignment vs Procedure The send, receive, and reply operations may be synchronous or asynchronous. A synchronous operation blocks a process till the operation completes. An asynchronous oper

www.cs.unc.edu

1. 오역, 의역 주의

2. 나는 block을 대기로 번역했다. 문맥상 차단이 자연스러울 수도 있지만, 실제 블로킹은 대기에 더 가깝다고 생각하기 때문이다.

3. 일부 문장은 없어도 돼서 번역하지 않았다.

4. 2006년도 글이라서 틀린 부분이 있을 수도 있다.

 

동기 & 비동기 (Synchronous & Asynchronous)

동기식 처리는 한 작업이 수행이 되고 완료될 때까지 프로세스를 대기(block)시킨다. 이 작업이 끝나는 동시에 대기하고 있던 프로세스가 시작된다. 비동기식 처리논블로킹(non-blocking)으로 작업을 시작(initiaite)하기만 한다. 

 

동기식 처리의 개념을 이해하려면 작업이 완료(an operation to complete)된다는 것이 무엇을 의미하는지 이해해야 한다. (생략, 우리가 기본적으로 알고 있는 전송과 수신, 답장이 완료된 것을 의미함)

 

동기와 비동기는 블로킹과 논블로킹을 암시(imply)하지만, 그 반대는 아니다. 즉, 모든 블로킹 작업이 동기는 아니며 모든 논블로킹 작업이 비동기는 아니다. 예를 들어 수신기가 메시지를 받을 때까지 송신은 대기한다. 하지만 수신기가 메시지를 받지 않았을 수도 있기 때문에 동기가 아니다. 이러한 동기/비동기 작업의 정의는 비슷하지만, 동기와 블로킹을 동일시하는 경향이 있는 교과서에 적힌 것과 동일하지는 않다.

 

비동기식 메시지 전달은 더 많은 병렬 처리(parallelism)를 허용한다. 프로세스가 대기하지 않으므로 메시지가 전송되는 동안 일부 계산을 처리할 수 있다. 송신의 경우, 이는 프로세스가 여러 포트에서 동시에 메시지를 수신할 수도 있음을 의미한다. (나중에 논의되는 select primitive는 동기식 수신을 위해 해당 기능을 제공한다). 동기식 시스템에서 이러한 병렬성은 각 동시적인(concurrent) 작업에 대해 별도의 프로세스를 분기함으로써 얻을 수 있지만, 이러한 접근은 추가적인 프로세스 관리 비용을 초래한다. 이 비용은 보통 가벼운 프로세스(lwp, light weight process)에서는 감당할 수 있지만, 무거운 프로세스(hwp, heavy weight process)에서는 그렇지 않다.

 

비동기식 메시지 전달은 몇몇 문제들을 야기한다. 만일 메시지가 전달되지 않는다면? 발신자는 메시지 전달을 기다리지 않을 수 도 있으므로 오류에 대해 듣지 못할 수 있다. 비동기식 수신기에게 메시지가 도착했음을 알리는 메커니즘이 필요하다. 해당 작업의 호출자는 폴링(polling), 소프트웨어 인터럽트를 갖거나 특수한 synchronous wait call을 사용하여 나중에 완료를 명시적으로 기다림으로써 완료/오류에 대해 알 수 있다. 애플리케이션이 나중에 작업에 대한 알람이 필요한 경우 비동기식 작업은 호출/트랜잭션 아이디를 반환해야 한다. 알림 시, 이 아이디는 전역 장소에 배치되거나 handler 또는 wait call에게 인자(argument)로 전달될 수 있다.

 

비동기식 메시지 전달과 관련된 또 다른 문제는 버퍼링과 관련이 있다. 비동기식으로 보내진 메시지가 운영체제에 의해 관리되는 공간에서 버퍼링이 걸리면 프로세스가 시스템에 많은 메시지를 플러딩(flooding)하여 이 공간을 채울 수도 있다.

 

나의 정리

여러 자료를 찾아보니 동기/비동기와 블로킹/논블로킹은 엄연히 다르다는 것을 깨달았다. 동기/비동기는 처리해야 하는 작업들을 어떠한 흐름으로 처리할지, 작업의 완료 여부를 신경쓰는지 아닌지에 대한 관점이라고 한다.

블로킹/논블로킹은 작업 흐름을 막는지 아닌지에 대한 관점이라고 한다. 이는 제어권이 누구에게 있는지가 중요하다.

 

동기호출되는 함수의 완료/반환 여부를 신경 쓴다. 작업들은 순차적으로 실행된다. 위 번역글에서도 동기의 경우 작업이 끝나는 동시에 대기하고 있던 프로세스가 시작된다고 한다. 정리해 보면,

동기는 작업을 순차적으로 처리하며 완료/반환 여부를 신경 쓰므로 동시에 하나의 작업만 처리할 수 있으며, 이 작업이 끝나는 동시에 대기하고 있던 프로세스가 실행된다.

 

비동기는 어떤 함수 A가 함수 B를 호출했을 때 함수 B의 작업 완료 여부를 신경쓰지 않는다. 또한 병렬성(parallelism)을 허용한다. 위 글에서 언급한 것 처럼 비동기는 작업이 완료됐음을 알리는 메커니즘이 필요하다. 함수 B를 호출할 때 콜백 함수(callback function)를 함께 전달하여 B의 작업이 완료되면 이 함수를 실행한다. 따라서 A가 완료 여부를 신경 쓰지 않아도 작업이 끝났음을 알 수 있다. 정리해 보면,

비동기는 작업 완료 여부를 신경 쓰지 않기 때문에 다른 함수를 호출할 때 콜백 함수를 함께 전달하며, 병렬성을 허용하므로 동시에 여러 작업을 처리할 수 있다.

 

블로킹은 함수 A가 함수 B를 호출했을 때 A가 제어권을 B에게 넘겨준다. 제어권을 갖고 있는 B는 자신의 작업을 처리하고, A는 B에게 제어권을 줬기 때문에 작업을 멈춘다. B의 작업이 완료되면 자신을 호출한 A에게 제어권을 돌려준다. 제어권을 받은 A는 다시 작업을 실행한다.

 

논블로킹은 함수 A가 함수 B를 호출했을 때 A가 그대로 제어권을 갖고 있는다. A가 B를 호출하면 B가 실행된다. 하지만 제어권은 A가 가지고 있으며, 여전히 제어권을 가지고 있으므로 작업을 계속 진행한다.

 

 

 

 

 

참고

 

👩‍💻 동기 & 비동기 / 블로킹 & 논블로킹 💯 완벽 이해하기

동기 & 비동기 vs 블로킹 & 논블록킹 개념 이 개념들을 처음 접하거나 컴퓨터 공학에 대해 잘 모르는 사람은 이 개념들이 서로 뭔가 연관이 있는 것으로 오해하기 쉽다. 아무래도 동기와 블록킹,

inpa.tistory.com

 

동기(Synchronous) / 비동기(Asynchronous)

먼저, 동기와 비동기에 들어가기에 앞서 대체 헷갈릴 수 있는 단어들의 종류를 적고 시작하겠습니다. 동기 (Synchronity) : "같은시간"에는 1개의 작업만 처리할 수 있다. 비동기 (Asynchronous) : "같은시

devhyeon0312.tistory.com

Comments