Input/Output 입출력 연산. 입출력은 컴퓨터 내부 또는 외부 장치와 프로그램간의 데이터를 주고 받는 것을 말한다.
호출된 함수가 작업이 완료될 때까지 블로킹 상태가 되는 함수를 블로킹(Blocking) 함수라고 한다. 이 함수들을 활용한 입출력 연산을 동기(synchronous) i/o라고 한다.
비동기 i/o는 함수 호출 이후에 작업이 완료되기 전이어도 바로 반환을 해 다른 함수가 호출될 수 있게 한 넌블로킹(non-blocking)함수들을 이용한 입출력 연산이다.
중첩(Overlapped) i/o
반환이 곧바로 이루어지며 서로 다른 i/o 작업들이 중첩될 수 있다.
ex) 데이터 수신에서 read 함수 사용 시, 한 파일을 read하고, 그 read가 cpu를 점유하는 것이 아니라, 곧바로 cpu 사용을 반환하고, 다른 read 함수들을 중첩해서 실행하면, i/o 작업에서 그것들이 중첩되어 실행됨. 이것의 장점은, 물리적인 i/o 연산의 느린 속도 한계를 병렬적으로 실행시키므로써, CPU 사용 효율과, i/o 자체의 성능 향상을 이룰 수 있음.
완료루틴(Completion Routine) 기반 확장 i/o
중첩 i/o가 끝났을 시, 각 작업별 부가적 작업을 수행해줘야 할 경우가 있다. 병렬적으로 실행 시, 어느 것이 먼저 끝날지는 비동기적 i/o에서는 알 수 없음. 그렇기 때문에 프로그래머는 각 i/o 작업을 일일이 확인해주고, 그것이 끝났을 때의 작업을 정해줘야 할텐데, 이 때 사용하는 것이 완료루틴임.
i/o 작업이 완료되었을 경우에 대한 ‘루틴’을 미리 정해두고, 작업이 끝났을 경우에 실행할 작업을 이어주는 것.
이미지 출처 : homoefficio님의 블로그
블로킹/논블로킹은 호출된 함수
가 호출한 함수
에게 제어권을 건네주는 유무의 차이다.
Blocking : 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에게제어권을 넘겨주지 않고 대기하게 만든다.
Non-Blocking : 호출된 함수가 바로 리턴해서 호출한 함수에게 제어권을 넘겨주고, 호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있다.
동기/비동기는 일을 수행중인 동시성
에 주목한다.
Synchronous : 호출하는 함수가 호출되는 함수의 작업 완료 후 리턴을 기다리거나, 또는 호출되는 함수로부터 바로 리턴 받더라도 작업 완료 여부를 호출하는 함수 스스로 계속 확인하며 신경쓴다.
Asynchronous : 호출되는 함수에게 callback을 전달해서, 호출되는 함수의 작업이 완료되면 호출되는 함수가 전달받은 callback을 실행하고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는다.
- 성능과 자원의 효율적 사용 관점에서 가장 유리한 모델은 Async-NonBlocking 모델이다.
NonBlocking은 제어문 수준에서 지체없이 반환하는 것
Asynchronous는 별도의 쓰레드로 빼서 실행하고, 완료되면 호출하는 측에 알려주는 것
동기로 작업을 해야할 때 : 어떤 일을 수행한 결과로 다음 일을 수행할 때 (결과가 다음 일에 지장을 줄 때) ex) 인출 후 송금
왜 비동기를 사용하는가?
사이즈가 큰 파일을 읽을 때 대부분의 작업은 IO에 관련된 하드웨어가 하고 CPU는 대기 상태로 빠지게 된다. 대기 시간 동안 프로그램은 아무것도 할 수 없고 작업 완료에 필요한 시간은 길어진다.
-> 비동기를 사용하면, 파일을 읽는 동안 다른 일을 하고, 파일 읽기 완료 " 통보"를 받으면 다시 파일에 대한 처리를 할 수 있다.
다행히 대부분의 모던 OS에서는 이런 비동기 입출력을 지원하며 우리는 파이썬을 통해 그것을 사용하기만 하면 된다. -> asyncio
라이브러리, async/await
키워드
비동기 함수를 사용하면 CPU의 유휴 시간을 줄여 전체 프로그램 효율을 향상 시킬 수 있다.
http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
https://wiserloner.tistory.com/730
https://superbono-2020.tistory.com/8
https://kukuta.tistory.com/345 [HardCore in Programming]