ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 뇌자극 TCP/IP 10강 요약
    C_C++ 프로그래밍/뇌를 자극하는 TCP_IP 2019. 6. 2. 11:07

         



    프로세스란?

    최소 실행 단위 객체, 프로그램의 실행 이미지

    프로그램일반적으로 하드 디스크 등에 저장되어 있는 실행코드이며

    프로세스프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위이다

    =>  하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.


    다수의 프로세스를 동시에 운용한다.

    PID (Process ID)를 할당하여 사용한다.


    멀티 프로세스

    동시에 여러 프로세스를 운용한다.

    리눅스와 윈도우 등의 대부분의 운영체제

    프로세스를 번갈아 가면서 사용한다. (시분할, time sharing)

    => 하드웨어로 분할하여 처리 = 멀티 코어


    pid_t = fork(void)

    fork 함수를 이용해서 프로세스를 복사

    부모 프로세스 : fork 함수를 호출한 프로세스
    자식 프로세스 : fork 함수로 복사된 프로세스


    부모와 자식

    자식 프로세스 : pid_t == 0
    부몬 프로세스 : pid_t > 0

    pid_t pid = fork();
    if(pid == 0)
    //자식
    else if(pid > 0)
    // 부모

    하지만 fork() 함수를 사용하면 프로세스를 새로 실행하기 하지만
    자기 자식을 복사하는 행위를 할 뿐, 외부 프로그램을 실행할 수 는 없다.


    exec 관련 계열 함수로 프로그램을 실행 할 수 있다.

    exec 함수를 사용하면, 기존의 프로세스의 이미지를 덮어 쓰기 때문에

    새로운 프로세스를 생성할 수는 없다.




    fork()와 exec()를 사용하여 멀티 프로세스 프로그램을 만들 수 있다.

    리눅스의 Shell은 fork()와 exec()로 만들어져 있다.


    간단한 shell 프로그램

    #include<unistd.h>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<sys/wait.h>
    #include<sys/types.h>

    #define MAX_LINE 256
    #define PROMPT "# "
    #define chop(str) str[strlen(str) -1] = 0x00;

    // shell proc using multi process
    int main(int argc, char ** argv){
            char buf[MAX_LINE];
            int proc_status;
            pid_t pid;
            printf("My shell ver 1.0\n");
            while(1){
                    printf("%s", PROMPT);
                    memset(buf, 0x00, MAX_LINE);
                    fgets(buf, MAX_LINE-1, stdin);
                    if(strncmp(buf, "quit\n", 5) == 0){
                            break;
                    }
                    chop(buf);      // erase '\n'
                    pid = fork();   // get pid
                    if(pid == 0)    // child pid
                    {
                            // non-existent command
                            if(execl(buf, buf, NULL) == -1)
                            {
                                    printf("Execl failure\n");
                                    exit(0);
                            }
                    }
                    if(pid > 0){    // parent pid
                            printf("Cld wait\n");
                            wait(&proc_status);
                            printf("Child exit\n");
                    }
            }
            return 0;
    }




    // 임의의 자식 프로세스를 기다리는 함수
    pid_t wait(int *status);

    // 특정 자식 프로세스를 기다리는 함수
    pid_t waitpid(pid_t pid, int *status, int options);



    다중 클리이언트 처리 기술
    -> 입출력 다중화
    -> 멀티 프로세스 (현재 내용)
    -> 멀티 쓰레드


    Multi Process


    fork 함수 하나로 간단하게 클라이언트를 다중으로 구현이 가능하다.
    이때 accept() 이후에 바로 자식 프로세스를 생성하며

    자식 프로세스는 read(), write()가 가능하도록 구현하며
    부모 프로세스는 accept()로 다시 돌아갈 수 있도록 구현한다.



    멀티 프로세스 기술의 장점

    1. 단순하여 문제점을 바로 알 수 있다.

    2. 오랫동안 사용하여 검증된 기술이다.

    3. 안정적인 동작이 가능하다. (구분된 부모와 자식들)

    -> 안정적이기 때문에 현재까지 사용 중이다.


    멀티 프로세스 기술의 단점

    1. 프로세스 복사에 따른 성능 문제
    -> 자식이 부모 프로세스를 그대로 복사하기 때문에 필요 없는 부분이 있다.

    2. 프로세스간의 정보 교환이 어렵다.
    -> 프로세스가 서로 분리되기 때문에 불리하다.
    -> 까다로운 IPC (내부 프로세스 간 통신 설비)가 필요하게 된다.



    Plus

    소켓을 일일이 생성하지 않고 미리 개발자가 만들어 클라이언트와 서버를 연결 할 수 있다.
    => prefork 기술

    특히 리눅스에서 Apache 멀티 프로세스 관련 모듈(MPM)에는 대표적으로 worker / prefork가 있다.

    prefork 방식 : 하나의 자식에 하나의 쓰레드를 사용한다.
    기본적으로 프로세스 간의 메모리 공유가 없기에 안정적이다.

    worker 방식 : 하나의 자식에 여러 개의 쓰레드를 사용한다.
    동시 접속자가 많은 사이트에 유리하다.

    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다


    반응형

    'C_C++ 프로그래밍 > 뇌를 자극하는 TCP_IP' 카테고리의 다른 글

    시그널 함수의 종류  (0) 2019.06.02
    뇌자극 TCP/IP 11강 요약  (0) 2019.06.02
    뇌자극 TCP/IP 9강 요약  (0) 2019.05.29
    뇌자극 TCP/IP 8강 요약  (0) 2019.05.26
Designed by Tistory.