본문 바로가기
Linux/SystemProgramming

프로세스와 쓰레드의 생성과 수행(부제 : 쓰레드와 프로세스의 차이점)

by neohtux 2016. 8. 29.
728x90

프로세스 생성 예제



이 예제는 전역변수 g와 지역변수 l을 가지고 있으며 fork()함수를 통해 새로운 프로세스를 생성한다.


그 결과, 16196번 pid를 가지는 부모 프로세스가 16197번 pid를 가지는 자식 프로세스를 생성하였음을 알 수 있다.


또한 이 프로그램에서는 자식 프로세스가 전역 변수와 지역 변수를 각각 1씩 증가시키고 있음을 알 수 있다.


반면, 부모 프로세스에서 g와 l변수 값을 출력하면 각각 원래 값인 2와 3이 출력됨을 알 수 있다.


이를 통해, 프로세스가 생성되면 주소공간을 포함하여 이 프로세스를 위한 모든 자원들이 새로이 할당됨을 알 수 있다.



따라서 자식 프로세스의 연산 결과는 자식 프로세스 주소 공간의 변수에만 향을 줄 뿐 프로세스 주소공간의 변수에는


영향이 없으며, 결국 지역 변수, 전역 변수 등의 값이 다르게 출력된 것이다.




만일, 쓰레드의 생성이었다면 수행결과에 어떤 차이가 있을까?

우선 기존 프로세스가 자신의 pid와 전역 변수 g 지역 변수 l의 초기 값을 출력한다. 그 결과 pid는 16283, g와 l은 각각,2,3으로 출력되었다.


그 이후 clone()을 호출하여 새로운 쓰레드를 생성한다.


이 쓰레드는 sub.func()이라는 함수를 수행한 후 종료한다.


이 함수를 보면 우선 g값을 증가시키고 자신의 pid와 g값을 출력한다. 이 프로그램은 새로운 쓰레드를 생성한것이며,


 새로운 프로세스를 생성한 것이 아니다. 그리고 쓰레드는 자신을 생성한 태스크와 동일한 pid를 갖는다.


따라서, 출력된 pid는 16283이며 g 값은 3이다.



이 두 예제를 통해 알 수있는것은,


새로운 프로세스를 생성하면, 생성된 자식 프로세스와 생성한 부모 프로세스는 서로 다른 주소 공간을 갖지만, 쓰레드는 자식과, 부모 쓰레드간의 주소공간을 공유 하는 것을 알 수 있다.



그리고, 같은 프로세스에서 새로운 쓰레드를 생성할 경우 기존 쓰레드와 생성된 다른 쓰레드가 함께 

동작하고 있는 것으로 볼 수 있다.


즉, 한 프로세스에 2개의 쓰레드가 동작하는 것이다. 

쓰레드 생성은 모든 자원을 생성해주어야 했던 프로세스에 비해 생성에 드는 비용이 비교적 작다.



마지막으로, 자식 쓰레드에서 결함이 발생하면 그것은 부모쓰레드로 전파된다. 

(주소값을 공유하고 있기 때문이라고 생각한다.)


반면 프로세스는 자식 프로세스에서 문제가 발생하면 부모 프로세스로 전파되지 않는데 

(주소값을 공유하지 않기 때문이라고 생각한다.)




300x250

'Linux > SystemProgramming' 카테고리의 다른 글

데몬(daemon) 정리.  (0) 2016.10.01
쉘(Shell) 프로그램  (0) 2016.09.04
fork()와 vfork()에 대해서.  (0) 2016.08.29

댓글