Non-blocking

JaeGu Jeong·2022년 11월 8일
0

프로세스의 io

프로세스는 기본적으로 시스템콜을 하면서 다른 read write같은 시스템콜작업을 할 수 없다. 반드시 진행중인 시스템콜이 종료되고 다음으로 넘어간다. 이를 blocking 블로킹상태라고 한다.
웹서버와 같은 소켓io작업이 빈번한 프로그램에서는 서비스운영이 불가능 할 수 밖에없다. 이때 c언어 기준 "fcntl(fd, F_SETFL, O_NONBLOCK);"같이 파일을 non-blocking상태로 만들고 IO작업을 하면 블로킹이 이루어지지않고 바로 IO함수가 반환 된다.

예시 상황

소켓프로그래밍 기준으로 listen중인 소켓을 accept시스템콜 하였을 때 소켓에 특별히 작업을 하지않는이상 connect가 들어 올 때까지 프로세스는 blocking이 된다. 하지만 non-blocking을 설정하면 accept시스템콜을 하였을 때 connect를 기다리지않고 바로 상태가 반환된다.

실제 사용예시

여러개의 클라이언트를 하나의 스레드에서 처리 할 때. 멀티플렉싱 (select, poll, kqueue)을 사용하여 구현한다.

논블록 파일 두개가 동시에 io작업 시도할 때

첫번째 fd에서 1기가의 데이터를 처리하는 도중 두번째 fd의 io작업이 동일 프로세스에서 일어나면 기존 io는 종료된다. 첫번째 fd가 read중이었다면 끊긴 지점까지 처리한 사이즈를 반환하게 된다.

profile
BackEnd Developer

0개의 댓글