2018년 11월 13일 화요일

[Linux / Unix] 프로세스 생성과 관리

프로세스 조회 및 생성에 대해서 살펴보자

프로세스란?

- 프로세스는 프로그램안에서 동작하는 단위이며, 프로그램의 실행될때 함께 생성되어 실행된다.





부모 프로세스와 자식프로세스
- 우리가 하나의 프로그램에서 프로세스 생성함수를 만들었다고 가정해보자.
이 프로그램에서 프로세스를 생성될 때 새로운 자식 프로세스가 생성되는 것 이라고 할 수 있다.
그리고 생성된 프로세스(자식 프로세스)의 부모 프로세스는 프로세스 생성함수를 호출한 프로세스가 된다.

정리하면, 
A프로그램이 돌아가는 동안에 하나의 프로세스가 생성 될 것이다.
이 프로그램안에는 프로세스를 생성하는 함수가 존재한다. 이때 프로세스를 생성하는 함수를 호출해서 2번째 프로세스가 생성이되면, 이 프로세스는 자식 프로세스가 생성이 된 것이다. 또한 이 자식 프로세스의 부모 프로세스는 해당 함수를 호출한 즉, A프로그램을 실행시키는 프로세스가 되는 것이다.

예제를 통해 살펴보자

예제) 자식 프로세스를 생성하고 부모 프로세스와 자식 프로세스의 프로세스 ID 확인하기


  1. #include<sys/types.h>
  2. #include<sys/wait.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<unistd.h>
  6. int main(){
  7.         int status;
  8.         pid_t pid;
  9.         switch(pid = fork()){
  10.                 case -1:
  11.                         perror("fork error()");
  12.                         exit(1);
  13.                 case 0:
  14.                         printf("---> Child Process\n");
  15.                         printf("PID : %d, Parent PID : %d\n", (int)getpid(), (int)getppid());
  16.                         sleep(3);
  17.                         exit(0);
  18.                 default:
  19.                         while( wait(&status) != pid)
  20.                                 continue;
  21.                         printf("---> Parent Process\n");
  22.                         printf("PID : %d, Parent PID : %d\n", (int)getpid(), (int)getppid());
  23.                         break;
  24.         }
  25.         printf("end process\n");
  26.         return 0;
  27. }


▶ 실행결과






















: fork()를 통해서 자식 프로세스가 생성된다.
하지만 주의해야할 사항이 있다. 바로 자식은 부모 프로세스의 메모리를 복사한다는 점이다.
그래서 프로세스 그룹을 보면, 부모와같은 프로세스 그룹을 갖는다. 이외에도 파일 디스크립터, 현재 작업 디렉토리, 세션ID, 환경 변수 등 다양한 것들이 복사 된다. 
  그래서 vfork()를 이용해서 부모 프로세스의 메모리를 복사하지 않도록 설정하고 부모와 자식 프로세스간의 동기화가 이루어질 수 있다.


  위의 예제를 통해 2가지를 알 수 있게 되었다.


  1) 자식과 부모프로세스를 구별하는 방법

  switch ~ catch문을 통해서 자식과 부모프로세스를 구별한다.
  pid = fork()를 넣으면, 이 프로그램에서 2개의 프로세스가 존재하게 된다. case에 0과 -1과 default라고 설정한 것을 통해서 부모와 자식 프로세스를 구별한다.
 fork()를 통해 생성된 자식프로세스는 0이 반환되서 pid가 0이 되며, 부모 프로세스는 생성된 자식 프로세스의 ID값을 갖게된다.


       ex) pid = fork() 

  •   자식 프로세스의 pid : 0
  •   부모 프로세스의 pid : 자식프로세스의 id(0이 아닌 프로세스 id이다. pid는 단순히 자식/부모 프로세스를 구별하기 위한 용도이므로 헷갈리지말자.)




  
  2) 자식과 부모 프로세스의 호출순서    

 자식과 부모 프로세스는 실행순서를 예측할 수 없다.
 바로 스케줄링을 통해서 순서를 제어할 수 있는데, 위 코드에서 wait()함수를 살펴보자

 wait()은 프로세스를 제어 할 때 사용된다.
이 wait()은 자식 프로세스가 소멸될때, 자식 프로세스는 exit(0)을 통해서 종료된다. 이때, wait에 자식 프로세스의 id가 리턴되고, default:안의 pid에는 자식 프로세스의 id가 들어간다.
그래서 부모 프로세스가 갖는 자식 프로세스의 id인 pid와 wait()을 통해 반환된 id값이랑 같아 질 때, 부모 프로세스가 더이상 wait()되지 않고 다르게 말하면 자식 프로세스가 소멸된 다음 종료된다.
  
  그래서 이 예제의 부모프로세스는 생성된 자식프로세스가 종료되기 전까지 종료되지 않게 스케줄링 된 것이다.



댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...