컴퓨터(Computer Science)/운영체제(Operation System)

Process Life Cycle, 프로세스 생성부터 종료까지

게임이 더 좋아 2020. 5. 29. 15:02
반응형
728x170

 

프로세스에 대해 살짝 알아봤는데 그럼 0부터 1이 어떻게 되느냐??

아니면 원래부터 프로세스가 있어서 프로세스가 프로세스를 만드는거냐?? 

의문이 들텐데 한 번 알아보자

 


 

우선 대부분 시스템 내의 프로세스들은 병렬 실행이 가능하다.

parallel적으로 실행 가능하다.

반드시 동적으로 생성되고, 제거되어야 한다.

그래서 운영체제는 프로세스 생성 및 종료를 위한 기법을 제공한다.

알아보자

 

The system must provide mechanisms for process creation, process termination, and so on as detailed next

 

 


 

프로세스 생성부터 알아보자, process creation

 

실행되는 동안 프로세스는 여러 개의 새로운 프로세스들을 생성할 수 있다. 

 

그림을 보면 tree구조가 생각나는데 여기서도 그렇다.

(최초의 프로세스가 있을 것이다, Root Node)

** 언제나 pid가 1인 systemd 프로세스가 모든 사용자 프로세스의 루트 부모 프로세스 역할을 수행하고 시스템이 부트될 때 생성되는 첫 번째 사용자 프로세스이다. 

시스템이 부팅되면 systemd 프로세스는 다양한 사용자 프로세스를 생성한다.

 

 

• Parent process create children processes, which, in turn, create other processes, forming a tree of processes
• Generally, process identified and managed via a process identifier (PID)

 

즉, 부모 프로세스가 자식 프로세스를 생성한다.


• Resource sharing options
1. Parent and children share all resources
2. Children share a subset of parent’s resources
3. Parent and child share no resources

 

일반적으로 프로세스가 자식 프로세스를 생성할 때, 그 자식 프로세스는 자신의 임무를 달성하기 위하여 자원(CPU 시간, 메모리, 파일, I/O 등) 이 필요하다.

 

자식 프로세스는 자원을 운영체제로부터 직접 얻거나, 부모 프로세스가 가진 자원의 부분 집합만을 사용하도록 제한될 수 있다. 

 


• Execution options
1. Parent and children execute concurrently
2. Parent waits until children terminate

 

부모와 자식이 같이 수행하거나 부모가 자식의 프로세스가 종료될 때까지 기다리는 2가지 형식을 가지고 있다.

 

 

• Address space
1. Child duplicate of parent
2. Child has a program loaded into it

 

자식은 부모의 공간을 복사한다.

그 공간에 새로운 프로그램을 올린다.

부모의 code, data, stack 을 복사하는 것을 의미한다.

 

 


 

이번에는 프로세스 종료, process termination에 대해서 알아보자

 

Process executes last statement and then asks the operating system to delete it using the exit() system call.
• Returns status data from child to parent (via wait())
• Process’ resources are deallocated by operating system

일반적으로는

프로세스가 마지막 명령을 수행한 후 OS에게 exit()를 이용하여 알려준다(system call)

그렇게 되면 

1. 자식이 부모에게 output data를 보내고

2. 프로세스의 각종 자원들이 다시 OS에게 반납된다.

 

 

하지만

프로세스가 exit 호출을 하지 않더라도 종료되는 경우가 있는데

 

다른 프로세스가 적당한 시스템 호출로 다른 프로세스의 종료를 유발할 수 있다.

그 다른 프로세스는 부모 프로세스다.

부모 프로세스만이 자식 프로세스를 종료시킬 수 있다(abort)

따라서 프로세스가 프로세스를 만들 때에는 PID가 꼭 부모에게 전달되어야 한다.

 

**아니면 사용자 또는 오작동으로 다른 프로세스가 종료될 수 있다.

이를 kill 이라고 한다.

 

Parent may terminate the execution of children processes using the abort() system call. Some reasons for doing so:
• Child has exceeded allocated resources
• Task assigned to child is no longer required
• The parent is exiting and the operating systems does not allow a child to continue if its parent terminates

 

부모 프로세스가 자식 프로세스를 종료시키는 대표적인 경우가 3가지가 있다.

 

1. 자식이 자신에게 할당된 자원을 초과하여 사용할 때

// 부모는 자식들의 상태를 알 수 있어야 초과 여부를 알 수 있다.

 

2. 자식에게 할당된 태스크, task가 없을 때

// 자식이 하는 일이 없을 때

 

3. 부모가 exit하는데, 운영체제는 부모가 exit한 후에 자식이 실행하는 것을 허용하지 않는 경우

// 운영체제마다 다르다.

 

Some operating systems do not allow the child to exists if its parent has terminated. If a process terminates, then all its children must also be terminated.
• cascading termination. All children, grandchildren, etc. are terminated.
• The termination is initiated by the operating system.

 

**몇몇 시스템에서는 부모 없이는 자식 프로세스가 실행될 수 없다.

그래서 종료되는데 이를 cascading termination이라고 부르고 연쇄 종료라고 한다.

 


 

• The parent process may wait for termination of a child process by using the wait()system call. The call returns status information and the PID of the terminated process

 

"" pid = wait(&status);  ""

 

• If no parent waiting (did not invoke wait()) process is a zombie
• If parent terminated without invoking wait, process is an orphan

 

 

++ 프로세스가 종료하면 사용하던 자원은 운영체제가 다시 가져가는데 프로세스의 종료 상태가 저장되는 프로세스 테이블의 해당 항목은 부모 프로세스가 wait()를 호출 할 때 까지 남아 있게 된다. 

다시 말하자면, 프로세스는 종료되었지만 부모 프로세스가 아직 wait()을 호출 하지 않은 프로세스가 있다는 말인데 이 프로세스를 좀비(zombie)라고 부른다. 

종료하게 되면 모든 프로세스는 좀비 상태가 되지만 아주 짧은 시간동안만 존재한다. 

 

부모가 wait()을 호출하면 좀비 프로세스의 프로세스 식별자와 프로세스 테이블의 해당 항목이 운영체제에 반환된다.

 

** 만약 부모 프로세스가 wait()을 호출하지 않고 종료한다면?? 

그 프로세스는 부모가 없는 고아(orphan)이 된다.

// 어감이 그렇지만 ...ㅠ

 

**UNIX의 경우 고아 프로세스의 부모프로세스를 다시 지정해주는데 init 프로세스를 지정함으로 이를 해결한다.

// 알고만 넘어가자

 

 

728x90
반응형
그리드형