네트워크에서 들어온 데이터가 어플리케이션에서 사용되기까지

  • 먼저 네트워크에서 데이터가 들어오면 nic에서 데이터를 받아 kernel buffer에 저장함

    • 이때 데이터를 처리하는 방식이 4가지 존재 링크
      • 데이터가 들어오면 바로 interrupt를 발생시켜 mainboard의 cpu를 사용하는방식
      • NIC의 cpu를 사용해서 데이터를 저장하고 저장이 끝나면 interrupt를 발생시키는 방식
  • 커널 버퍼에 있는 데이터를 실제 사용할 프로세스에 전달하는 과정

    • 커널버퍼와 유저버퍼가 따로있다
      • 커널버퍼는 모든 프로세스가 사용할수 있는 공유공간
      • 유저버퍼는 우리가 실행한 프로세스가 사용하는 공간
    • 커널버퍼에 있는 데이터를 유저버퍼에 가져오려면 system call을 호출해야함
    • 소켓의 모드에 따라 blocking, non-blocking이 나눠짐
      • blocking 방식
        • accept 호출 시 쓰레드는 데이터를 가져올 때까지 계속 대기함
      • non-blocking 방식
        • accept 호출 시 데이터가 없을경우 ERROR WOULD BLOCK을 리턴하여 쓰레드가 block되지 않음, 데이터가 있을경우 데이터를 가져옴

I/O multiplexing

  • 하나의 쓰레드에서 하나이상의 소켓을 관리하는 방법
    - select, epoll, io_uring, IOCP 등이 사용됨
    - 바로 accept를 호출하는 것이 아니라, 소켓에서 변경이 발생했는지 여부를 먼저 확인하고 변경이 발생하면 accept를 호출함

왜 Block IO보다 IO Multiplexing이 느릴까?

Block I/O

Pasted image 20231105204457

  • 데이터가 커널로 들어오면 데이터가 바로 커널스페이스에서 유저스페이스로 이동함

Non Block I/O

  • 방법이 2가지 있음

데이터가 들어왔는지 반복해서 확인

Pasted image 20231105204700

  • 우선 반복적으로 확인하기 때문에 cpu 자원낭비가 됨
  • 데이터가 들어온시점과 반복적으로 확인한 시점 사이에 시간차가 발생할 수 밖에 없기 때문에 Block I/O보다 느림

데이터가 들어오면 알려 줌

Pasted image 20231105205052

  • 데이터가 들어오면 커널에서 알려줌
  • 알려주면 쓰레드에서 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

https://meetup.nhncloud.com/posts/54#:~:text=%EC%9C%84%EC%97%90%EC%84%9C%20%EB%91%90%20%EA%B0%92%EC%9D%80%20%EA%B0%81%EA%B0%81%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%ED%8F%AC%ED%8A%B8%20%EB%B2%94%EC%9C%84%EC%9D%98,%EC%86%8C%EC%BC%93%20%EC%88%98%EB%8A%94%20%EC%9D%B4%EC%97%90%20%EB%AF%B8%EC%B9%98%EC%A7%80%20%EB%AA%BB%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4

#Network
#ComputerScience
#Non-Blocking-IO

Licensed under CC BY-NC-SA 4.0
마지막 수정: Jul 15, 2024 03:16 UTC
Hugo로 만듦
JimmyStack 테마 사용 중