📍 알아야 할 지식
- I/O작업은
커널레벨
에서만 수행이 가능하다. 따라서, 프로세스와 스레드는 커널
에게 I/O를 요청해야만 한다.
Blocking I/O
- I/O작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식
- 유저는 커널에게 read작업을 요청
- 데이터가 입력될 때까지 대기
- 데이터가 입력되면 유저에게 결과를 전달한 뒤 return
-> 데이터가 입력될 때까지 대기하는 동안에도, 작업을 중단하기 때문에 자원낭비가 심함
🤔 여러 클라이언트가 접속한 서버에서 Blocking 방식으로 구현한다면?
- 다른 클라이언트가 진행 중인 작업을 중지하면 안되므로, 각각의 클라이언트에게 별도의 스레드를 할당한다. -> 즉 접속자 수가 매우 많아지고 스레드 Context Switching이 잦아진다. 비효율성이 증가함.
Non-Blocking I/O
- I/O 작업이 진행되는 동안 유저프로세스의 작업을 중단시키지 않는 방식
- User Process가 recvfrom 함수 호출 (커널에게 해당 Socket으로부터 data를 받고 싶다고 요청함)
- Kernel은 이 요청에 대해서, 곧바로 recvBuffer를 채워서 보내지 못하므로, "EWOULDBLOCK"을 return함.
- Blocking 방식과 달리, User Process는 다른 작업을 진행할 수 있음.
- recvBuffer에 user가 받을 수 있는 데이터가 있는 경우, Buffer로부터 데이터를 복사하여 받아옴.
- recvfrom 함수는 빠른 속도로 data를 복사한 후, 복사한 data의 길이와 함께 반환함.
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!