Multiplexing TCP connection
소켓 API는 기본적으로 blocking이라, accept() 하면 일단 block되고 본다. recv()로 data를 받을 때도 물론.
사용자가 1명이면 Blocking I/O가 문제가 되진 않겠지만, 실제로는 그럴리가 없다. 여러 connection을 동시에 다루는 기술이 필요하다.
Polling Non-blocking Sockets
소켓 자체가 non-blocking operation을 할수 있게 하는 방법 중 fcntl 함수를 호출하는 것인데, 단순히 모든 active socket을 순서대로 확인하는 polling 구조로 되어있어 자원 낭비가 심하며, 구현해야 할게 추가적으로 발생한다. 그래서 일반적으로 Polling 방식을 잘 쓰지 않는다.
Forking and Multithreading
매 커넥션마다 쓰레드나 프로세스를 구성하는 방법은, blocking 자체를 방지하지만 쓰레드를 잘 쓰는것 자체가 어렵고 만약 쓰레드가 state를 공유하는 경우라면 복잡도가 매우 높아진다. 또 각 os가 쓰레드를 위해 서로 다른 API를 쓰다보니 더 복잡하다.
Unix에서 멀티프로세스 작동시키는건 단순히 fork() 함수를 사용하는거라 비교적 간단하지만, 그 자체를 사용하는게 어렵다.
75p
'기타 > 아카이브' 카테고리의 다른 글
[Network exercise] 2. TCP 소켓을 이용하여 HTTP 서버 만들기 (0) | 2020.05.27 |
---|---|
[Network Basic] 2. Socket (0) | 2020.05.27 |
[Network exercise] 1. Local address 목록을 나열하기 (0) | 2020.05.26 |
[Network Basic] 1. Networks and Protocols (0) | 2020.05.26 |
댓글