/var/www/tistory/Yongbaldae
yongmin@kali: ~/blog$ ls posts

시스템프로그래밍 중간정리(lect9)

process

A program loaded in the memory.

//컴파일해서 실행파일을 만들면 디스크에 저장되게 되는데 디스크에 저장되어 있는 상태에서는 실행파일 또는 프로그램이라고 부릅니다.

process = body + process descriptor

body= code + data + stack

process descriptor = pid(process identifier) + state + mm(메모리 위치)

 

scheduler

어느 한순간에 메모리를 보면, 프로세스가 하나만 떠서 실행되는 경우는 거의 없다.

이때 각 프로세스를 어떤것부터 처리할 것인가를 scheduler라는 것이 결정해준다.

"current" is pointing to the current process running

when the current process stops due to timer expiration or other reason, the scheduler picks next process.
각 프로세스마다 타임퀀텀(일정한 시간)이 주어지고 그 시간이 지나면 그 프로세스를 스탑하고 다음 프로세스로
넘어갑니다.(CPU의 시간을 균등배분받는 것입니다. 0.01초씩 할당받는 느낌)
psef shows all processes in the memory
 

System calls to manage processes

처음에 시스템이 부팅이되면 "운영체제"라는 프로그램 하나만 로딩이 된다. 첫번째 프로세스는 운영체제인 것.

fork와 exec을 통해 계속 child들을 만들고, 이들을 모두 합해서 현재 프로세스의 리스트를 이루게 된다.

fork: duplicate a process 

What happens when a program calls fork():

 

     1) copy body

     2) copy process descriptor

     3) adjust child's process descriptor

     4) return 0 to child //아이에게는 0이 리턴.

     5) return child's pid to parent //부모에게는 아이의 pid가 리턴

ex1: 

   void main(){

      int x;

      x=fork();

      if (x==0) printf("ok1\n");

      else printf("ok2\n");

   }

- the scheduler may schedule the child first

$ ./ex1

ok1

ok2  

            

- or the scheduler may schedule the parent first

$./ex1

ok2

ok1


#include <stdio.h>

#include <stdlib.h>

void main(){

   int x, i;

   for(i=0;i<5;i++){

      x=fork();

      if (x==0){ // child

         int k;

         for(k=0;k<10;k++){

            printf("%d-th child running %d-th iteration , i, k);  

            fflush(stdout);         // to make printf work immediately

            sleep(1);              // sleep 1 second

        }

        exit(0);   // child exits after 10 iterations

      }

   }

   // now parent

   printf(parent exits\n);

}

이 코드는 fork() 시스템 호출을 사용하여 총 5개의 자식 프로세스를 생성하며, 각 자식 프로세스는 10번의 반복문을 실행한 후 종료합니다.

fork() 함수는 새로운 프로세스를 생성합니다. 부모 프로세스에서는 새로 생성된 자식 프로세스의 프로세스 ID를 반환받고, 자식 프로세스에서는 0을 반환받습니다. 그래서 이 코드에서 if (x==0) 구문은 자식 프로세스에서만 실행됩니다.

그러나 이 코드에는 주의할 점이 있습니다. 부모 프로세스는 자식 프로세스들이 모두 생성된 직후에 "parent exits"라는 메시지를 출력하고 종료합니다. 이 경우, 부모 프로세스는 자식 프로세스들이 완전히 종료될 것이라는 보장이 없기 때문에, 부모 프로세스가 자식 프로세스보다 먼저 종료될 수 있습니다.

만약 부모 프로세스가 자식 프로세스보다 먼저 종료되면, 그 자식 프로세스들은 "고아 프로세스(orphan process)"가 됩니다. 고아 프로세스는 부모 프로세스가 없는 프로세스를 의미하며, 이들은 시스템에 의해 'init' 프로세스 (프로세스 ID가 1인 프로세스)의 자식으로 채택됩니다.

'init' 프로세스는 시스템 부팅 시에 생성되며, 모든 프로세스의 부모가 될 수 있습니다. 부모 프로세스가 종료된 자식 프로세스는 'init' 프로세스에 의해 채택되어, 그들의 종료 상태는 'init' 프로세스에 의해 수집됩니다. 이를 통해 "좀비 프로세스(zombie process)" 생성을 방지합니다.

좀비 프로세스는 자신의 종료 상태를 부모 프로세스에게 전달하지 못하고 시스템에 남아있는 프로세스를 말합니다. 부모 프로세스가 종료 상태를 수집하지 않으면, 자식 프로세스는 종료되었지만 프로세스 테이블에 여전히 남아있게 되며, 이는 시스템 자원의 낭비를 초래합니다.

그러나 리눅스와 같은 대부분의 현대 운영체제에서는 이러한 고아 프로세스와 좀비 프로세스 문제를 자동으로 관리합니다. 그래서 일반적으로 부모 프로세스가 자식 프로세스보다 먼저 종료되는 것은 큰 문제가 되지 않습니다. 하지만 가능한 한 좀비 프로세스를 생성하지 않도록 주의하는 것이 좋습니다.


exec: transform a process into another

exit: stop the process

wait: wait for the exit of the child process

getpid: get process ID

getppid: get parent process ID

 

more_posts (recent 5)