프로세스 관리

Single Ko·2023년 4월 25일
0

operating system

목록 보기
6/13

프로세스 관리

생성(Creation)

✨ 부모 프로세스(Parent process)가 자식 프로세스(children process) 생성

  • 프로세스가 운영체제에 만들어 달라고 요청 커널은 fork() 함수를 실행해서 자식 프로세스 생성

✨ 프로세스의 트리(계층 구조) 형성

✨ 프로세스는 자원을 필요로 함

  • 운영체제로부터 받는다
  • 부모와 공유한다(프로세스끼리는 원래 자원을 가지고 싸우지만, 이례적으로 공유하는 상황이 있음)

✨ 자원의 공유

  • 부모와 자식이 모든 자원을 공유하는 모델
  • 일부를 공유하는 모델
  • 전혀 공유하지 않는 모델

✨ 수행 (Execution)

  • 부모와 자식은 공존하며 수행되는 모델
  • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델

✨ 주소 공간 (Address space)

  • 자식은 부모의 공간을 복사함 (binary and OS data)
  • 자식은 그 공간에 새로운 프로그램을 올림
    • 현재 부모 프로세스가 수행하는 위치에서 부터 자식이 수행된다(다 복사함으로..)

✨ 유닉스의 예

  • fork() 시스템 콜이 새로운 프로세스를 생성
    • 부모를 그대로 복사 (OS data except PID + binary)
    • 주소 공간 할당
  • fork() 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

exec() 시스템 콜 : 프로세스를 하나 복사해 놓고 그 프로세스를 새로운 프로그램으로 덮어 씌워서 프로그램을 실행 하는 것.

종료 (Termination)

✨ 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)

  • 자식이 부모에게 output data를 보냄 (via wait).
  • 프로세스의 각종 자원들이 운영체제에게 반납됨

✨ 부모 프로세스가 자식의 수행을 종료시킴 (abort)

  • 자식이 할당 자원의 한계치를 넘어섬
  • 자식에게 할당된 태스크가 더 이상 필요하지 않음
  • 부모가 종료(exit)하는 경우
    • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
    • 단계적인 종료(자식이 종료 된 후 부모가 종료)

fork() 시스템 콜

✨ 프로세스는 fork() 시스템 콜로 만들어 진다

  • 호출자의 주소를 복제해 새 주소 공간을 만듭니다

부모와 자식은 완전 동일하다. 어떻게 구분을 하는가?

int main()
{ int pid;
  pid = fork();
  if (pid == 0)     /* this is child */
  printf("\n Hello, I am child!\n");
  else if (pid >0)  /" this is parent */
  printf("\n Hello, I am parent!\n");
}

fork()를 한 변수의 값으로 구분.

Parent process
pid>0

Child process
pid = 0

fork() 만으로는 완전히 다른 일을 시킬수는 없다. 똑같은 일만 할 수 있음. 이때 다른 일을 시키고 싶다면 exec() 시스템 콜이 필요하다

exec() 시스템 콜

✨ 프로세스는 exec() 시스템 호출에 의해 다른 프로그램을 실행할 수 있습니다.

  • 새 프로그램은 호출자의 메모리를 대체한다.
int main() 
{
  printf("\n Hello");
  execlp("/bin/date", "/bin/date", (char*) 0);
  printf("\n Hello");
}

execlp를 하는순간 새로운 프로그램이 덫씌워지기 때문에 밑의 Hello는 출력되지 않고 다른 프로그램이 실행 된다.

int main()
{ 
	int pid;
    pid = fork();
    if (pid == 0)        /* this is child */
    { printf("\n Hello, I am child! Now I'll run date \n");
      execlp("/bin/date", "/bin/date", (char*) 0);
    }
    else if (pid > 0)    /" this is parent */
      printf("\n Hello, I am parent!\n");
}

fork() 후 exec() 시스템 시스템 콜을 한 경우에 대한 예제 코드

wait() 시스템 콜

✨프로세스 A가 wait() 시스템 콜을 호출하면

  • 커널은 child가 종료될 때까지 프로세스 A sleep시킨다 (block 상태)
  • Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)

ex) Linux의 Vi 사용

wait() 시스템 콜을 하지 않으면 부모와 자식은 경쟁관계. 서로 CPU를 얻으려고 경쟁하는 프로그램.

wait()를 불러버리면 자식이 종료될때까지 부모 process를 blocked 시키는 것.

exit() 시스템 콜

두가지 상황의 프로세스의 종료

✨자발적 종료

  • 마지막 statement 수행 후 exit() 시스템 콜을 통해
  • 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 exit()을 넣어줌

✨비자발적 종료

  • 부모 프로세스가 자식 프로세스를 강제 종료시킴
    ✓자식 프로세스가 한계치를 넘어서는 자원 요청
    ✓자식에게 할당된 태스크가 더 이상 필요하지 않음
  • 키보드로 kill, break 등을 친 경우
  • 부모가 종료하는 경우
    ✓부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

프로세스 간 협력

✨독립적 프로세스 (Independent process)

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

✨협력 프로세스(Cooperating process)

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

프로세스 간 협력 메커니즘(IPC: Interprocess Communication)

  • 메시지를 전달하는 방법
    message passing: 커널을 통해 메시지 전달

  • 주소 공간을 공유하는 방법
    shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음===============================================================

    Thread와 Shared Memory의 차이점
    thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들간에는 주소 공간을 공유하므로 협력이 가능.( thread가 만들어지는 거 자체가 메모리 공간을 공유함.)

Message passing

Message system

  • 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
  • 메시지를 보낼 때마다 시스템콜을 날림 → slower
  • 통신하려는 프로세스의 이름을 명시적으로 표시하는지 여부에 따라 direct / indirect로 구분

Direct Communication

  • 통신하려는 프로세스의 이름을 명시적으로 표시

Indirect Communication

  • mailbox(또는 port)를 통해 메시지를 간접 전달

    indirect메시지를 메일박스에 넣어놓기만 하고 어떤 프로세스가 받을지는 명시하지 않음 (협력하는 프로세스중에 누군가가 꺼내갈 수 있게 하는 방법)

Shared Memory

  • 서로 다른 프로세스 간에 일부 주소공간을 공유
  • 운영체제에 시스템 콜을 통해 공유 가능
  • 신뢰할 수 있는 프로세스가 메모리를 공유해야 한다.
  • A process 가 공유 메모리에 무언가를 남기면 B process가 그것을 읽고 사용 가능. 서로 커뮤니케이션을 통해 협력이 가능하다.
  • shared memory를 mapping할때만 시스템콜 날림 → faster
profile
공부 정리 블로그

0개의 댓글