본문 바로가기

OS

프로세스 생명주기

http://www.kocw.or.kr/home/cview.do?mty=p&kemId=1046323

해당 강의를 보고 개인적으로 정리를 하는 포스팅 입니다.

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net


프로세스의 생성

부모 프로세스가 자신을 복제. 여기서 복제란 자신의 Context (코드, 데이터, 스택, pc register 값 등) 을 복제하는 것을 뜻한다.

복제하여 그 공간에다 새로운 것으로 덮어쓰는 방식으로 프로세스를 생성함.

그렇게 생성된 프로세스는 트리구조를 형성하며, 각각 운영체제로부터, 부모로부터 자원을 할당 받는다.

 

더보기

CopyOnWrite (COW) 기법

포스팅에서 말했듯, 원칙적으로는 부모가 자신을 복제하며 자식을 생성하고, 각각 독립적인 자원을 할당해주는게 맞지만,

자원 활용의 측면에서 프로세스의 분기가 필요한 시점에서 자원을 할당해주는 편이 효과적이다.

그래서 Unix 계열의 운영체제나 현대의 운영체제에서는 자원을 공유하고 있다가, Write 가 발생하는 시점에서 달라지는 부분만을 카피하여 독립적으로 생성하는 기법을 뜻한다.

 

자원의 공유

  • 부모와 자식이 모든 자원을 공유하는 모델
  • 일부만 공유하는 모델
  • 전혀 공유하지 않고 독립적으로 존재하는 모델  -> 일반적임

 

프로세스의 수행

2가지 모델이 있다.

  • 부모와 자식이 공존하며 수행
  • 자식이 종료될때까지 부모가 (blocked) 상태로 기다리는 모델

*Blocked 란 CPU 점유권을 잃고 제어권 없이 대기하는 상태를 말한다.

 

자식은 부모의 공간을 복사하고, 그 공간에 새로운 프로그램을 올린다

유닉스로 예를 들자면, fork() 시스템 콜이 새로운 프로세스를 생성하여 부모를 그대로 복사하고(pid 를 제외한 context + binary)

주소공간을 할당한다. fork() 다음 이어지는 exec() 시스템 콜을 통해 새 프로그램을 해당 주소공간의 메모리에 올린다.

 

프로세스의 종료

프로세스가 마지막 명령을 수행한 후 exit() 이라는 시스템 콜을 통하여 운영체제에게 종료를 알린다.

일반적으로 코드들은 따로 명시하지 않아도 컴파일러가 컴파일 타임에 main 메서드 종료시점에 exit() 시스템콜을 끼워놓는다.

 

자식 프로세스는 다음과 같은 상황에 종료된다.

  • 부모 프로세스가 자식의 수행을 종료시키는 경우 (abort) 
    • 자식이 할당 자원의 한계치를 넘어 설 때
    • 자식에게 할당된 태스크가 더 이상 필요하지 않을 때
  • 부모가 종료되는 경우, 실행중인 자식은 트리의 최 하단부터 순차적으로 종료된다. 

 

 

프로세스의 생명주기 관련 시스템 콜

 

fork()

int main()
{
    int pid;
    pid = fork();
    if (pid == 0) 
    	printf("\n I'm children"); /* 자식 프로세스에서 수행될 코드 */
    else if (pid > 0) 
    	printf("\n I'm parent");  /* 부모 프로세스에서 수행될 코드 */
}

 

프로세스에서 자신을 복사하여 자식프로세스를 생헝한다.

문맥이 복사되었기떄문에 (pcb 값) 자식 프로세스는 fork() 이후부터 수행되며,

fork() 의 결과 값으로 부모는 자식의 pid 를자식은 0을 리턴받는다. 리턴 값으로 분기하여 동작을 분리한다.

 

 

exec()

int main() {
  int pid;
  pid = fork();
  if (pid == 0)
  	execlp("bin/date", "/bin/date", (char *) 0); /* 자식 프로세스는 date 라는 프로세스로 변경된다. */
  else if (pid > 0)
    printf("\n I'm parent");
}

exec() 시스템 콜은 프로세스를 완전히 새로운 프로세스로 변경시킨다.

기존의 코드, 데이터가 완전히 새로운것으로 변경되고 새 프로그램의 시작부분부터 시작한다.

 

 

wait() 

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

커널은 자식이 종료될 때 까지 프로세스 A가 가지고 있던 CPU 제어권을 빼앗고 sleep 시킨다 (Blocked)

자식 프로세스가 종료되면 커널은 프로세스 A 를 깨운다.

 

exit()

프로세스를 종료시키는 시스템 콜이다. 

프로세스의 종료는 2가지로 나뉜다.

 

  • 자발적 종료: 마지막 statement 를 수행 후, exit() 시스템 콜을 통해 종료
  • 비자발적 종료: 부모프로세스가 자식프로세스를 죽이거나, 사람의 입력을 통해 강재종료 되거나, 부모가 종료되는 상황

 

프로세스 간의 협력

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

하지만 프로세스간 협력 매커니즘을 통하여 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.

 

프로세스간 협력 매커니즘 (IPC interprocess communication)

 

 

  • 메시지 전달 (message passing) : 커널을 통하여 메시지를 전달하여 협력하는 방법. 공유변수를 일체 사용하지 않는다.
    프로세스의 이름을 명시적으로 표시하는 직접적인 방법과 mailbox 혹은 port 를 통하여 메시지를 전달하는 간접적인 방법이 있다.
  • Shared memory: 서로 다른 프로세스 간에도 일부 주소공간을 공유하는 매커니즘이다. 커널에 시스템 콜로 주소공간을 공유하겠다는 것을 알리고, 일부 주소 공간을 공유한다. 공유 한 후에는 커널과는 상관없이 독립적으로 협력한다.

 

 

'OS' 카테고리의 다른 글

Process Synchronization - Race Condition, 임계구역 문제와 Semaphore  (0) 2022.03.27
CPU Scheduling  (0) 2022.03.26
Thread 쓰레드  (0) 2022.02.27
Process  (0) 2022.02.23
System Structure & Program Execution  (0) 2022.02.05