개발 기초/CS 공부

[OS] 04. Process Management

숩니따 2023. 12. 22. 16:53

 

프로세스 생성(Process Creation)

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

→ 생성은 보통 복제 생성으로 트리(계층 구조) 형성 (프로세스의 문맥을 모두 복사)

프로세스 필요조건 자원

  • 운영체제로부터 받는다
  • 부모와 공유

공유(원칙적으로 공유 X)

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

→ 부모 프로세스가 자식 프로세스를 생성하면 서로 별개의 프로세스가 되며 서로 CPU를 차지하기 위하거나 메모리를 많이 차지하기 위해 경쟁하게 됨

Copy-on-write (COW)

원칙적으로 공유하지는 않지만 부모와 자식의 내용이 똑같다면, 메모리 낭비하게 되므로 일단 공유하고 있다가 부모와 자식의 내용이 달라지면 그 때부터 공유하고 있던 메모리 카피해서 실행

수행(Execution)

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

주소 공간(Address space)

  1. 자식은 부모의 공간을 복사함(binary and OS data - 주소 공간 및 운영체제에 있는 PCB와 자원)
  1. 자식은 그 공간에 새로운 프로그램을 올림

유닉스 예시

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

서로 독립적이기 때문에 복제만 할 수도 있고 자식 프로세스를 만들지 않고 그냥 exec()을 하면 새로운 프로세스로 바뀜

결론은 시스템 콜이기 때문에 운영체제에게 자식 생성을 부탁하는 과정

프로세스 종료(Process Termination)

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

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

부모 프로세스가 자식의 수행을 종료시킴
(
abort 시스템콜) - 비자발(강제종료)

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

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

  • fork() create a child (copy)
  • exec() evelay new image
  • wait() sleep until child is done
  • exit() frees all the resources, notify parent

fork() 시스템 콜

A process is created by the fork() system call

  • create a new address space that is a duplicate of the caller
int main() {       int pid;     pid = fork(); /*함수 호출 - 시스템콜*/     if (pid == 0) /*this is child*/         print("\n Hello, I am child!\n");     else if (pid > 0) /*this is parent*/         print("\n Hello, I am parent!\n"); }

자식 프로세스는 fork() 함수 수행 이후부터 실행 (부모의 문맥까지 모두 복사하기 때문)

복제로 인해 나타난 문제

  1. 자식 프로세스가 부모 프로세스라고 주장
    • fork() return value가 부모는 양수, 자식은 0, 에러는 음수
  1. 부모와 똑같은 자식 프로그램 흐름
    • return value로 부모와 자식을 구분할 수 있기 때문에 프로그램 제어 흐름 다르게 구성 가능
    • 제어 흐름만 다를 뿐 코드로 따지면 똑같음 → exec()로 해결

exec() 시스템 콜

A pricess can execute a different program by the exec() system call.

  • replaces the memory image of the caller with a new program
int main() {       int pid;     pid = fork();      if (pid == 0) /*this is child*/     {    print("\n Hello, I am child! Now, I'll run date\n");          execlp( "echo", "echo", "hello", "3", (char*) 0); /*함수 호출 - 시스템콜*/     }     else if (pid > 0) /*this is parent*/         print("\n Hello, I am parent!\n"); }

이전 기억은 완전히 잊어버리고 "/bin/date", "/bin/date", (char*) 0와 같은 새로운 프로그램으로 덮어지고 이 프로그램의 시작 부분(main 함수)부터 시작 (다시 기존 프로그램으로 돌아갈 수는 없음)

fork() 없이 바로 execlp()하여 새 프로그램으로 덮어써서 실행할 수 있으며 덮어썼기 때문에 execlp() 이후에 나오는 코드는 실행 불가능

wait() 시스템 콜

프로세스 A가 wait 시스템 콜을 호출하면 (자식 프로세스 만들어야 실행할 수 있는 시스템 콜)

자식이 종료될 때까지 기다리는 부모가 기다리는 모델

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

exit() 시스템 콜

프로세스의 종료

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

프로세스 간 협력

독립적 프로세스(Independaent process)

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

협력 프로세스(Cooperating process)

프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
(서로 정보를 주고받으면서 협력)

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

  • 메시지를 전달하는 방법 (message passing)
    커널을 통해 메시지 전달
    → Message system
    프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
    • 메시지 전달에는 커널이 필수지만 인터페이스 측면에서 다른 두 가지 방법 존재
      • Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시 
      • Indirect Communication: mailbox (또는 port)를 통해 메시지를 간접 전달
        → 문어발식 전달 가능
  • 주소 공간을 공유하는 방법 (shared memory)
    서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
    바로 share 할 수 있는 것은 아니고 커널한테 시스템콜로 share 요청 후 매핑한 다음 share 가능

☆ thread (프로세스 하나 당 CPU 수행 단위가 여러 개)

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


Uploaded by

N2T

 

'개발 기초 > CS 공부' 카테고리의 다른 글

[OS] 06. Process Synchronization  (1) 2023.12.22
[OS] 05. CPU Scheduling  (1) 2023.12.22
[OS] 03. Process  (1) 2023.12.22
[OS] 02. System Structure & Program Execution  (0) 2023.12.22
[OS] 01. Introduction to Operating Systems  (1) 2023.12.19