[OS] Process Management

Doodung·2022년 3월 9일
0

OS - 운영체제

목록 보기
9/15
post-thumbnail

☑️프로세스 생성(Process Creation)


부모 프로세스(Parent process)가 자식 프로세스(Children process)를 생성한다.

  • 여러개의 자식을 가질 수 있음.
  • 생성하는 방법 : 복제 생성 → 프로세스의 문맥을 모두 복사하는 것.
    (주소공간인 code data stack, CPU 문맥인 PC)

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

프로세스는 자원(cpu, 메모리 등등)을 필요로 함

  • 운영체제로부터 받는다.
  • 부모와 공유하는 경우도 있다. (경우에 따라) 원칙적으로는 자원을 공유하지는 않는다.
    부모와 자식은 각각 다른 프로세스이기 때문에 서로 경쟁하는 위치에 있게 된다. (CPU를 얻기 위해)

자원의 공유

  • 부모와 자식이 모든 자원을 공유하는 모델
    리눅스나 효율적인 운영체제에서는 일단 copy하지 않고 자식이 부모의 주소공간을 공유하고 있다가(PC만 복사), 부모와 자식의 내용이 달라질 때 (ex 함수 호출시 stack이 달라지는 것) 그제서야 부모의 메모리 공간 일부를 카피해서 자식이 갖게 되는 것.
    code,data,stack이 통째로 올라가는 것이 아니라 이를 잘게 쪼개서 그 부분만 카피한다.
    → Copy-On-Write 기법(COW)) 가능하면 공유하는 것이 효율적이다.
  • 일부를 공유하는 모델
  • 전혀 공유하지 않는 모델

수행 (Execution)

  • 부모와 자식은 공존하며 수행되는 모델
  • 자식을 하나 생성한 다음에 자식이 종료(terminate)될 때 까지 부모가 기다리는 (wait == blocked) 모델

주소 공간(Adress space)

  • 자식은 부모의 공간을 복사함(binary and OS data (= PCB, 자원들))
  • 자식은 그 공간에 새로운 프로그램을 올림 → 그렇게 서로 다른 프로그램들이 컴퓨터 내에 존재.

유닉스의 예

  • fork() (= 복제 생성 하는 역할) 시스템 콜이 새로운 프로세스를 생성
    • 부모를 그대로 복사 (OS data except PID + binary)
    • 주소 공간 할당
  • fork() 다음에 이어지는 exec() (= 복제 생성 후 새로운 프로그램 올리는 역할) 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
    • 자식 프로세스를 만들지 않고 exec()을 하면 새로운 프로그램을 만들 수 있다.
  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit) : 자발적 종료
    • 프로세스가 종료될 자식이 부모에게 output data를 보냄 (via wait)
    • 프로세스의 각종 자원들이 운영체제에게 반납됨
  • 부모 프로세스가 자식의 수행을 종료시킴(abort) : 비자발적 강제 종료
    • 자식이 할당 자원의 한계치를 넘어섰을 때
    • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다. 자식들을 모두 죽이고 나서 위에 부모가 죽는다.
      • 단계적인 종료

결국 프로세스 생성은 두 단계로 이루어진다. 운영체제를 통해서만 가능하다.

1. 부모 프로세스 복제

2. 그 위에 새로운 프로그램 올림


☑️프로세스와 관련한 시스템 콜


👩‍👧‍👧fork() 시스템 콜

fork() 시스템 콜에 의해 프로세스가 생성된다.
→ 호출자의 복제본인 새 주소 공간을 만든다.

왼 : 부모 프로세스

fork에서 오른쪽의 자식 프로세스를 생성하고
자신의 코드를 실행한다.

  • 오른쪽의 자식 프로세스는 포크를 실행한 그 이후 시점부터 시작한다.
    (부모 프로세스는 포크를 실행한 후 PC가 그곳을 가리키고 있었는데
    자식 프로세스는 그것을 복사하기 때문에.)
  • 복제를 할 때 자식하고 부모하고 구분을 해준다. fork의 return value가 다르다.
    부모는 양수가 얻어진다. (자식 프로세스의 PID를 얻게 됨) 자식은 0을 얻게 된다.
    → 분기 처리를 할 수있게 된다.

🆕exec() 시스템 콜

프로세스는 exec() 시스템 콜에 의해 다른 프로그램을 실행할 수 있다.
→ 호출자의 메모리를 새 프로그램으로 교체

부모가 자식을 만들고 자식에서 새로운 프로그램을 실행시킴. (bin/date)

프로그램이 실행 되다가 execlp가 실행 되면 새로운 프로그램으로 완전히 덮어 씌워진다.
그 함수의 main 맨 처음부터 실행된다. 한번 exec하면 다시 돌아갈 순 없음.

꼭 exec이 자식을 만들어고 나서 해야하는 것은 아니다.
fork 없이 execlp()만 있을 수도 있다. 아래의 상황에서 execlp 후의 코드는 실행되지 않는다.

🚏wait() 시스템 콜

자식이 종료될때까지 기다린다.

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

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

🚪exit() 시스템 콜

프로세스의 종료

  • 자발적 종료
    • 마지막 statement 수행 후 exit() 시스템 콜을 통해
    • 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌 (c언어에서 중괄호 닫을 때와 같이)
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스를 강제 종료시킴
      • 자식 프로세스가 한계치를 넘어서는 자원 요청
      • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 키보드로 kill, break 등을 친 경우
    • 부모가 종료하는 경우
      • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

☑️프로세스 간 협력


1. 독립적 프로세스 (Independent Process)

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

2. 협력 프로세스 (Cooperating Process)

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

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

1. 메시지를 전달하는 방법

  • Message Passing 커널을 통해 메시지 전달

🗨️ Message Passing
Message System : 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
방법 : 두 방법 다 커널을 통해 메시지를 전달해야 함은 같다.
1. Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시

2. Indirect Communication : mail box (또는 port)를 통해 메시지를 간접 전달
아무나 꺼내갈 수 있음

2. 주소 공간을 공유하는 방법

  • Shared memory

🫂 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
맨 처음 shared memory를 쓴다고 커널에게 요청해야 한다.
-> 그 후에는 사용자 프로세스 둘이서 작업을 하는 것.
두 프로세스는 상당히 신뢰할 수 있는 관계여야 한다.
-> 한 프로세스가 잘못되면 그 영향이 이어질 수 있음.

(참고) Thread
thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

profile
반가워요!

0개의 댓글