[CS-네트워크]Blocking I/O & Non-Blocking I/O

지영·2023년 7월 17일
0

CS

목록 보기
43/77
post-custom-banner

📍 알아야 할 지식

  • I/O작업은 커널레벨에서만 수행이 가능하다. 따라서, 프로세스와 스레드는 커널에게 I/O를 요청해야만 한다.

Blocking I/O

  • I/O작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식

  1. 유저는 커널에게 read작업을 요청
  2. 데이터가 입력될 때까지 대기
  3. 데이터가 입력되면 유저에게 결과를 전달한 뒤 return

-> 데이터가 입력될 때까지 대기하는 동안에도, 작업을 중단하기 때문에 자원낭비가 심함

🤔 여러 클라이언트가 접속한 서버에서 Blocking 방식으로 구현한다면?

  • 다른 클라이언트가 진행 중인 작업을 중지하면 안되므로, 각각의 클라이언트에게 별도의 스레드를 할당한다. -> 즉 접속자 수가 매우 많아지고 스레드 Context Switching이 잦아진다. 비효율성이 증가함.

Non-Blocking I/O

  • I/O 작업이 진행되는 동안 유저프로세스의 작업을 중단시키지 않는 방식
  1. User Process가 recvfrom 함수 호출 (커널에게 해당 Socket으로부터 data를 받고 싶다고 요청함)
  2. Kernel은 이 요청에 대해서, 곧바로 recvBuffer를 채워서 보내지 못하므로, "EWOULDBLOCK"을 return함.
  3. Blocking 방식과 달리, User Process는 다른 작업을 진행할 수 있음.
  4. recvBuffer에 user가 받을 수 있는 데이터가 있는 경우, Buffer로부터 데이터를 복사하여 받아옴.
  5. recvfrom 함수는 빠른 속도로 data를 복사한 후, 복사한 data의 길이와 함께 반환함.
profile
꾸준함의 힘을 아는 개발자📍
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

답글 달기