티스토리 뷰

Study/OS

[Process] Creating New Processes

생각많은 소심남 2014. 8. 29. 14:50

* 이 글은 coursera에서 진행되는 HW/SW Interface의 강의 내용을 요약한 글입니다.


지난 포스트를 통해서 Process 가 뭔지 소개하고 process 가 concurrent 하게 실행될때 발생하는 context switching을 다뤘다. 일단 process 가 하는 일은 알았고, 프로그램이 실행되기 위해서는 instance인 process가 필요하다는 건 알았는데 이제 이걸 어떻게 생성할 지가 궁금해진다.

 우선 linux system을 가정할 때 process 생성과정은 fork-exec 구조를 따른다.(물론 windows에서는 이런 형태가 아니다.) 그리고 이를 위해서 syscall인 fork()와 execve() 를 사용한다. 어떤 인자를 주느냐에  따라서 execvp()가 될 수 있고, 기타 실행관련 syscall 들이 존재한다. 일단 fork()도 syscall이기 때문에 이 걸 실행시킬 주체 process(보통 parent라고 표현한다.)가 필요하다. 이 parent process가 fork()를 실행시키게 되면 실행 process를 그대로 복제한 process가 생성하고 그에 대한 process ID를 반환한다. 이 값을 통해서 해당 process가 parent인지 child인지를 구분할 수 있다. 그런데 이 fork()가 여타 함수와 다른 특징을 가지고 있는데, 그게 한번 호출할 때마다 두개씩 반환한다는 것이다. 다음 예시를 잠깐 살펴보겠다.


우리가 생각하는 일반적인 함수의 정의라면 한번 function call이 발생하면 하나만 return 이 될 것이고, 그렇게 생각하면 위의 예시에서는 두 printf구문중에서 하나만 출력되어야 정상이지만 실제로는 두 개다 출력된다. 먼저 child process의 실행과정은 다음과 같다.


child process는 기본적으로 fork() 호출시 return 0을 받게 되어있다. 그래서 첫번째 출력구문을 실행시키게 된다. 이렇게 fork를 통해서 생기지 않은 parent process는 0이 아닌 다른 pid를 가지게 된다. 그래서 다음과 같이 실행된다.

그러면 이거 두개를 동시에 놓고 봤을 때  어떤 게 먼저 실행이 될 것인 가가 궁금해질 수 있다. 여기에 대한 답은 "그때그때 다르다" 이다.


 process가 fork를 통해서 생성될 때부터 process내에서의 구분은 단지 pid를 통해서만 이뤄진다. 앞에서 언급했던 것처럼 copy를 하고 생성하는 형식인데, 이때부터는 이미 child process는 parent와 독립적으로 동작한다. 그렇기 때문에 내부적으로 printf가 실행되는 시점은 parent가 더 빠를 수도 있고, child가 빠를 수도 있다는 것이다. 

이밖에도 process management에 쓰이는 syscall들이 몇개 더 있는데 이 부분은 다음 글에서 다뤄보려고 한다.

'Study > OS' 카테고리의 다른 글

[Memory] Virtual memory caches  (5) 2014.09.01
[Memory] Indirection  (0) 2014.09.01
[Process] Fork-exec Model  (0) 2014.08.29
[Process] What is a process?  (2) 2014.08.29
[Process] Exceptional Control  (0) 2014.08.28
[Memory] Memory Consideration in OS  (0) 2013.11.26
[OS] Context Switch  (0) 2013.06.29
댓글