SY 개발일지
article thumbnail

프로세스 생성 (Process Creation)

  • 부모 프로세스(Parent Process)가 자식 프로세스(Child Process) 생성
    • 보통 복제 생성을 함(추후 설명)
    • 부모 프로세스가 자신과 같은 자식 프로세스를 생성함. 여기서 복제라는 것은 프로세스의 문맥을 모두 복사하는 것이다.
      • code, data, stack, program counter 등
  • 프로세스의 트리 (계층 구조) 형성
  • 프로세스는 자원을 필요로 함
    • 운영체제로부터 받는다
    • 부모와 공유한다
    • 원칙적으로 부모와 자식은 자원을 공유하지 않음
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델(일반적)
    • 자식이 부모를 그대로 복사하면 메모리 낭비가 발생한다(같은 것이 2개가 올라가기 때문에). 그래서 특정 운영체제(리눅스 등) 같은 것을 복사할 때에는 바로 카피하지 않고, 공유할 수 있는 건 최대한 공유한다. 그렇게 실행을 하다가 내용이 달라지는 경우 그제서야 부모의 메모리공간의 일부를 카피해서 사용한다.(copy-on-write, COW. write가 발생했을 때 copy를 실행한다)
  • 수행 (Execution)
    • 부모와 자식은 공존하며 수행되는 모델
    • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait, blocked 상태) 모델
  • 주소 공간 (Address space)
    • 자식은 부모의 공간을 복사함(binary and OS data)
      • PCB라던가...
    • 자식은 그 공간에 새로운 프로그램을 올림
  • 유닉스의 예
    • fork() 시스템 콜이 새로운 프로세스를 생성
      • 부모를 그대로 복사(OS data except PID + binary)
      • 주소 공간 할당
    • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
      • 자식 프로세스를 생성하지 않고 exec() 를 실행하면 완전히 새로운 프로그램이 될 수 있음

프로세스 종료 (Process Termination)

  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
    • 자식이 부모에게 output data를 보냄(via wait)
    • 프로세스의 각종 자원들이 운영체제에게 반납됨
  • 부모 프로세스가 자식의 수행을 종료시킴(abort) - 강제종료
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더이상 수행되도록 두지 않는다
      • 단계적인 종료
        • 자손, 자식을 죽이고 부모가 죽음

fork() 시스템 콜

  • 프로세스는 fork() 시스템 콜에 의해 생성된다.
int main() {
    int pid;
    pid = fork();
    if (pid == 0) printf("\n Hello. I am child\n");
    else if (pid > 0) printf("\n Hello. I am parent\n");
}

fork()가 시스템콜을 호출하는 부분이다.

이렇게 되어있다고 생각하면 편한데, 좌측은 부모 프로세스이고 우측은 자식 프로세스이다.

부모 프로세스가 fork를 한 후, fork가 끝나면 그 다음 줄부터 실행을 한다.

자식 프로세스도 부모의 PC를 복사해 가지고 있기 때문에 pid=fork(); 다음줄부터 실행을 한다. 따라서 복사가 되었다고 무한히 재귀적으로 fork가 되는 것은 아니다 !

또한 부모와 자식의 fork()의 리턴값이 다르기 때문에 부모는 pid의 결과값이 양수이고, 자식은 0을 갖기 때문에 부모 프로세스와 자식 프로세스를 구분하여 둘이 다른 일을 실행할 수 있다.

exec() 시스템 콜

  • 프로세스는 exec() 시스템콜을 통해 다른 프로그램을 실행할 수 있다.
  • exec() 시스템 콜은 프로세스를 완전히 다른 프로그램으로 만들어주는 역할을 한다.
int main() {
    int pid;
    pid = fork();
    if (pid == 0) {
    	printf("\n Hello, I am child! Now I'll run date \n");
        execlp("/bin/date", "/bin/date", (char *) 0);
    } else if (pid > 0) {
    	printf("\n Hello, I am parent!\n");
    }
}

여기서 execlp 는 함수인데, 결국 여기서 exec() 시스템콜을 한다. 한번 exec하면 되돌아올 수 없다. 그래서 exec 이후의 코드는 실행이 불가능하다.

여기서 execlp안의 변수는 프로그램 이름을 2번 작성한 후, 넘겨줄 args 들을 차례로 작성하고, 마지막으로 null pointer를 넘긴다.

wait() 시스템 콜

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

exit() 시스템 콜

프로그램의 종료

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

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

  • fork(): 부모 프로세스를 복사하여 자식 프로세스를 생성함
  • exec(): 자식 프로세스를 새로운 프로그램으로 덮어 씌움
  • wait(): 자식 프로세스가 끝날 때까지 기다림
  • exit(): 모든 자원을 반납하고(종료시킴) 부모에게 알림

프로세스 간 협력

독립적 프로세스(Independent process)

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

협력 프로세스(Cooperating process)

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

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

프로세스간 정보를 주고받을 수 있는 방법

  • 메시지를 전달하는 방법
    • message passing: 커널을 통해 메시지 전달
  • 주소 공간을 공유하는 방법
    • shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
    • thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기에는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

Message Passing

Message system

프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 커널을 통해 통신하는 시스템

Direct Communication

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

Indirect Communication

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

 

 

 

본 포스팅은 이화여자대학교 운영체제 수업 정리본입니다.

profile

SY 개발일지

@SY 키키

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!