오래 못 할 짓 하지 않기

[ 운영체제 ] 5. 프로세스 - Parent,child 본문

3학년 1학기/운영체제 (OS)

[ 운영체제 ] 5. 프로세스 - Parent,child

쫑알bot 2024. 3. 25. 20:16
728x90

Process Creation

 

● Parent 프로세스가 Child 프로세스를 만든다.

 

 

- 모든 프로세스에 id가 있다. = Process identifier

- 프로세스들의 parent,child관계로 오른쪽 그림과 같이 트리를 만들 수 있다.

 

 


 

이와 관련된 명령어로는 다음과 같이 3개가 있다.

 

● fork()

 : 새로운 Child process를 만들고, 그 프로세스의 Pid를 return받는다.

 

ex) int pid = fork() 하면 자식 프로세스의 pid가 변수에 저장된다.

     ※ 부모 프로세스에서만 변수 pid에 자식 pid가 저장됨, 자식 프로세스에서는 저 값이 0이다.

 

 

● exec()

 : 프로그램을 실행한다.

 근데 이제,, 여러 추가 기능을 곁들인

 

 

 

 

● wait()

 : 자식 프로세스가 끝날 때까지 기다린다.

 

 

 

Process A 시작

→ fork()

→ wait() = 자식 끝날 때까지 기다림

→ Process A'(자식) 시작

→ 동작 

→ 끝 =  interrupt

→ Process A 재시작

 

 

위는 이거랑 같음

 

 


 

예제 1)

 

 

풀이 

: pid_t pid = fork()   // 이렇게 하면 부모 process에서는 pid = 자식 프로세스

 ▶ 바로 빨간색 명령어로 넘어가서, 자식이 끝날 때까지 기다린다.

 

자식의 pid는 0으로 시작. 

 ▶ 파란색 명령어로 해당 명령어 실행

 ▶ 끝

 

 ▶ 빨간 명령어 실행될 예정인 거 실행

 

 

 

 

 

 

fork는 이걸 소환하는 process 를 복제한다.

 

- 두 프로세스는 같은 내용을 가졌지만 서로 다른 메모리 공간을 할당받는다.

 

 

Fork하면 프로세스끼리 파일 공유는 안 함

 


 

예제 2)

 

 

우선 fork전 상태 : gval = 11 / lval = 25

fork 후, parent process : gval = 11 / lval = 26

fork 후, child process    : gval = 12 / lval = 25

 


 

exit()

상태를 종료  혹은  status를 child에서 parent로 바꾼다. 

 

- 부모가 Terminate되었으면 OS가 Child를 계속 가지 못하게 함

   = 프로세스가 Terminate되면, 이의 Childern도 Terminate 되어야 한다.

 

 

예제 3)

wait() = Child process가 terminte 될 때까지 기다린다.

 

좀비 프로세스 : 본인을 기다리는 parent process 가 없는 프로세스

 

고아(orphan) 프로세스 : wait() 없이 부모 프로세스가 Terminate된 프로세스

 

 

빨간색이 부모 프로세스

파란색이 자식 프로세스

 

부모 프로세스가 fork 해서 자식 Pid를 가져옴

▶ 조건문 else 로 진입

▶ 자식 PID 출력하고 30초 sleep

▶ 그러는 동안 자식 프로세스 진행 , 첫 if 실행

▶ 끝남

▶ 부모 프로세스 깨고 마지막 출력하고 끝남.

 

 

 

하나의 Child 프로세스가 Terminate될 때가지 기다린다.

 

 

 

특정 프로세스의 id를 넣고, 그 프로세스가 상태가 변할 때가지 실행을 하지 않고 기다린다.

 

 

 


 

예제 4)

 

 

빨간색 = 부모

보라색 = 1번자식

하늘색 = 2번자식

 

fork 하면 자식 Pid가져 옴 = 0은 아님

▶ 빨간 else로 들어감 

▶ 1번 자식 Pid 출력하고 2번 자식 생성

▶ 이 때도 pid는 0이 아니므로 오른쪽 빨간색 else로 간다.

▶ 그 else에서 첫 출력은 2번 자식 pid를 출력하고

▶ 자식 프로세스가 끝나기를 기다린다.
▶ 1번 자식이 끝났다면, 끝났던 상태를 출력한다. = 3

▶ 또 하나 더 끝나는 거 기다렸다가, 2번 자식이 끝나면 그 상태를 출력.

 

 

1번 자식은 생성되고 보라색 if를 들어가서 return 3 하고 빠져나온다.

2번 자식은 부모가 1번 자식을 출력하고 그 뒤에 생성되어 하늘색 조건문에 들어가고 exit(7)로 빠져나온다.

 


 

예제 4)

 

 

 

 

 

 

(출처)

한동대학교 고윤민교수님 - 운영체제