네트워크

I/O Multiplexing 통한 웹서버 구현하기

Michelle Kim 2023. 5. 31. 13:09

환경: Ubuntu Desktop 22.04.2 LTS on x86

 

0. 개념정리

 

I/O 란 무엇인가?

입출력 다중화

 

필요한 경우?

-TCP 클라이언트가 다수의 소켓을 동시에 처리해야 하는 경우

-TCP Server 가 Listening socket rhk connected socket 을 모두 처리해야하는 경우

-서버가 tcp / udp 모두 지원해야 하는 경우

 

I/O 모델 분류?

I/O 작업은 user space에서 직접 수행할 수 없기 때문에 user process가 kernel에 I/O 작업을 '요청'하고 '응답'을 받는 구조이다

어떤 "순서" 로 받는지에 따라서 'synchronous / asynchronous), 

어떤 "타이밍" 에 받는지에 따라서 "blocking/ non-blocking) 으로 파일을 다루는 모델을 분류할 수 있다.

 

synchronous: 한 작업이 끝나야 다음 작업 실행 (순서 O)

asynchronous: 여러 작업을 동시에 실행 (순서 X)

 

blocking: 반환 값을 기다린 후 다음 작업 실행

non-blocking: 반환 값을 기다리지 않고 다음 작업 실행

 

출처: https://dad-rock.tistory.com/412

특징 ?
- select()를 호출하여 I/O를 할 수 있는 File Descriptor를 리턴받아 해당 File Descriptor를 통해 I/O를 수행한다.
- Application은 select()에서 Blocked되어 Datagram Socket으로부터 메시지를 수신할 때 까지 기다린다.
- select()로부터 Readable Socket을 리턴받으면, Application은 recvfrom()을 호출하여 수신한 메시지를 Application Buffer에 복사한다.
- Blocking I/O Model에 대비적으로, I/O Multiplexing Model에서는 다수의 Descriptor를 처리할 수 있다.
- I/O Multiplexing Model은 Multi-Thread를 사용한 Blocking I/O Model과 유사하다

 

컴파일하는 방법

vi server.c # open the file to make any changes
gcc -o server ./server.c # compile
./server # run the program

참조해야하는 라이브러리

gcc thread.c -lpthread
gcc server.c -lpthread
gcc client.c -lpthread

 

'네트워크' 카테고리의 다른 글

동기, 비동기 요청의 차이  (0) 2023.08.14
[AWS] Light Sail 사용하기  (0) 2023.06.01
[네트워크] TCP/UDP  (0) 2023.04.30
[네트워크] HTTP/Cookie/Threeway Handshake  (0) 2023.04.30
[네트워크] DNS/반복질의/재귀질의  (0) 2023.04.29