Multiplexing Kqueue

JaeGu Jeong·2022년 11월 10일
0

Kernel queue

kevent(kqueue fd, kevent배열, 2번인자의 요소갯수, 감지된 대상을 반환받을 kevent배열, 반환받는 요소갯수의 최대갯수, timeout);

**timeout : 대기시간, NULL을 주면 인터럽트가 발생한 kevent구조체가 있을 때까지 대기한다.

멀티플렉싱이란

하나의 스레드에서 여러개의 io를 동시에 처리하는 기법이다.
웹서버를 기준으로 여러개의 send가 들어왔을 때, kqueue를 이용하면 여러개의 클라이언트에 대해 blocking하지 않고도 send/recv IO를 관리 할 수 있다.

웹서버에 큰 파일을 post 중일 때, 다른 클라이언트의 IO요청

request요청을 받고 파일을 서버에 write중일 때 다른 클라이언트의 send io인터럽트가 발생해도 해당 io는 운영체재의 커널단에서 이루어지기 때문에 웹서버실행중인 프로세스와는 상관없이 io가 가능한다.

kqueue에서 fd관리

kqueue에 fd를 kevent구조체 배열로 등록해 두면 io인터럽트가 발생한 kevent구조체들만 따로 뽑에서 배열로 돌려준다. 시간이 오래걸리는 io가 진행중이여도 io에 대해서 queue자료구조를 사용하기 때문에 io순서가 보장된다.

그외에 kqueue와 비슷한 멀티플렉싱 함수 select

select(감지fd들의 마지막 fd에 +1, 읽기 가능한지 감지할 fd_set, 쓰기 가능한지 감지 할 fd_set, 예외 사항이 있는지 검사할 fd_set, timeout)
**fd_set구조체는 fd를 배열처럼 관리 할 수 있는 구조체이다.

profile
BackEnd Developer

0개의 댓글