3-2/OS

프로세스의 생성(fork, exec,exit)

개발자 덕구🐾 2021. 12. 23. 12:52
728x90

프로세스의 생성

부모프로세스가 자식프로세스를 복제 생성한다.

인간세계에서는 부모가 먼적 죽고 자식이 처리하지만(?)
프로세스 세계에서는 자식 프로세스가 먼저 죽고, 이를 부모 프로세스가 처리한다.

 

복제는 어떻게?

  • 부모프로세스의 주소공간 내용을 그대로 자식 프로세스의 주소공간으로 복사한다.
  • 부모 프로세스와는 다른 자식프로세스의 프로그램을 실행해야할 경우 복제된 주소공간 위에 새로운 프로그램의 주소공간을 덮어씌어 실행한다.

 

fork() 시스템 콜 

-> 자식 프로세스를 생성할 때 부모 프로세스의 내용을 그대로 복제 생성한다. 

 

exec() 시스템 콜 

-> 새로운 프로그램으로 주소공간을 덮어씌운다. 

 

 

복제하는 것은 fork()라는 시스템콜을 이용하고, 새로운 프로그램으로 덮어씌우는 것은 exec() 라는 시스템콜을 이용한다.

 

 

종료는 자발적인 종료비자발적인 종료로 나뉜다.


자발적인 종료를 수행 하는 시스템콜은 exit()이다.

-> 프로세스가 마지막 명령을 수행한 후 OS에게 이를 알려 이루어진다. 

OS는 해당 프로세스로부터 자원을 회수하고 시스템 내에서 이 프로세스를 정리한다. 

자식 프로세스일경우 부모프로세스에게 종료되었음을 알린다. 

 


비자발적인 종료는 부모프로세스가 자식프로세스를 강제로 종료시키는 abort() 함수을 이용한다.

 

비자발적인 종료가 발생하는 경우는

 

1) 자식프로세스가 할당자원을 넘어선 과한 자원을 요구할때
2) 자식프로세스에게 할당된 작업이 더이상 필요하지않을때
3) 부모프로세스가 종료될때

 

 

인간세상 관점으로 생각하면 참 너무하다.

부모가 자식프로세스를 만들고

자원을 너무 많이 요구하면 죽이고, 더 이상 시킬일없으면 죽이고, 부모프로세스 죽어야하니까 자식프로세스를 죽인다.

 

 


 

 

자세한 프로세스 생성과정

 

프로세스가 복제생성 하기위해 fork() 시스템콜을 호출한다.
인터럼트 라인이 세팅되어 cpu제어권이 커널로 넘어가고, 커널은 fork()를 호출한 프로세스를 복제한다.

 

복제된 프로세스는 부모프로세스와 주소공간, 프로그램 카운터, 레지스터 상태, pcb 등 모든 문맥을 그대로 복사한다.

즉 자식프로세스는 처음부터 실행되는 것이 아니라 부모프로세스의 PC가 그대로 복제되므로

부모 프로세스가 실행한 코드 이후 (fork()이후) 부터 실행된다.

 

부모 프로세스와 자식 프로세스의 차이점은 fork()함수의 반환값이다.
부모 프로세스의 경우 생성된 자식 프로세스의 pid가 반환이되고 자식프로세스는 0이 반환된다.

 

 

exec()

주소공간을 완전히 새로운 프로그램으로 덮어씌운 후 새로운 프로그램의 처음부터 다시 실행하도록 하는 시스템 콜

 

wait()

 자식 프로세스가 종료되기를 기다리는동안 부모프로세스를 blocked상태가 되도록 만들때 호출하는 시스템 콜

  • 자식 프로세스가 종료되어야지만 blocked상태에서 깨어나 ready 큐에 갈수있다.

 


 

프로세스 간의 협력

 

프로세스는 원래 독자적이지만 가끔 협력을 한다.

이를 위해 OS가 제공하는 메커니즘은 IPC(inter-Process Communication)가 있다.

이 방법에는 2가지 메세지 전달, 공유 메모리가 있다.

 

메세지 전달

프로세스간에는 메세지 전달이 불가능하므로 커널을 이용한다.

  • 직접통신간접통신으로 나뉜다.
    직접통신 -> 통신하려는 프로세스의 이름을 명시적으로 표현
    간접통신 -> 메일박스 이용

 

공유 메모리

프로세스의 주소공간 일부를 공유

반응형

'3-2 > OS' 카테고리의 다른 글

메모리관리  (0) 2021.12.25
CPU 스케쥴링  (0) 2021.12.23
프로세스의 개념  (0) 2021.12.22
OS의 목표와 정의  (0) 2021.12.20