ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제] 프로세스의 구성, 상태, 시스템콜 등 총 정리
    Computer Science/Operating System 2023. 2. 7. 00:28
    반응형

    프로세스란?

    : 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것 

    - 가상 메모리 공간, 코드, 데이터, 시스템 자원의 집합(microsoft)

    - 하나 혹은 그 이상의 Thread로 실행되는 컴퓨터 프로그램의 instance

    - Process는 Program code와 그 activity를 포함

    프로세스의 구성

    PCB (Process Control Block)

    : 프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block) 또는 프로세스 기술자(Process descriptor)라고 부르는 자료구조에 저장
    - 운영체제는 프로세스 관리를 위해 프로세스의 생성과 동시에 고유한 PCB를 생성하여 Kernel 영역에 저장
    - 프로세스는 CPU를 할당 받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행 작업을 저장하고 CPU를 반환, 이 때 진행상황을 PCB에 저장
    - 다시 CPU를 할당 받게 되면 PCB에 저장되어 있던 내용을 불러와 이전에 종료했던 시점부터 다시 작업 수행

    구분 설명
    PID (Process ID) 프로세스 식별 번호
    프로세스 상태 new, ready, running, waiting, terminated 등의 상태 저장
    프로그램 카운터 프로세스가 다음에 실행할 명령어 주소
    부모 프로세스, 자식 프로세스 최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제(트리 관계)
    - 각 프로세스는 자식 프로세스와 부모 프로세스에 대한 정보를 가짐
    CPU 레지스터 프로세스 레지스터 상태 저장
    CPU 스케줄링 정보 프로세스 우선순위, 스케줄 큐에 대한 포인터 등
    메모리 관리 정보 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보 포함
    입출력 상태 정보 프로세스에 할당된 입출력 장치들과 열린 파일 목록
    어카운팅 정보 사용된 CPU 시간, 시간제한, 계정번호 등

    프로세스의 상태 (Process States)

    상태 설명
    New 프로세스가 생성되는 도중의 상태
    Ready 프로세스가 생성된 후, 프로세서에 할당되기를 기다리는 상태 
    Running 프로세스의 명령문을 실행하고 있는 단계 (프로세서에 할당되어 있음)
    Wait 프로세스가 특정 이벤트를 기다리는 상태로 프로세서에 할당되어 있지만 일시적으로 멈춤으로써 에너지 소비를 줄임
    Terminated 프로세스가 종료된 상태

    프로세스 생성 (Creation)

    -  부모 프로세스가 자식 프로세스를 트리 구조로 생성 (보통은 복제 생성, 문맥 복사)
    -  생성된 자식 프로세스 또한 부모 프로세스가 되어 새로운 자식 프로세스 생성 가능
    -  각 프로세스를 고유의 PID를 통해 각각 식별하고 관리

    - 프로세스는 자원(CPU, Memory)을 필요로하며 운영체제로부터 자원을 받거나 부모 프로세스와 공유하기도 함
    - 자원을 부모 프로세스와 모두 공유하는 모델, 일부를 공유하는 모델, 아예 공유하지 않는 모델이 있음(공유하지 않는게 일반적)
    - 자식은 부모의 주소 공간(Address Space), PCB, 자원을 복사(fork)하고 그 공간에 새로운 프로그램을 올림(exec)

    📍COW (Copy-On-Write)
    - 자식 프로세스가 매번 부모 프로세스의 자원을 복사하게 될 경우 메모리의 낭비가 발생할 수 있음
    - 따라서, 리눅스의 경우에 처음엔 copy를 하지 않고 자식이 부모 주소 공간을 공유함
    - 이후 write를 진행해 값이 달라지는 경우가 있으면 그 때 부모 메모리 공간의 일부를 copy함

    프로세스 종료 (Terminate)

    - 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)
    - 종료될 때 자식이 부모에게 데이터를 보냄 (자식 프로세스 종료 후에 부모 프로세스 종료 가능하기 때문)

    - 프로세스 각종 자원들이 운영체제에 반납됨

    📍abort
    -비자발적으로 자식 수행 종료
    1) 자원의 할당치를 넘어섰을 때 강제 종료
    2) 자식에게 할당된 태스크가 더 필요하지 않을 때 종료
    3) 부모가 종료되는 경우 자식 프로세스도 함께 종료

    Fork, Exec, Wait, Exit 시스템 콜

    Fork

    : fork() 시스템 콜로 새로운 프로세스를 만듦

    int main() {
      int pid;
      pid = fork(); //부모는 양수, 자식은 0을 return한다 
    
      if(pid == 0) printf("\n Child");
      else if(pid > 0) printf("\n Parent");
    }

    - fork() 명령어 이후를 기준으로 자식 프로세스가 복제됨 (자식 프로세스는 fork() 명령어 이후부터 실행)
    - 생성된 자식 프로세스는 부모 프로세스의 데이터와 프로그램이 완전히 복사되어 똑같은 프로그램을 수행
    - 운영체제가 PID를 부모의 경우 양수로 설정, 자식은 0으로 설정해 복제본과 원본을 구분할 수 있게 함
    - 부모와 같은 제어 흐름을 자식이 따라게 됨

    Exec

    : exec 시스템콜로 프로세스는 다른 프로그램을 실행할 수 있음

    int main(){
      int pid;
      pit = fork();
    
      if(pid == 0){
        printf("\n Child, date 프로그램을 실행");
        execlp("/bin/date", "/bin/date", (char *) 0); //exec 시스템 콜 실행 , execlp("프로그램 이름", arg1, arg2...)
      } else if (pid > 0){ 
        printf("\n Parent");
      }
    }

    - execlp: exec 시스템 콜 실행 명령어, 새로운 프로그램으로 덮어씌우게 됨

    - exec을 할 경우 path에 있는 프로그램의 main 함수부터 시작
    - fork를 한 후 자식 프로세스에 프로그램을 덮어 씌울 수 있음
    - 새로운 프로세스는 생성하지 않으며, 현재 실행 중인 프로그램을 다른 실행 중인 프로그램으로 대체하는 것
    - 단, 새로운 프로그램이 로드되었으므로 새로운 text, data, heap, stack을 가지게 됨

    wait

    : 프로그램을 block 상태로 만드는 것

    - 부모 프로세스는 자식 프로세스를 만든 후 자식 프로세스가 종료되는 것을 기다리며 wait

    - 자식 프로세스가 종료되면, 부모 프로세스가 ready 상태가 되며 CPU를 얻을 수 있게 됨

    exit

    1) 자발적 종료
    - 마지막 statement 이후 exit 시스템 콜을 이용해 종료
    - 프로그램에 명시적으로 exit이라는 시스템 콜을 넣어 명시적으로 종료 가능

    2) 비자발적 종료
    - 부모 프로세스가 자식 프로세스를 강제 종료
    - 부모프로세스가 종료하는 경우 자식 -> 부모 순으로 순차적 종료가 이루어짐

    좀비 프로세스 & 고아 프로세스

    좀비 프로세스

    - 자식 프로세스가 부모 프로세스보다 먼저 죽는 경우 부모 프로세스가 종료 상태를 회수하기 위해 커널이 자식 프로세스의 최소한의 정보(PID, 종료 상태 등)를 남겨둠
    - 부모 프로세스는 wait 함수를 호출하여 이 상태를 회수하면 남은 모든 정보가 제거되어 자식 프로세스는 완전히 소멸
    - 위와 같은 진행 상황에서 부모 프로세스가 wait 함수를 호출하지 않아 최소한의 정보가 메모리에 남아 있는 경우 좀비프로세스라고 함

    고아 프로세스

    - 부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우 부모 프로세스가 없는 자식 프로세스를 말함
    - 운영체제는 이러한 고아 프로세스를 허용하지 않으며 부모 프로세스가 먼저 종료되면 자식 프로세스의 새로운 부모 프로세스로 init(PID = 1) 가 설정됨
    - init 프로세스는 자식 프로세스가 종료될 때까지 기다린 후 wait 함수를 호출하여 고아 프로세스의 종료 상태를 회수, 좀비 프로세스가 되는 것을 방지
    - 고아 프로세스는 프로세스 자신이 시스템의 자원을 낭비할 수 있고, 시스템이 프로세스가 종료될 때까지 추적해야 하기 때문에 성능저하의 원인이 됨

    프로세스간 협력

    구분 설명
    독립적 프로세스
    (Independent Process)
    각자의 주소 공간을 가지고 수행되므로,
    원칙적으로 하나의 프로세스는 다른 프로세스에 영향을 끼치지 못함
    협력적 프로세스
    (Cooperation Process)
    프로세스 협력 메커니즘을 통해 프로세스간 정보를 주고 받으며 협력할 수 있는 프로세스
    📍스레드 간 통신보다 프로세스 간 통신이 어려운 이유
    - 프로세스는 생성되며 PC를 포함하여 메모리 공간 등을 복사하여 별도의 자원을 할당
    - 스레드는 메모리 공간과 자원을 공유
    ➡️ 프로세스는 통신할 수 있는 공간이 없기 때문에 통신을 위한 별도의 공간을 만들어줘야 함
    ➡️ 이를 위해 커널 영역에 IPC라는 내부 프로세스간 통신을 제공

    IPC (Interprocess Communication) 

    : 프로세스간 협력 메커니즘을 통해 협력적 프로세스 구현

     

    [ 종류 ]

    1. 메시지 전달 방식 (Message Passing)
    - 커널을 통해 메시지 전달
    - 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신

    2. 주소 공간 공유 (Shared memory) 

    - 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당, 이후 어떤 프로세스건 해당 메모리 접근 가능하며, 커널이 관리를 함
    - 대량의 정보를 다수의 프로세스에 빠르게 배포 가능
    - 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 동작

     

    추가적인 전달 방식은 https://dar0m.tistory.com/233 블로그 참고

     

     

    반응형

    댓글

Designed by Tistory.