프로세스를 코드 상에서 생성 사용 소멸 하는 일은 그렇게 어려운 일은 아니다. 하지만 순차적인 프로그래밍 만을 해오던 나에게는 여러개의 프로세서가 돌아가는 환경을 이해하고 프로그래밍 하는 것에 익숙하지않다.
일단 글의 내용과 더불어 정리해 보자
먼저 한개의 어플은 한개의 부모 프로세스로 시작을 한다 . main()자체가 부모프로세스를 생성시킨다.
main()안에 fork()라는 콜은 자식 프로세스를 생성케 한다.
exit() 라는 콜로 부모 프로세스 및 자식 프로세스도 소멸시킨다.
main()
{
printf("hello world\n");
fork();
printf("goodbye world\n");
}
결과.
hello world
goodbye world
goodbye world
이제 다음으로 fork()로 자식 프로세스를 생성후 리던되는 값을 확인해 보도록하자. 코드를 보도록 하자
main(){
pid_t pid;
printf("pid = %d \n", pid);
printf("fork_= %d\n", fork());
}
결과는pid = 9331877 -- pid
fork_= 5999 - 부모 프로세스로 리턴되는 값 = 자식프로세서의 pid
fork_= 0 - 자식프로세스로 리턴되는 값
여기서 pid_t는 process id type로서 integer과도 서로 컨버전이 되는 정수값이다. 이는 바로 프로세스의 이름표이다.한 시스템 내부의 모든 프로세스들은 각각 고유의 프로세서 id를 가지게 된다. 대부분 일정한 규칙을 가지고 id를 생성하게 되는데 몇몇 개는 시스템 차원에서 고정된값을 가지고 있기도 하다.위의 실행 결과에서도 볼 수 있지만, fork()는 부모 프로세스에게 자식프로세서의 pid를 리턴하고 자식프로세스에게는 0을 리턴해주게 된다.또한 실행 순서도 알 수 있게된다. 부모프로세스로 리턴 후 자식프로세서 로 리턴 수행그리고 나서 다음의 코드를 보자main() { pid_t pid; if((pid = fork()) == 0) printf("I am a child process\n"); else 서 printf("I am a parent process\n"); }
결과는 여러분도 예상했다싶이
I am a child process I am a parent process
자, 다음을 분석하면 처음 if문에서 부모프로세스로 리턴되는 값을 pid에 넣고 0 이랑 같음을 비교한다. 0이랑 같지 않으므로 else가 수행되어 두번째 printf가 수행되고 , 다음으로 자식프로세스가 수행되면서 fork()의 리턴값이 0이되므로 if문안에서 첫번째 printf문을 수행하게된다.재미있는 사실은 보통 자식 프로세스를 생성하게될 때 for문을 사용하여 쭉 생성하고 배열에 pid를 담아두어 각 요소별로 pid의 값을 제어할 수 있도록 프로그래밍 하게 된다. 또한 소스 마지막 부분에는 getpid()하는 함수를 붙여둠으로써 어떤 프로세스가 cpu를 점유하는지 쉽게 알 수 있도록 하고 있다.
이렇게 여러개의 프로세스를 생성함에 있어서 또 한가지 중요한 개념은 바로 싱크이다. 예를 들어 부모프로세스가 홀수를 출력하고 자식 프로세서가 짝수를 출력할때 홀수다음반드시 짝수 그다음 홀수 이런식으로 프로세서들끼리의 의사소통을 통해서 이러한 순서를 맞추는 과정을 싱크라하는데, sleep()함수를 통해서도 조절할 수 있지만 차후에 싱크라는 개념을 중요하게 다루게 될것이다. 차후에 적어보도록 하겠다.
다음으로 차일드 프로세스의 의 용도에 대해 알아보겠다. 크게 두가지로 볼 수 있는데
첫번째는 강력한 콜인 exec** ()이다. **에는 c,p,l,v 이렇게 네글자가 한쌍으로 조합되어 적용되는데 이는 넘겨주는 매개변수에 따라서 달라진다. 그냥 간단하게 exec콜은 지정한 디렉토리 안에 있는 바이너리를 차일드 프로세스의 몸통과 합체를 시켜버리는 즉, 프로그램 내부에서 다른 프로그램을 차일트프로세스화 시켜버리는 일을 한다.
두번째는, 서버를 구축할 때 유용하다. 물려들어오는 여러 사용자들에게 자식 프로세스를 하나씩 발행해 주는 것이다.
이상으로 용도에 대해 알아보았다.
마지막으로 미아숙청 룰에 대해 이야기하고 마무리 짓도록 하겠다. 유닉스는 엄격한 룰을 가지고 있는데 그것은 바로 미아는 절대로 방치하지 않는 다는 정책이다. 쉽게 말하면 부모프로세스없는 자식프로세스는 존재하지 않도록 발견즉시 종료시켜버린다. 부모프로세스가 종료될때 무조건 자식프로세스들까지 삼족을 멸하거나, 비정상적인 부모프로세스의 종료로 인한 자식프로세스의 미아화가 발견되었을 때는 바로바로 종료시킨다. 이는 소중한 메모리공간이 미아로 가득차는 불상사를 방지하고자 하는 정책이다.
[출처] 5. 프로세스의 생성 사용 및 소멸 |작성자 냉동여우
[출처] 5. 프로세스의 생성 사용 및 소멸 |작성자 냉동여우
[출처] 5. 프로세스의 생성 사용 및 소멸 |작성자 냉동여우
'OS > OS 파헤치기!' 카테고리의 다른 글
6. 씨피유 스케줄링 (0) | 2010.09.23 |
---|---|
4. 프로세스(process)? (0) | 2010.08.25 |
3. 하드웨어 보호(Hardware Protection) (0) | 2010.08.17 |
2장 컴퓨터 구조 (0) | 2010.08.16 |
1장. OS란? (0) | 2010.08.12 |