본문 바로가기

운영체제/프로세스(process)

운영체제 - 프로세스(process)의 생성과 종료

운영체제 - 프로세스(process)의 생성과 종료


# 프로세스의 생성

- 파일 시스템에 존재하는 .exe 파일을 실행.

- 운영체제는 해당 .exe파일의 path정보를 획득함.


프로세스는 memory context로써 Code segment, Data Segment, Stack Segment, Heap Segment를 운영체제에 의해 할당받는다.

또한, Stack영역에는 context-switching을 위한 fake stack이 생성된다.

생성된 프로세스에 해당하는 PCB(Process Control Block)을 생성하고 Ready Queue에 push한다.


프로세스를 생성할땐 위 절차를 handcraft할 수 도 있지만 UNIX계열 운영체제에서는 초기 프로세스(pid : 0)을 제외한 프로세스들은 handcraft방식이 아닌 fork(), exec()를 이용한 clone방식으로 생성한다.


parent process에서 fork()를 호출하면 모든 process context가 동일한 child process가 생성된다.


* zombie state

- exit()를 마치고 parent process가 자신의 exit status를 읽어가기를 기다리는 process의 상태



fork()에 의한 프로세스의 생성은 위와 같다.

fork()를 호출하게 되면 위 코드를 똑같이 가진 child process가 생성된다.

단, parent process에서 fork()의 반환값은 양수의 pid 이지만

child process에서의 fork()의 반환값은 0이다. ( 운영체제의 fork() system call의 내부동작에 의함 )

따라서, child process는 if(pid==0) flow를 타게 되고 exec()를 호출함으로써 새로운 내용의 process context를 대입할 수 있다.

parent process는 child process의 상태 종료 여부를 확인하고 싶을 때 선택적으로 wait()을 호출할 수 있다.



# 왜 fork()를 통해 프로세스를 생성하게 된 것일까?

1
2
3
4
5
6
7
8
9
10
11
12
13
int fd;
void foo()
{
    fd = open("pipe");
    if (fork() == 0)
    {
        read(fd, ...);
    }
    else
    {
        write(fd, ...);
    }
}
cs

과거에 process-A와 process-B간의 데이터 공유를 어떻게 해야할지 고민에 대한 답으로 탄생하게 되었다.

process-A에서 process-B로 데이터를 전달을 파일(file)을 사용하여 전달하고 싶은데 file path를 공유해야만이 file을 공유할 수 있다.

따라서, 위와 같은 fork()를 이용한 부모/자식간의 file path 공유방법으로 서로 다른 프로세스간의 데이터 통신을 구현했다.



# 프로세스의 종료

- exit() // 정상종료

- abort() // 부모 프로세스에 의한 강제종료

p.s.

Shell(CLI, command line interpreter)

- 사용자가 입력한 명령어를 입력으로 받아들여 새로운 프로세스를 수행시키는 프로그램.


CoW(Copy on Write)

- process context를 fork()시점에 복사하지 않고, Data Segment에 새 값이 쓰여질 때 복사하는 기법