1. I/O가 성능에 미치는 영향
I/O란 데이터의 입력(Input) 과 출력(Output)이 이뤄지는 작업을 I/O라고 한다. 대표적인 예는 파일을 업로드하고 다운로드하는 파일 I/O가 있고, 네트워크를 통해서 다른 서버로 데이터를 전송하거나, 다른 서버로 부터 데이터를 전송 받는 작업도 I/O에 포함된다.
함수를 실행할 때, 일정 시간동안은 CPU를 잡아두고 사용하기 때문에 다음 작업 실행을 block한다. 따라서 이렇게 CPU를 사용하는 작업으로 인한 blocking은 개발자가 할 수 있는게 별로 없는데, I/O로 인한 blocking은 CPU를 긴 시간동안 IDEL하게 두기 때문에 다른 작업을 할 수 있음에도 오랫동안 다른 작업을 실행할 수 없어 비효율적이다.
2. Blocking I/O란?
A 함수가 I/O작업을 호출 했을 때, 작업이 진행되는 동안 유저 프로세스가 자신의 작업을 중단한채, I/O가 끝날때까지 대기하는 방식을 Blocking I/O라고 한다.
Blocking 모드에서 read()시 정해진 크기만큼 수신을 받지 못하면 blocking에 빠져 무한 대기를 할 수 있는 문제점이 있다. write()시에도 정해진 크기만큼 소켓 버퍼로 모두 복사할 때까지 blocking에 빠질 수 있다.
3. Non-blocking I/O란?
어플리케이션이 A 함수의 I/O작업을 호출 했을 때, 커널은 작업 완료(커널 응답) 여부와는 무관하게 바로 응답한다. 커널이 시스템 콜을 받자마자 CPU 제어권을 다시 어플리케이션에게 넘겨주고, 어플리케이션은 I/O 작업이 완료되기 전에 다른 작업을 할 수 있다. 그리고 어플리케이션이 다른 작업들을 수행하다가 커널에게 시스템콜을 반복적으로 보내서 I/O가 완료 됬는지 확인 작업을 한다. 완료되면 I/O작업을 완료한다.
즉, Blocking 상태가 아닌 어플리케이션은 CPU를 다른 프로세스에서 사용함으로서 I/O대기시간을 줄이거나 활용할 수 있다.
하지만, read()시 커널로 부터 응답을 계속 받지 못할 경우 무한루프에 빠지고, 작업 완료라는 응답을 받기까지 계속 실패하여 (EAGIN/EWOULDBLOCK) CPU 자원을 계속 소비한다. write() 할 때는 요청한 데이터 전부가 전송되지 않을 수 있기 때문에 전부 전송될 때까지 에러가 발생하는 문제점이 있다.
Referance)
https://etloveguitar.tistory.com/140
blocking I/O, non-blocking I/O에 대하여 (sync, async와의 차이)
Blocking I/O / Non Blocking I/O, synchronous / asynchronous 는 개발을 하다보면 자주 접하게 되는 용어다. 특히 파이썬, NodeJS와 같이 싱글스레드로 동작하는 언어에서는 성능을 위해 필수적으로 알아두어야
etloveguitar.tistory.com
https://github.com/martinkang/Study/blob/master/LinuxNetworkProgramming/non_blocking_IO.md
GitHub - martinkang/Study
Contribute to martinkang/Study development by creating an account on GitHub.
github.com
'개발 > 개발노트' 카테고리의 다른 글
[Web] Web Server? WAS? (0) | 2023.04.15 |
---|---|
[Network] REST, REST API, RESTful (0) | 2023.04.12 |
Blocking, Non-blocking & Synchronous, Asynchronous 차이점 (1) | 2023.04.05 |
[TCP/IP] 인터넷 계층 프로토콜 (IP, ICMP, IGMP, ARP, RARP) (0) | 2021.03.28 |
[DB] 트랜잭션(Transaction)의 모든 것 (개념, 특징, TCL) (0) | 2021.03.14 |