[운영체제] Day04. Process Management

youngkimi·2023년 12월 14일
0

[CS] 운영체제

목록 보기
4/12
post-custom-banner

프로세스 생성 (Process Creation)

  • 부모 프로세스가 자식 프로세스 생성 (일반적으로 복제 생성)
  • 프로세스의 트리(계층 구조) 형성
  • 프로세스는 자원이 필요하다.
    • 운영체제로부터 자원을 받기도 한다.
    • 부모와 공유하기도 한다. (일반적으로는 공유 안함.)
  • 부모와 자식이 공존하며 수행되기도, 자식이 종료(Blocked)될 때까지 부모가 기다리기도(Wait) 한다.

주소 공간

  • 자식은 부모의 공간을 복사함
  • 자식은 그 공간에 새로운 프로그램을 올림 - Unix의
  • Unix의 예시 (시스템 콜, OS 통해서 작동)
    • fork() : 부모 그대로 복사, 주소 공간 할당
    • exec() : 새로운 프로그램 메모리에 얹음
  • 프로세스 종료(exit)
    • 자식은 부모에 output data 보냄
    • 자원을 OS에 반환
  • 프로세스 강제 종료(abort)
    • 자식이 필요 없거나 자원을 과도하게 사용
    • 부모가 종료하는 경우 단계적인 종료

fork() system call

  • 진행 방법은 아래 코드블록 참조.
  • 부모인지 자식인지는 fork()의 Return 값으로 확인 가능
  • 부모는 + 값, 자식은 0 return.
  • 따라서 부모, 자식 여부 확인 가능하고 이에 따라 다른 작업 수행이 가능하다.
int main() // parent
{
	int pid;
    // 이 부분에서 자식 Process 생성 후 쭉 진행
    pid = fork(); 
    if (pid == 0) 
    	printf("\n Hello, I am child\n");
    else if (pid > 0) 
    	printf("\n Hello, I am parent\n");
}
int main() // child : 위에서 fork할 때 생성
{
	int pid;
    // 복사 (fork) 당시 프로그램 카운터가 가리키던 지점.
    // 프로그램 카운터까지 복사한다. 
    // 따라서 맨 위부터가 아니라 이 부분부터 이어서 시행한다.
    pid = fork(); 
    if (pid == 0) 
    	printf("\n Hello, I am child\n");
    else if (pid > 0) 
    	printf("\n Hello, I am parent\n");
}

exec() system call

  • 진행 방법은 아래 코드블록 참조.
  • 부모인지 자식인지는 fork()의 Return 값으로 확인 가
  • 부모는 + 값, 자식은 0 return.
  • 따라서 부모, 자식 여부 확인 가능하고 이에 따라 다른 작업 수행이 가능하다.
int main() // child : 위에서 fork할 때 생성
{
	int pid;
    pid = fork(); 
    if (pid == 0) 
    {
      printf("\n Hello, I am child\n");
      // exec 시 새로운 프로세스로 덮어 씌움
      // 한번 exec 하면 되돌리기가 불가능
      execlp("/bon/date", "/bin/date", (char *) 0);

    }
    else if (pid > 0) 
    	printf("\n Hello, I am child\n");
}

wait() system call

  • 프로세스 A가 wait() 시스템 콜을 호출하면
  • 커널은 child가 종료될 때 까지 프로세스 A를 sleep (block) 시킨다.
  • child process 모두 종료되면 커널은 A를 깨운다(ready)
  • 따라서 부모, 자식 여부 확인 가능하고 이에 따라 다른 작업 수행이 가능하다.
int main() // child : 위에서 fork할 때 생성
{
	int childPID;
    s1;
    childPID = fork(); 
    if (childPID == 0) 
    {
    ...
    }
    // 부모면 sleep, 자식의 종료를 기다림.
    else if (pid > 0)
    {
    	wait();
    }
    s2;
}

exit() system call

  • 자발적 종료 :
    exit() 시스템 콜, 또는 main return 위치에 컴파일러가 넣어줌.
  • 비자발적 종료 :
    부모 프로세스 종료 시, 혹은 자식 프로세스가 불필요하거나 자원 낭비 시 kill
int main() // child : 위에서 fork할 때 생성
{
	int pid;
    // 여기서 끝나버림
    // 자발적 종료 시 사용
    exit();
    childPID = fork(); 
    if (childPID == 0) 
    {
    ...
    }
    else if (pid > 0)
    {
    ...
    }
}

프로세스 간 협력

독립적 프로세스 (Independent Process)

프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로는 다른 프로세스의 수행에 영향을 미치지 못함.

협력적 프로세스 (Cooperating Process)

프로세스 협력 메커니즘으로 하나의 프로세스가 다른 프로세스 수행에 영향을 미칠 수 있음.

협력 메커니즘(IPC InterProcess Communication)

  • 메시지를 전달하는 방법
    Message Passing : Kernel을 매개로 메세지 전달
    • 통신하려는 프로세스 이름을 명시적 표시하면 direct
      Kernel을 매개로 msg 전달함
    • mailbox(port)로 메세지 간접 전달하면 indirect
  • 주소 공간을 공유하는 방법
    Shared Memory : 서로 다른 프로세스 간 주소공간 일부 공유
    • 주소 공간 공유한다고 Kernel에게 알려줘야 함
      마찬가지로 Thread 들도 주소공간을 공유하니까 협력 가능 (애초에 하나의 Process이기는 하지만...)
post-custom-banner

0개의 댓글