webserv과제는 nginx를 기반으로 만들어야한다.
nginx와 자주 비교당하는 웹서버중에 apache가 있다.
그렇다면 이 두가지는 어떻게 다르며, nginx를 기반으로 구현하라는 말은 무엇일까?
apache는 스레드/프로세스 구조 기반으로 클라이언트의 요청이 하나들어올때마다, 하나의 스레드를 생성하여
요청을 처리한다.
그렇기때문에, 요청이많아지면 메모리 및 CPU의 자원낭비가 심하다.
nginx는 "비동기", "Event-Driven"기반 구조이다.
밑에 설명할, "비동기"에 기반한 구조이다.
간단하게 설명하자면, 여러개의 요청이들어오면 Event-Handler를 통해 비동기방식으로 처리한다.
동기와 비동기는 두개이상의 실행을하는 "주체"가 다른 실행주체의 결과를 기다리거나 기다리지않는것이다.
A라는 실행주체가있고, B라는 실행주체가 있다.
A를 기준으로 설명할때, A는 B에게 C라는 실행을 요구한다.
이때, A가 C를 기다린다면 동기! 아니면 비동기! -> 즉, 실행순서를 보장하는가에 대한 매커니즘이다.
동기는, A라는 함수가 B라는 함수를 호출한다. 이때, A함수는 B함수의 리턴값(결과)에 신경을쓴다.
만약, 논블록킹과 함께 실행된다면, 폴링(polling)으로서 계속해서 확인한다.
비동기는, A라는 함수가 B라는 함수를 호출한다. 이때, A함수는 B함수의 리턴값에(결과)에 신경쓰지않는다.
그렇기때문에, A함수는 B함수를 호출할때, callback 함수를 같이보내 결과값을 받는다.
비동기와 논블록킹은 사용이되지만, 비동기와 블록킹은 거의 없는경우이기때문에 넘어가도록한다.
블록킹과 논블록킹은 하나의 실행주체가 두개 이상의 실행을 할때, 결과를 기다리거나 기다리지않는것이다.
A라는 실행주체가있고, a와 b라는 실행이 있다.
A가 a라는 실행을할때 b라는 실행을 하고 b의 결과값을위해 a의 실행을 멈추고 기다린다면! (제어권을 b에게 넘겨줌), 블록킹
A가 a라는 실행을할때 b라는 실행을 하며, b의 결과를 기다리지않고 실행한다면! (제어권을 넘겨주지않음) 논블록킹
결과부터 이야기하자면, 동기/비동기 그리고 블록킹/논블록킹은 아무런 연관이없으며, 각 조합으로서 의미를 지닌다.
예) 동기 + 블록킹
hyungyoo: 맥주줘 (sucho 얼굴만 보면서 아무것도안하고 기다림)
sucho: 여기
예) 동기 + 논블록킹
hyungyoo: 맥주줘
hyungyoo: 다됨? (핸드폰하면서 기다림)
sucho: ㄴㄴ 아직
hyungyoo: 다됨? (핸드폰하면서 기다림)
sucho: ㄴㄴ 아직
hyungyoo: 다됨? (핸드폰하면서 기다림)
sucho: ㅅㅂ ㄴㄴ 아직
sucho: 여기
예) 비동기 + 논블록킹
hyungyoo: 맥주줘, 준비다되면 카톡줘(callback)
hyungyoo: (핸드폰으로 게임, 기다리지않음)
sucho: 준비됨(카톡)
예) 비동기 + 블록킹
거의 없음