[운영체제] 4. Process Management

Seojin Kwak·2022년 4월 22일
0

Operating Systems

목록 보기
4/6

Process Creation & Termination

프로세스 생성

: 부모 프로세스가 자식 프로세스 생성 (fork)

  • 트리(계층 구조) 형성

  • 프로세스는 자원을 필요로 함: 운영체제로부터 받는다 / 부모와 공유한다

  • 자원의 공유: 부모와 자식이 모든 자원 공유하는 모델 / 일부 공유 모델 / 전혀 공유하지 않는 모델(일반적)

  • 수행(execution): 부모와 자식은 공존하며 수행되는 모델 / 자식이 종료될 때까지 부모(shell)가 기다리는(wait) 모델
    ex) top 명령어

  • 주소 공간(address space): 자신은 부모의 공간을 복사하고 그 공간에 새로운 프로그램을 올림
    ex) UNIX

(1) fork() system call이 새로운 process 생성
: PCB가 부모를 그대로 복사(OS data except PID + binary), 주소 공간 할당
(2) fork 다음에 이어지는 exec() system call을 통해 새로운 프로그램을 메모리에 올림
: child에 새로운 code 들어가서 변경. 새로운 program 시행

프로세스 종료

  • 프로세스가 마지막 명령 수행 후 운영체제에게 끝났음을 알림. 자발적 종료 (exit)
    - 자식이 부모에게 output data를 보냄
    - 프로세스의 각종 자원들이 운영체제에게 반납
  • 부모 프로세스가 자식의 수행 종료. 비자발적 종료 (abort)
    - 자식이 할당 자원의 한계치를 넘어섬
    - 자식에게 할당된 task가 더이상 필요X
    - 부모가 종료(exit)하는 경우: 자식이 더 이상 수행되도록 두지 않음. 자식이 먼저 단계적 종료.

System Call

fork()

: Process creation. 새로운 주소공간 생성 -> caller에게 복제. 문맥 그대로 복제(program counter). 같은 흐름을 가지는 프로세스만 생성 가능.

  int main(){
      int pid;
      pid = fork();	// 여기서 자식프로세스 생성.
      // 자식프로세스는 fork 이후인 여기부터 code 실행
      if (pid == 0)	// child
          printf("\n Hello, I am child\n");
      else if (pid > 0)	// parent
          printf("\n Hello, I am parent\n");
  }

fork된 child process가 원본이라고 주장하는 경우를 방지하기 위해, 함수의 return값이 다름.
부모 process의 pid는 양수 / 자식 process의 pid는 0

exec()

: execute a different program. 어떤 프로그램을 완전히 새로운 프로세스로 만듦

  int main(){
      int pid;
      pid = fork();
      if (pid == 0) {	// child
          printf("\n Hello, I am child! Now I'll un date \n");
          // 새로운 프로그램으로 덮어쓰기. 되돌아올 수 없음.
          execlp("/bin/date", "/bin/date", (char *) 0);
      }
      else if (pid > 0)	// parent
          printf("\n Hello, I am parent\n");
  }

wait()

: 일반적으로 자식 process 생성 후 호출하는 커널 함수

  • 커널은 child가 종료될 때까지 process A를 sleep시킴 (blocked)
  • child process 종료 시, 커널은 process A 깨움 (ready)
    ex) 리눅스 프로그램 명령어는 shell의 자식 process로 생성됨. shell은 해당 프로그램 종료까지 wait.
    int main() {
    	int childPID;
        S1;
        
        childPID = fork();
        
        if (childPID == 0)
        	<code for child process>
        else {
        	wait();
        }
        S2;
    }

exit()

: 프로세스의 종료

  • 자발적 종료: 마지막 statement 수행 후 exit() system call을 통해. 프로그램에 명시적으로 적어주지 않아도 main 함수가 return되는 위치에 compiler가 넣어줌

  • 비자발적 종료
    - 부모 process가 자식 process를 강제 종료

    1. 자식 process가 한계치를 넘어서는 자원 요청
    2. 자식에게 할당된 task가 더 이상 필요 X

    - 사용자가 키보드로 kill, break (Ctrl+C)
    - 부모가 종료하는 경우: 부모 process가 종료하기 전에 자식들이 먼저 종료됨.

IPC: Interprocess Communication

  • 독립적 프로세스(Independent Process)
    : 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  • 협력 프로세스(Cooperating Process)
    : 프로세스 협력 매커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
  • 프로세스 간 협력 매커니즘 (IPC: InterProcess Communication)

    • 메시지 전달 방법: message passing
      • 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 커널을 통해 메시지 전달
      • Direct communication: 통신하려는 process 이름을 명시적으로 표시
      • Indirect communication: mailbox(or port)를 통해 메시지 간접 전달
    • 주소 공간 공유 방법: shared memory
      - 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 매커니즘이 존재. (서로 신뢰할 수 있는 관계) 대용량 data 전달, 둘 간의 sync 맞추기

      thread: 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력 가능 => shared memory, message passing 안 써도 공유, 통신 가능


운영체제 - 반효경
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

profile
Hello, World!

0개의 댓글