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개의 댓글

관련 채용 정보