[운영체제 실습] 1.프로세스 생성과 종료

프로세스의 계층 구조

출처 : ProgCoach4U 

최상위 init 프로세스는 부모이다. 그 아래 login, sshd(실행파일이름) 프로세스는 자식들이고 그 아래 또 자식들이 생긴다.

각각의 프로세스마다 각자의 고유한 프로세스 id를 가지고 있다. 

각 부모 프로세스는 자식 프로세스를 생성할 수 있다.

자식 프로세스가 종료될때 부모 프로세스가 자식 프로세스를 정리해주는 작업을 한다. 정리를 안해주면 자식프로세스가 종료 후 좀비 프로세스가 된다. 좀비프로세스가 많이 생기게 되면, 시스템 효율이 낮아진다.

 

좀비프로세스란?

- 종료 처리 중 멈춰 있는 상태의 프로세스

- 자식 프로세스가 종료되었지만 , 부모 프로세스가 해당 프로세스의 종료에대해 처리하지 않아 커널 프로세스 테이블에 남아 있는 상태의 프로세스.

- 좀비 프로세스가 생성되면 커널 프로세스 테이블을 점유하고, 리소스를 낭비시킨다. 그래서 반드시 부모 프로세스가 자식 프로세스에 대한 종료 처리를 해야한다.

 

fork 함수

 

출처 : ProgCoach4U 

부모 프로세스가 자식프로세스를 생성할때 자식 프로세스에는 부모 프로세스의 주소 공간과 똑같은 주소간이 생긴다.

자식 프로세스가 생성되면 자식 프로세스는 부모 프로세스가 실행했던 코드 이후 부터 실행을 한다.

 

#사용함수 pid_t fork(void)

*파라미터 : 없음

*반환값 이 0면 자식 프로세스고, 반환값이 자식프로세스의 pid라면 부모 프로세스 이다.

*실패했을때 반환값은 부모 프로세스는 -1로 받고, 자식 프로세스는 실패했을때 프로세스 자체가 생성되지 않는다.

 

 

#사용함수 pid_t getpid(void); pid_t getppid(void);

*현재 프로세스의 부모 프로세스의 pid 얻기 : getppid();

*현재 프로세스의 pid 얻기 : getpid();

 

 

fork() 함수 실습

 

fork() 함수 결과

 

 

새로운 프로그램 실행 exec()

출처 : ProgCoach4U 

부모 프로세스가 fork() 를 통해서  자식프로세스를 생성한다. 그리고 자식프로세스는 exec() 를 통해서 새로운 데이터로 채운다. fork() 로 생성된 자식 프로세스는 사라지고 exec() 로 새롭게 생성된 자식만 남는다.

 

#사용함수 int execl(…);

*반환값 : 실패시에만 -1 리턴

 

 

프로세스 종료

#사용함수 void exit(int status);

*파라미터 

-status : 종료 상태

-0 : 정상적으로 종료됨 (성공)

-0이 아니면 : 실패

 

c 언어 main 함수에서 리턴이 되면 프로그램이 끝난다. 그때 0을 리턴해주는 것도 내부적으로 exit api 를 호출하고 파라미터 값으로 정상 종료되었다는 의미의 0을 넣어주는 것이다.

 

자식 프로세스 종료 시그널

-init 프로세스를 제외한 모든 프로세스는 sigchld 시그널을 가지고 있다.

-자식프로세스가 종료되었을때, 부모 프로세스에게 sigchld 시그널을 전송한다.

-부모 프로세스는 sigchld 에 대해 항상 수신할 준비하고 있다.

-부모 프로세스는 sigchld를 수신하면 자식 프로세스 상태를 확인한다.(종료된 자식 프로세스 처리)

 

 

자식프로세스 종료 대기 - wait()

#pid_t wait(int *wstatus);

*자식 프로세스가 실행되면, 부모 프로세스가 wait 프로세스를 실행하고, 자식 프로세스가 종료될때까지 부모 프로세스는 블락킹 된다. 자식 프로세스가 종료되면 자식 프로세스의 종료 상태가 부모 프로세스에 있는 wait 함수의 파라미터로 날라온다.

*파라미터 : wstatus : child process의 종료 상태

*반환값은 종료된 자식 프로 세스의 pid, 실패시 -1 을 리턴한다.

 

exec 함수 실습

exec 함수 결과 - 성공

exec 함수 결과 - 실패