본문 바로가기

네트워크

[네트워크] PID, fork() 함수




네트워크 순서대로 포스팅하고 싶었는데 어제 친구가 알려준 내용을 까먹기 전에 정리하려고 한다. 




PID

먼저 PID란 Process IDentifier의 약자로, 운영 체제에서 프로세스를 식별하기 위해 할당하는 고유한 번호이다. 이 PID는 'fork' 라는 시스템 호출에 의해 반환된다. 





프로세스

프로세스란 디스크에 있던 프로그램 파일이 메모리에 올려지고 시스템의 스케줄에 따라 실행되는 실행 단위이다. 





fork()

fork() 함수는 현재 실행되고 있는 프로세스를 복사해주는 함수이다. 이 fork() 함수를 사용하는 이유에 대해서 생각해보았다.



fork() 함수 사용 이유

하나의 프로세스는 스레드를 통해 나눠서 작업한다. 예를 들면 chrome 에서 여러 개의 탭을 여는 것과 같다. 하지만 chrome 창을 여러개 여는 것과 같이 프로세스를 복사해서 작업하면 더 많은 작업을 할 수 있다. 이런 이유보다도 내가 지금 배우는 과정에서의 주된 이유는 작업을 동시에 처리하기 위함이다. 물론 CPU는 동시에 작업을 처리할 수 없다. 한 번에 한 가지 작업만을 처리하는데 여러 개의 작업이 있으면 일정 시간동안 번갈아가며 처리하도록 되어있다. 그 속도가 굉장히 빨라 우리가 보기엔 동시에 작동하는 것처럼 보일 뿐이다. melon을 들으며 인터넷 검색을 하는 것을 예로 들 수 있다.



헤더 : unistd.h

원형 : pid_t fork(void)


fork() 함수를 호출하고 성공하면 PID 값만 다른 똑같은 프로세스가 생성된다. 실행이 실패하면 -1을 반환하고 성공하면 부모 프로세스에게는 자식 프로세스의 PID를, 자식 프로세스에는 0을 반환한다. 원본 프로세스가 부모 프로세스이고 복사된 프로세스가 자식 프로세스이다. 


PID와 fork의 예제는 다음과 같다.



#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { int parentcount = 0, childcount = 0; pid_t pid; pid = fork(); switch(pid) {     case -1 :     {     printf("error\n");     return -1;     }     case 0 :     {     printf("child process=%d\n", getpid());     while(1) {         printf("child=%d\n", childcount--);         sleep(1);     }     break;     }     default :     {     printf("parent process=%d\n", getpid());     while(1) {         printf("parent=%d\n", parentcount++);         sleep(1);     }     break;     } } return 0; }



getpid() 함수는 함수를 호출한 프로세스의 ID를 반환한다. 부모 프로세스가 먼저 실행되고 자식 프로세스와 번갈아가며 실행된다. 실행 결과는 다음과 같다.