ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Process
    학교 수업/유닉스 2020. 6. 20. 18:02

    Process 프로세스

    - OS의 process 관련 포스팅에서 개념들은 다뤘다.

      (참고주소 : https://comyoung.tistory.com/97?category=854787)

      그 외의 unix에서의 process 설명들을 설명해보겠다.


    1.     프로세스 구조


        텍스트 영역: 실행 코드를 저장한다. 텍스트 영역은 프로세스 실행 중 크기가 변하지 않는 고정 영역에 속한다.

        데이터 영역: 프로그램에서 정의한 전역 변수를 저장한다. 전역 변수는 프로그램을 작성할 때 크기가 고정되므로 고정영역에 할당된다. (컴파일 때 배열 크기가 정해진다.)

        (heap): 프로그램 실행 중에 동적으로 메모리를 요청하는 경우에 할당되는 영역으로, 빈 영역할당할당 해제처럼 상태가 변하는 가변 영역이다. (runtime시 배열 크기 유연)

        스택(stack): 프로그램에서 정의한 지역 변수를 저장하는 메모리 영역으로, 지역 변수를 정의한 부분에서 할당해 사용한다. 서브 함수를 부를 때 stack에 쌓인다.

        빈 공간: 스택이나 힙과 같이 가변적인 메모리 할당을 위해 유지하고 있는 빈 메모리 영역이다. 프로세스에 할당된 빈 메모리 영역이 모두 소진되면 메모리 부족으로 프로그램의 실행이 중단될 수도 있다.

    2.     PID(process ID): 시스템에서 여러 프로세스를 식별하기 위해 사용

    -> system call: getpid(), getppid()

    3.     PGID(process group ID): 관련 프로세스들이 모여 프로세스 그룹을 구성, 이를 구성하는 프로세스 중 하나가 그룹의 리더가 되고 리더의 PIDPGID가 된다.

    4.     Session(세션): POSIX표준에서 제안한 개념으로, 사용자가 로그인해 작업하는 터미널(terminal)단위로 프로세스 그룹을 묶은 것 

    (, 프로세스들을 묶으면 프로세스그룹, 프로세스그룹들을 묶으면 세션)

    프로세스가 새로운 세션을 생성하면 해당 프로세스가 세션의 리더가 된다

    Controlling terminal: 표준 입출력에 연결된 terminal


    5.     프로세스 종류

    시스템 프로세스: UNIX운영에 필요한 기능 수행

    사용자 프로세스: 사용자들이 실행시킨 프로세스

        데몬(daemon): 특정 서비스 제공하기 위해 존재, 리눅스 커널에 의해 실행되고 평소에는 대기상태로 요청을 기다림

        부모: 자식 프로세스를 생성하는 프로세스, 모든 프로세스는 부모로부터 기본 환경을 물려받음 

     (프로세스가 프로세스를 만들기 때문에 tree구조를 가짐, shell도 프로세스)

        자식: 부모에 의해 생성, 부모에게 결과를 return하고 종료

        고아: 자식 프로세스가 실행 중인데 부모가 먼저 종료된 경우, 1(init)프로세스가 새로운 부모가 되어 종료를 지원

        좀비: 이미 사용중인 자원을 반납했지만 부모 프로세스로부터 작업종료에 대한 승인을 받지 못한 상태

    좀비 프로세스들은 실행되고 있지 않지만 프로세스 테이블 목록을 차지하고 있어 자원의 낭비요소가 된다

    Kill명령으로 제거 불가능하며 부모 프로세스에게 SIGCHLD를 통해 자식을 없애거나 부모 자체를 종료해야 한다.


    6.     프로세스 생성 (fork, exec)

         Fork: 부모가 fork()함수 호출하면 새로운 메모리공간을 할당받은 자식프로세스가 생성된다.

    -       부모의 stack, heap, data 공간을 copy (다른 메모리에 저장)

    -       부모와 자식은 코드만 공유

    -       Fork()함수의 반환 값은 자식과 부모에서 다르다 (자식: 0반환, 부모: childpid반환)

    -       Forkopen file 있을 경우: 부모와 자식은 같은 file table을 공유하고 이는 exec호출되어도 공유됨

      (공유하기 싫은 경우 부모가 file lock 걸면 됨 -> close-on-exec flagon으로 설정)

         Exec: 원래 프로세스를 새로운 프로세스로 대체한다.

    -       메모리에 새로운 프로세스의 코드를 덮어 씌움

    -       코드의 첫 줄부터 수행된다.


    7.     프로세스 종료

    프로세스가 종료되는 두가지 경우 정상종료, 비정상 종료

         정상 종료: main()함수가 끝나면 자동으로 exit()함수가 실행되고 종료된다.

         비정상 종료: exit()실행 없이 종료된 것

                   i.         Abort system call (잘 안 씀)

                  ii.         Signal 받을 경우 (kill)


    8.     Synchronizing process – wait함수

         Wait(): 부모 프로세스가 자식 프로세스의 종료 상태를 얻기 위해 사용. à 좀비 프로세스, 고아 프로세스가 발생하지 않는다.

         Waitpid(pid, &status, options): 여러 자식들 중 특정 pid에 대해서만 기다린다.


    9.     포그라운드 & 백그라운드 프로세스

         포그라운드 처리: 사용자가 입력한 명령이 실행되어 결과가 처리될 때까지 프롬프트가 출력되지 않아서 다른 명령을 입력할 수 없는 처리방법

         백그라운드 처리: 명령의 입력이 끝나면 결과에 상관없이 바로 다음 프롬프트가 출력되어 다른 명령을 입력할 수 있는 처리 방법

    (명령의 처리시간이 오래 걸리는 경우 유용, 데몬 프로세스처럼 서비스 요청이 올 때까지 기다려야 하는 프로세스들 유용) 




    Signal

    -특정 이벤트가 발생했을 때 프로세스에게 전달하는 소프트웨어 인터럽트이다.

     모든 시그널의 이름은 SIG-로 시작하고 <signal.h>헤더에 양수인 상수로 정의된다.


    시그널 동작 과정

    1.     시그널 발생

    A.     외부에 의해 (^C와 같은 키보드 입력)

    B.     에러에 의해 (나누기 0 hardware exception)

    C.     이벤트에 의해 (alarm()함수, 프로세스 종료 등)

    D.     인위적 발생 (kill 명령)


    2.     시그널 처리 프로세스가 시그널 받으면 3가지 액션 중 한가지 수행

    A.     Ignore action : 그냥 무시하는 방법. 프로세스가 시그널을 무시하기로 지정하면 유닉스는 프로세스에게 시그널 전달 x

    B.     User-defined action – 프레세스가 시그널 처리를 위해 미리 함수를 지정해두고,

    커널에서 시그널 발생 시 해당 함수를 호출해 처리 (signal handler)

    C.     Default action – 각 시그널의 기본 동작을 수행

      모든 시그널의 기본 동작은 종료 or 코어 덤프 생성(SIGSTOP, SIGTSTP, SIGCONT제외한 나머지)

     

      (코어 덤프 비정상적인 종료 시 특정 시점에 작업 중이던 메모리 상태를 기록)


    시그널 핸들러 지정 함수

          void signal(int signo, void (*func) (int))  (해당 시그널 no에 대해 func수행)

      Signo: signal 이름, 아래표에 있는 시그널들 이름

      *func: SIG_ING, SIG_DFL, signal handler(signal caching function)


    SIG_ING : 시그널을 무시하도록 지정

    SIG_DFL : 시그널의 기본 처리 방법을 수행하도록 지정


    (더 최신 버전 int sigaction(signo, *act, *oact) : signo(시그널 넘버), act(액션 수정), oact(이전 액션))

    → 시그널을 받아 이를 처리할 시그널 핸들러 지정뿐만 아니라 플래그 설정해 시그널 처리과정 제어 가능


    3.     Signal mask에 의한 block

    A.     Pending - 시그널 마스크에 의해 signalblock되어 아직 전달되지 않은 signal

    B.     Waiting – blocksignalprocess가 그 signalunblock할때까지 혹은 해당 signal에 대한 처리를 ignore로 변경할 때까지 대기한다.


    주요 시그널 종류


    시그널

    기능

    디폴트 액션

    SIGABRT

    Abort함수(비정상 종료) 호출함으로써 생성됨

    호출 프로세스 자기자신에게 시그널 보냄

    종료 및 코어덤프

    SIGALRM

    alarm함수에 의해 발생.

    Alarm(t)에 의해 지정된 시간 만료되면 호출 프로세스에게 시그널 보냄

    프로세스 종료

    SIGCHLD

    자식 프로세스가 죽었을 때, 부모프로세스에게 이를 알리는 시그널

    무시

    SIGCONT

    정지했던 프로세스가 재개되었을 때, 정지했던 프로세스에게 보내는 시그널

    프로세스 재개 or 무시

    SIGFPE

    0으로 나누었을 때와 같은 산술적 예외에 관한 시그널

    종료 및 코어덤프 생성

    SIGILL

    불법 하드웨어 명령 실행할 때 보내짐

    코어 덤프 및 종료

    SIGINT

    인터럽트 키(^C)가 눌러졌을 때, 포그라운드 프로세스 그룹에 있는 모든 프로세스들에게 시그널 전송

    종료

    SIGKILL

    프로세스를 죽임

    종료 (디폴트 변경 불가)

    SIGPIPE

    파이프 I/O시 발생하는 시그널

    종료

    SIGSEGV

    불법적인 메모리 접근 시 발생

    종료 및 코어 덤프

    SIGSTOP

    프로세스를 멈추기 위한 시그널

    프로세스 멈춤

    SIGTERM

    프로세스 종료

    종료

    SIGTSTP

    ^C눌렀을 때 프로세스를 멈추는 시그널

    프로세스 멈춤

    SIGURS1&SIGURS2

    사용자가 정의한 시그널1,2

    종료


     →  
    SIGKILL vs SIGTERM: 프로세스 종료. SIGKILL은 프로세스가 catch하거나 무시할 수 없다.

     →  SIGSTOP vs SIGTSTP: 프로세스 중단. SIGSTOP은 프로세스가 catch하거나 무시할 수 없다.


    Process Signal Mask


    - 시그널이 생성될 때 취해지는 조치는 해당 시그널의 signal handler signal mask에 따라 다르다.

      Signal mask는 프로세스 속성으로서 signal blocking list이다. , 목록에 있는 시그널은 block


    1.     같은 시그널이 여러 번 들어올 경우 한번만 수행될 수 있도록 한다.

      Signal catching함수가 호출되기 전에 프로세스의 시그널 마스크를 추가하여 같은 시그널 수행 중일 경우 block처리 된다.

      함수의 수행 완료되면 pending을 풀고 block됐던 시그널을 처리

      같은 동작이 여러 번 들어와도 한 개만 저장해 뒀다가 시그널 처리


    2.     프로그램은 sigprocmask() system call을 사용해 signal mask를 변경하여 신호를 차단한다.

    3.     프로세스는 fork()exec()후에 시그널 마스크를 상속한다.

    4.     , signal handlerfork()까지만 유효하다.


    '학교 수업 > 유닉스' 카테고리의 다른 글

    유닉스란  (0) 2020.05.23

    댓글

Designed by Tistory.