먼저 네트워크에서 데이터가 들어오면 nic에서 데이터를 받아 kernel buffer에 저장함
- 이때 데이터를 처리하는 방식이 4가지 존재 링크
- 데이터가 들어오면 바로 interrupt를 발생시켜 mainboard의 cpu를 사용하는방식
- NIC의 cpu를 사용해서 데이터를 저장하고 저장이 끝나면 interrupt를 발생시키는 방식
- 이때 데이터를 처리하는 방식이 4가지 존재 링크
커널 버퍼에 있는 데이터를 실제 사용할 프로세스에 전달하는 과정
- 커널버퍼와 유저버퍼가 따로있다
- 커널버퍼는 모든 프로세스가 사용할수 있는 공유공간
- 유저버퍼는 우리가 실행한 프로세스가 사용하는 공간
- 커널버퍼에 있는 데이터를 유저버퍼에 가져오려면 system call을 호출해야함
- 소켓의 모드에 따라 blocking, non-blocking이 나눠짐
- blocking 방식
- accept 호출 시 쓰레드는 데이터를 가져올 때까지 계속 대기함
- non-blocking 방식
- accept 호출 시 데이터가 없을경우 ERROR WOULD BLOCK을 리턴하여 쓰레드가 block되지 않음, 데이터가 있을경우 데이터를 가져옴
- blocking 방식
- 커널버퍼와 유저버퍼가 따로있다
I/O multiplexing
- 하나의 쓰레드에서 하나이상의 소켓을 관리하는 방법
- select, epoll, io_uring, IOCP 등이 사용됨
- 바로 accept를 호출하는 것이 아니라, 소켓에서 변경이 발생했는지 여부를 먼저 확인하고 변경이 발생하면 accept를 호출함
왜 Block IO보다 IO Multiplexing이 느릴까?
Block I/O
- 데이터가 커널로 들어오면 데이터가 바로 커널스페이스에서 유저스페이스로 이동함
Non Block I/O
- 방법이 2가지 있음
데이터가 들어왔는지 반복해서 확인
- 우선 반복적으로 확인하기 때문에 cpu 자원낭비가 됨
- 데이터가 들어온시점과 반복적으로 확인한 시점 사이에 시간차가 발생할 수 밖에 없기 때문에 Block I/O보다 느림
데이터가 들어오면 알려 줌
- 데이터가 들어오면 커널에서 알려줌
- 알려주면 쓰레드에서 read syscall을 날려서 데이터를 읽음
- 커널에서 데이터가 들어온걸 알려주고, 쓰레드가 확인해서 해당 데이터를 가져오기 까지 시간 텀이 발생함
https://marmelo12.tistory.com/287
https://www2.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/
https://www.youtube.com/watch?v=uagKTbohimU&list=PLBlnK6fEyqRgKl0MbI6kbI5ffNt7BF8Fn&index=13
https://dfdeboer.github.io/BURKS/pcinfo/hardware/ethernet/nic.htm
https://dfdeboer.github.io/BURKS/pcinfo/hardware/ethernet/hyperlin.htm
https://d2.naver.com/helloworld/47667
https://engineering.linecorp.com/ko/blog/do-not-block-the-event-loop-part1
#Network
#ComputerScience
#Non-Blocking-IO