본문 바로가기
정글 2기/OS 운영체제

[OS운영체제] Tiny Web Server 정리 및 Thread와 fork()

by Dean30 2021. 9. 25.
728x90

[OS운영체제] Tiny Web Server 정리 및 Thread와 fork()

 

Tiny웹서버 정리

Tiny Web Server

  • socket() 함수를 통해 socket 생성 후 bind()를 통해 주소 연결하고 listen()함수로 수동적인 상태로 만듦.
  • 이 식별자를 가지고 accept()로 client의 connection을 기다림
  • 연결 되면 connfd가 생성되고 이로서 읽고 쓰기 통신이 가능해짐
  • doit(connfd)를 통해 HTTP transaction 처리

 

doit

  • HTTP reqeust 요청 라인 읽어서 정보 파악 (GET / HTTP/1.1)
  • 파싱 후 static contents인지 dynamic contents인지 파악
  • static인 경우 디스크 내용 Mmap()을 통해 가상메모리 매핑 후 connfd에 write하여 전달
  • dynamic인 경우 부모 프로세스는 listen을 계속 해야하므로 자식 프로세스를 fork하여 execve를 통해 자식 컨텍스트에서 실행. Dup2를 통해 표준 출력을 클라이언트와 연계된 connfd로 재지정
  • dynamic contents로 인자 전달 방법은 URI에서 (파일이름?인자1&인자2) 파싱하여 사용

 

 

 

Thread와 fork

 

Thread와 fork 는 모두 2개 이상의 클라이언트 요청을 처리하기 위해 사용된다. 즉 서버가 하나밖에 없어 하나의 요청밖에 처리할 수 없다면 한 요청 처리가 끝날 때까지 다른 요청들은 처리할 수 없어 다운되는 상황이 되기 때문이다. 차이점은 Thread는 fork 의 비효율성을 극복하기 위해 사용된다는 점이다.

 

 

Thread

특징

  • Web server에서 listen() 함수 실행시 생성된다.
  • Thread에서 다른 Thread를 만들어 진행한다
  • Process의 대부분을 공유하며 Thread를 위한 자료구조, 지역변수, register 저장을 위한 공간, stack, PC 등만 필요할 뿐이다 - 비용이 적다(Light-weight model)
  • Kernel의 리소스를 사용하지 않는다
  • 하나의 Process는 여러개의 Thread를 가질 수 있다
  • fork()와 마찬가지로 스케쥴링의 단위(context switching)이다
  • User level Thread와 Kernel level Thread가 있다

 

장점

  • 한 process에 속한 Thread들은 같은 주소공간을 공유하여 정보 공유가 용이
  • 생성과 context switching, 종료 관점에서 Thread 비용이 훨씬 적게 든다.

 

단점

  • User level Thread의 경우 멀티 프로세서를 지원 못한다.
  • User level Thread의 경우 하나의 Thread가 block되면 process 전체가 block 된다.
  • Kernel level Thread의 경우 kernal 리소스를 사용하여(ststem call) User level Thread에 비해 무겁다.

 

 

fork()

특징

  • Web server에서 dynamic context 처리시 fork() 함수 사용한다.
  • 부모 서버가 자식 서버를 만든다 - 새로운 Process 생성
  • 이 자식 서버가 한 클라이언트의 요청을 처리하도록 만든다 - 요청 수 만큼 fork가 일어난다
  • 모든 자료구조를 다시 생성하고 복사한다 - 비용이 크다 (heavy weight model)
  • Thread와 마찬가지로 스케쥴링의 단위(context switch)이다.

 

장점

  • 하나의 Process가 Block되어도 다른 Process가 작동한다

 

단점

  • fork는 system call이기 때문에 지속적인 요청이 들어오면 시스템이 process 복사하느라 다른 일을 처리하지 못한다 (하나의 process는 하나의 CPU에서 처리)
  • 생성과 context switching, 종료 관점에서 thread보다 비용이 훨씬 많이 든다

 

 

 

 

 

출처 : xenostudy.tistory.com/230

728x90

댓글