헬창 개발자

[운영체제] 프로세스란????????????????????? 본문

공부방

[운영체제] 프로세스란?????????????????????

찬배 2022. 4. 24. 20:59

대충 명언처럼보이는 방법

프로세스란?

프로세스(process)란 실행중에 있는 프로그램(Program)을 의미하며 동적인 상태이다.

 

프로세스의 구조

 

  • 코드(텍스트) 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
  • 데이터 영역 : 전역변수, static 변수의 할당.
  • 영역 : 동적할당을 위한 메모리 영역.
  • 스택 영역 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역.

 

프로세스 제어블록(Process Control Block, 줄여서 PCB))

운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 자료구조입니다.

프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB도 함께 제거됩니다.

  • 포인터
    프로세스의 현재 위치를 저장하는 포인터 정보입니다.
  • 프로세스 상태
    프로세스의 각 상태 (생성(New), 준비(Ready), 실행(Running), 대기(Waiting), 종료(Terminated))를 저장합니다.
  • 프로세스 번호
    모든 프로세스에는 프로세스 식별자를 저장하는 프로세스 ID 또는 PID라는 고유 한 ID가 할당됩니다.
  • 프로그램 카운터
    프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장합니다.
  • 레지스터
    누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보입니다.
  • 메모리 제한
    이 필드에는 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보가 포함됩니다. 여기에는 페이지 테이블, 세그먼트 테이블 등이 포함될 수 있습니다.
  • 열린 파일 목록
    이 정보에는 프로세스를 위해 열린 파일 목록 이 포함됩니다.

 

프로세스 상태변화

  • new(생성) : 프로세스 생성
  • ready(준비) : 프로세스가 프로세서에 할당되기를 기다릴 때
  • running(실행) : 프로세스가 할당되어 실행될 때
  • waiting(대기) : 프로세스가 이벤트를 기다릴 때
  • Terminated(종료) : 프로세스가 실행을 마쳤을 때

 

  • ready -> run : dispatch
  • run -> ready : time out
  • run -> wait : block
  • wait -> ready : wake up

 

프로세스 생성

부모 프로세스가 자식 프로세스를 만든다.(트리 구조)

프로세스는 PCB에 저장된 pid 값으로 식별

-> 부모와 자녀는 모든 자원 공유 / 자녀는 부모의 하위 집합을 공유 / 동시에 실행 됨. 

-> parent wait : 자식이 종료될 때까지
- fork() : 부모 프로세스가 자식 프로세스를 생성
- exec() : 자식 프로세스가 exec()를 호출하여 내용을 바꾼다.

 

프로세스 종료

프로세스가 마지막 실행을 끝내고, exit()을 호출하여 프로세스를 종료시킬 수 있다.
이 시점에서 프로세스는 자신의 부모 프로세스에게 상태 값을 반환할 수 있음.

- 물리 메모리, 가상 메모리, 입출력 버퍼 등을 포함한 프로세스의 모든 자원이 운영체제로 반납됨.

- 부모 process는 abort() 시스템을 호출하여 자식 프로세스를 종료시킬 수 있음
OS는 부모 process가 종료되는 경우 자식 process가 계속되는 것을 허용하지 않는다.

 

좀비 프로세스 : 프로세스가 종료되었음에도 불구하고 메모리 상에서 프로세스에 대한 정보가 사라지지 않은 상태
-> 자식 프로세스 종료, 부모가 wait()을 통해 상태를 보고받지 못한 경우
고아 프로세스 : 부모가 자식 프로세스보다 먼저 종료되면 그 자식 프로세스는 고아가 됨
-> init 프로세스가 새로운 부모 -> 고아 프로세스를 종료시키기 위해 wait()을 호출

 

프로세스 생성 코드

부모 프로세스 밑에 자식 프로세스 2개를 생성해보자.

#include <stdio.h>
#include <stdlib.h>
#include <sys/type.h>
#include <unistd.h>

int main(){
    pid_t child1, child2;
    child1 = fokr() // 자식 프로세스 생성
    if(child1<0){
        return 0; // 자식 프로세스 생성 실패
    }
    else if(child1 == 0){
        printf("child1 프로세스 id : %d\n", getpid());
        while(1){} // 계속 실행시키기
    }
    else{
        child2 = fokr() // 자식 프로세스 생성
        if(child2<0){
            return 0; // 자식 프로세스 생성 실패
        }
        else if(child2 == 0){
            printf("child2 프로세스 id : %d\n", getpid());
            while(1){} // 계속 실행시키기
        }
        else{
            printf("부모 프로세스 id : %d\n", getpid());
            wait(NULL); // 대기
            wait(NULL); 
            exit(0);
        }
        exit();
    }
    return 0;
}

 

Comments