ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다중 접속 서버
    IOT네트워크프로그래밍 2021. 10. 5. 20:47

    연결형과 비연결형 서버

    연결형

    스트림형 트랜스포트 프로토콜(TCP)을 사용하며 데이터의 안정적인 전달

    비연결형

    비연결형 트랜스포트 프로토콜(UDP)을 사용하는 서버로 네트웍이 안정적인 데이터의 전달을 책임지지 못하기 때문에 응용 프로그램이 필요하면 이를 보상해 주어야 한다

    Stateful(TCP)Stateless(UDP) 서버라고 생각하면 된다.

    Iterative 서버

    클라이언트의 서비스 요구를 순서대로 처리해 주는 서버

    request 처리 시간이 짧은 경우에 사용

    Iterative 서버는 프로그램 구현이 concurrent 서버보다 비교적 간단

    -> 은행 창구에서 한명의 점원이 일을 처리하는 것과 비슷하다.

    Concurrent 서버

    동시에 여러 클라이언트들에게 서비스를 제공하기 위하여 새로운 클라이언트가 접속될 때마다 이 클라이언트가 요구하는 서비스를 처리할 프로세스를 계속 만들어야 한다.

    각 서비스 처리 시간이 불규칙적이거나 길 때 필요

    서버 프로그램 구현이 다소 복잡

    Signal

    프로세스에게 배달된 소프트웨어 인터럽트

    Signal Processing (발생상황)

    터미널에서 특정한 키(보통 delete)눌렀을때 프로그램 수행의 정지를 뜻하는 인터럽트 시그널 SIGINT가 발생하는 경우

    처리

    진보된 시그널 처리 : sigaction

    SignalSigaction의 상호작용

    Sigaction이 좀더 일반적이기 때문에, Sigaction을 사용하는 것이 더 적당하다.

    시그널 핸들링(Signal handling)

    다중 접속 서버

    구현 방법

    제일 많이 쓰는

    fork()

    select()

    Thread

    가 있다.

    fork()

    • 장점
      • 프로세스를 복사해서 하나의 프로그램이 동시에 여러 개의 업무를 처리 할 수 있도록 하는 기법
      • 원본 프로세스 = 부모 프로세스
      • 복사된 프로세스 = 자식 프로세스
      • 디버깅이 용이하다
      • 다중 클라이언트를 제어하는 매우 확실한 방법을 제공한다.
    • 단점
      • 자식 프로세스를 생성하는 데 많은 시간과 자원이 소모된다.
      • 프로세스간의 내부 통신을 위해 IPC 사용해야 한다. IPC로 인해 프로그램의 복잡도와 시스템콜 사용의 부하를 감당해야 한다.

    Process 생성

    int PID = fork();
    if (PID == 0) {
        child_work();	/* 자식 프로세스용 코드 */
    } else {
        parent_work();	/* 부모 프로세스용 코드 */
    }

    좀비 프로세스

    실행이 종료 되었지만 아직 삭제되지 않은 프로세스

    부모 프로세스가 먼저 죽으면, 자식이 리턴할 수 없다. -> zombie process가 나온다.

    wait 함수를 사용해서 좀비 프로세스를 줄일 수 있다. 하지만 더 많이 사용하는 것이 있다.

    waitpid 함수

    #include <sys/types.h>
    #include <sys/wait.h>
    
    
    pid_t waitpid (pid_t pid, int *status, int options);
    
    리턴값 : 성공시 종료된 자식 프로세스의 ID, 실패시 -1

    댓글

Designed by Tistory.