본문 바로가기
컴퓨터 공학/운영체제

프로세스(Process)

by Montmartree 2020. 4. 23.

프로세스는 무엇일까?

 

 

프로세스를 얘기하려면 먼저 프로그램을 얘기해야한다.

 

프로그램이란 디스크에 존재하는 Passive한 Entity를 의미한다.

 

 

그렇다면 프로세스는?

 

프로세스도 프로그램이라고 생각하면 된다.

 

하지만!!!!

 

이름에서도 다르듯이 프로세스는 실행중인 프로그램이다.

 

즉, 프로세스란 메모리에 load되어 실행중인 프로그램이다.

 

결국 실행중이냐 아니냐의 차이로 둘을 구분 지을 수 있다.

 

 

프로세스는 메모리에 load되기 때문에, 자신만의 고유한 address space를 가지게 된다.

 

address space란 Stack, Heap, Data, Text 영역 및 PCB, Program Counter 등이 있다.

 

Stack과 Heap의 영역은 서로 줄어들었다 늘었다를 반복한다.

 

 

각각 담당하는 내용은 이렇다.

 

Stack  -  매개변수와 지역변수및 함수

Heap  -  동적할당

Data   -  전역변수

Text  -  프로그램 코드

PC  -  Program Counter로, 다음에 실행될 명령어를 가리키는 포인터

PCB  -  Process Control Block으로, 해당 프로세스의 정보를 가지고 있다. (프로세스 ID, 프로세스 상태, 메모리 정보 등)

 

 

 

그리고 프로세스는 부모-자식의 관계가 존재한다.

 

프로세스가 또 다른 프로세스를 생성할 수 있기 때문에 그렇다.

 

아래의 그림은 System call 함수를 이용하여 프로세스를 제어하는 그림이다.

 

1. fork

 

먼저, 프로세스 생성을 위해서는 fork 함수를 사용한다.

 

만약, A라는 프로세스에서 fork 함수를 사용하여 B라는 프로세스를 생성하였다면

 

A는 부모 프로세스, B는 자식 프로세스가 된다.

 

이 경우, 부모 프로세스는 자신의 address space를 복제하여 자식 프로세스에게 주게되고

 

부모 프로세스의 ID는 자식 프로세스의 ID로 대체된다.

 

그리고 자식 프로세스의 ID는 0을 반환한다.

 

 

2. exec

 

exec 함수는 기존의 프로세스에 새로운 프로그램을 덮어씌우는 기능을 한다.

 

프로세스에서 새로운 프로그램을 실행하기 위하여 사용한다.

 

 

3. wait

 

wait 함수는 부모와 자식간의 동기화를 위하여 사용한다.

 

만약, 동기화를 하지 않는다면 부모 프로세스와 자식 프로세스 사이에는 아래의 2가지 문제가 발생한다.

 

 

ㄱ. 부모가 자식보다 먼저 종료된 경우

 

      >  이 경우, 자식 프로세스는 부모 프로세스를 잃었기 때문에 고아 프로세스가 된다.

 

           다행히도 고아 프로세스가 생기면 Init 프로세스가 고아 프로세스를 거두게 된다.

      

           참고로 Init 프로세스는 부팅 과정중 생성되는 최초의 프로세스이며, 시스템이 종료될 때까지 존재한다.

 

 

ㄴ. 자식이 부모보다 먼저 종료된 경우

 

      >  자식 프로세스가 exit 함수를 호출하여 종료했다면

 

          부모 프로세스는 반드시 wait 함수를 호출하여 자식 프로세스의 모든 정보를 회수해야 한다.(동기화)

 

          만약 회수하지 않는다면, 자식 프로세스는 좀비 프로세스가 된다.

 

          종료되었음에도 불구하고 정보 회수를 하지 않아서 메모리 등의 리소스가 낭비되고 있는 것이다.

 

          좀비 프로세스는 일반적인 방법으로는 종료시킬 수 없기 때문에, 항상 신중하게 코드를 작성해야 할 것이다.

 

 

4. exit

 

exit 함수는 프로세스를 종료시킬 때 호출한다.

 

 

 

 

 

 

참고로 무수히 많은 자식 프로세스는 생성할 수 없다.

 

왜냐하면, 자식 프로세스의 자원은 OS에게서 할당받기 때문이다.