운영체제 - 프로세스(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에 새 값이 쓰여질 때 복사하는 기법
'운영체제 > 프로세스(process)' 카테고리의 다른 글
운영체제 - 멀티 쓰레드(Multi-Thread) (0) | 2019.03.11 |
---|---|
운영체제 - Context-switching (0) | 2019.03.10 |
운영체제 - 프로세스 스케쥴링(process scheduling) (0) | 2019.03.09 |
운영체제 - 프로세스 상태 전이(Process State Transition), PCB(process control block) (0) | 2019.03.09 |
운영체제 - 프로세스(process)란? (0) | 2019.03.09 |