TIL 20 | 동기와 비동기

Seon Kang choi·2021년 10월 13일
0

동기화

I/O작업은 애플리케이션에서 직접 수행할 수 없고 커널(OS)에서 일어난다. I/O작업 수행을 위해 시스템 함수를 호출한다. 커널에서는 해당 I/O작업이 끝나고 데이터를 반환하게 된다. 그 때 애플리케이션 스레드에 걸린 block이 풀린다. 애플리케이션 관점에서는 아무런 동작을 안하고 있는거 처럼 보이지만 실제로는 커널에서 작업을 수행하느라 block이 되어 있는 것이다. 이 부분이 blocking I/O의 문제점이며 개선 포인트이다.

Synchronous
작업을 요청 후 해당 작업의 결과가 나올 때까지 기다린 후 처리하는 것으로 I/O작업을 기다린다. 그리고 해당 작업에 따른 적합한 처리를 한다.

Blocking
I/O작업이 끝나 함수가 반화되기까지 기다린다. 커널의 작업이 완료될 때까지 애플리케이션은 중단하고 기다린다. I/O작업은 CPU자원을 거의 쓰지 않기 때문에 자원의 낭비가 심하다.

synchronous vs blocking
시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수가 아니면 synchronous, 필수이면 blocking 이다.

Non-blocking I/O Model
blcoking I/O방식은 요청한 작업이 끝날 때까지 완료될 때까지 대기해야 한다. 위에서 설명한 대로 CPU 자원의 낭비가 심하다. 이러한 비효율을 극복하고자 non-blocking 방식이 나왔다. I/O작업을 진행하는 동안 애플리케이션 작업을 중단시키지 않는다. 애플리케이션이 I/O작업 처리를 위해 커널에 함수를 호출하면 커널에서 진행 상황과 상관없이 바로 결과를 반환한다. 반환되는 결과는 반환하는 순간 가져올 수 잇는 데이터이다. 시간이 지나면서 데이터가 생겨날 것이다.
서버는 요청한 사이즈에 맞는 데이터를 반환하기 위해 데이터를 축적한다. 데이터의 축적이 끝나면 반환되어 요청한 사이즈의 데이터를 받아올 수 있다. 이 구현의 문제는 반환되는 데이터가 원하는 사이즈가 되었는지 계속 확인해야 한다. 이 데이터 사이즈를 확인하는 과정에서 요청이 동시 다발적으로 일어나면 CPU에 부담이 될 수 있다.

blocking vs non-blocking
애플리케이션 실행시 운영체제 대기 큐에 들어가면서 요청에 대한 시스템 콜이 완료된 후에 응답을 보낼 경우 blocking, 대기 큐에 들어가지 않고 실행 여부와 상관없이 바로 응답을 보낼 경우 non-blocking

비동기

작업을 요청하고 다른 작업을 할 수 있고, 해당 작업이 완료되면 완료되었음을 통지받고 그에 따른 작업을 처리하는 것을 말한다. 운영체제 단계의 비동기 API를 통해 이루어지며 작업이 완료되면 그에 맞는 handler를 이용해 처리한다.

synchronous vs asynchronous
시스템 콜의 완료를 기다리면 synchronoous, 기다리지 않으면 asynchoronous

non-blocking vs asynchronous
시스템 콜이 반환될 때 결과와 함께 반환될 경우 non-blocking, 실행된 결과와 함께 반환되지 않으면 asynchronous

profile
유쾌한 개발 생활~

0개의 댓글