Process Management

2019. 7. 26. 00:14운영체제

http://www.kocw.net/home/search/kemView.do?kemId=1046323 

KOCW 반효경 교수님의 운영 체제 강의를 수강하면서 작성한 포스트입니다. 😁

프로세스 생성

프로세스는 부모 프로세스가 자식 프로세스를 생성합니다. 따라서 트리의 계층 구조가 형성되게 됩니다. 

자식 프로세스는 부모 프로세스의 주소 공간(address space)를 복사하고, 그 공간에 새로운 프로그램을 올립니다. 이 때, copy-on-write 기법이 사용되게 됩니다. 새로운 프로세스를 만들어내는 것은 복잡한 일입니다. 그렇기 때문에 부모 프로세스는 시스템 콜을 통해 운영체제에게 자식 프로세스를 만들어달라고 요청하게 됩니다.

 

유닉스의 예를 보면, fork() 시스템 콜이 새로운 프로세스를 생성하게 됩니다. 이는 부모 프로세스를 그대로 복사해서 주소 공간을 할당하는 역할을 수행합니다. 이어지는 exec() 시스템 콜을 통해서 새로운 프로그램을 메모리에 올리게 됩니다. 

 

프로세스 종료

프로세스가 마지막 명령을 수행한 후 운영체제에게 exit() 시스템 콜을 통해서 알려줍니다. 이렇게 프로그램이 종료될 땐 자식 프로세스가 부모 프로세스에게 wait() 시스템 콜을 통해서 output data를 보냅니다. 

비자발적으로 프로세스가 종료되는 경우도 있습니다. 부모 프로세스가 자식 프로세스의 수행을 종료시키는 경우입니다. 이 경우는 abort() 시스템 콜을 사용하게 됩니다. 부모 프로세스는 자식 프로세스가 할당 자원의 한계치를 넘어섰을 때, 자식 프로세스에게 할당 된 태스크가 더 이상 필요하지 않을 때 자식 프로세스를 종료시킵니다. 

부모 프로세스가 종료되는 경우에는 자식 프로세스들을 모두 종료시킨 후, 부모 프로세스가 종료됩니다. 

 

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

* fork(): create a child (copy)

* exec(): overlay new image

* wait(): sleep until child is done

* exit(): frees all the resources, notify parent 

 

fork() 시스템 콜

int main()
{
    int pid;
    pid = fork();
    if (pid == 0) /* this is child */
    	printf("\n Hello, I am child!\n");
    else if (pid > 0) /* this is parent */
    	printf("\n Hello, I am parent!\n");
}

fork()를 하게 되면 부모 프로세스의 Program Counter까지 같이 복사되기 때문에, 자식 프로세스가 생성되면 main 함수의 시작부터 실행되지 않고 pid = fork(); 이후를 실행하게 됩니다. 

 

exec() 시스템 콜

int main()
{
    int pid;
    pid = fork();
    if (pid == 0) { /* this is child */
    	printf("\n Hello, I am child! Now I'll run date \n");
        execlp("/bin/date", "/bin/date", (char *) 0);
    } 
    else if (pid > 0) /* this is parent */
    	printf("\n Hello, I am parent!\n");
}

만약 exec() 이후에 코드가 있다면, 그 부분은 영원히 실행되지 않습니다. exec() 이후 해당 프로세스는 기존의 프로그램과는 다른 프로그램을 실행시키기 때문입니다. 

 

wait() 시스템 콜

wait() 시스템 콜은 프로세스를 잠들게 하는 것입니다. 프로세스 A가 wait() 시스템 콜을 호출하면, 커널은 자식 프로세스가 종료되기를 기다리며 프로세스 A를 blocked 상태로 만들고, 자식 프로세스가 종료되면 프로세스 A를 깨웁니다. 이 때, 프로세스 A는 ready 상태가 됩니다. 

 

exit() 시스템 콜

프로그램이 자발적으로 종료될 때 보통 실행이 됩니다. 마지막 statement 수행 후 exit() 시스템 콜을 통해 종료 되거나, 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줍니다.

부모 프로세스가 자식 프로세스를 강제 종료시킬 때, 키보드로 kill, break 등을 입력한 경우, 부모 프로세스가 종료되는 경우 프로그램은 비자발적으로 종료되게 됩니다. 

 

프로세스 간 협력

독립적 프로세스 (Independent process)

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

 

협력 프로세스 (Cooperating process)

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

 

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

* 메시지를 전달하는 방법 (message passing): 커널을 통해 메시지를 전달

* 주소 공간을 공유하는 방법 (shared memory): 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘

 

# thread는 하나의 프로세스 안에 CPU의 수행 단위가 여러 개 있는 것입니다. 그렇기 때문에 IPC는 아닙니다. 하지만 thread끼리는 주소 공간 자체를 공유하고 있기 때문에 협력이 쉽습니다. 

Message Passing

* Message system: 프로세스 사이에 공유 변수(shared variable)을 하나도 사용하지 않고 통신하는 시스템입니다. 메시지를 전달하려면 운영체제의 커널을 이용해야 합니다. 

 

Message passing은 통신하려는 프로세스의 이름을 직접적으로 표시하는지 여부에 따라서 Direct Communication과 Indirect Communication으로 나뉩니다.

 

* Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시

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

'운영체제' 카테고리의 다른 글

Process Synchronization  (0) 2019.08.05
CPU Scheduling  (1) 2019.07.26
Process  (0) 2019.07.24
System Structure & Program Execution  (0) 2019.07.24
Introduction to Operating Systems  (0) 2019.04.16