[개발일지]/필기

Process Management

broship 2021. 8. 12. 21:19

프로세스는 어떻게 생성되는가

- Parent process가 children process를 생성

- 자식 프로세스가 부모 프로세스를 복제 하면서 탄생함

- 부모의 code, data, stack을 모두 복제해서 그대로 만듬

- 부모가 어디까지 실행했는지 PC도 복제해서 생성

 

- 자식 프로세스가 생성되는 순간 독립적인 프로세스가 되기 때문에 부모 프로세스와 자원을 공유하기 보다는 공유하지 않고 경쟁함

 

fork() : 시스템 콜이 새로운 프로세스를 생성

- 부모를 그대로 복사 (OS data except PID + binary)

- 주소 공간 할당

exec() : 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

- 부모와 똑같이 가지 않고 다른 프로세스를 만들때 사용

- 기존에 있는거 그대로 만드는게 쉬우니까 일단 복제 생성 후 그 다음 필요한 내용만 덮어 씌움

 

fork() 시스템 콜

- fork() 함수가 호출되면서 새로운 프로세스가 생성됨

- 이런식으로 왼쪽 main이 실행되다가 fork()를 만나면 새로운 프로세스(오른쪽)를 생성

- 자식 프로세스는 main함수의 시작부분부터 실행되는게 아니라 자기가 만들어진 시점인 fork() 다음부터 실행됨

- 자식이 부모의 PC까지 가져오기 떄문

- 자식 프로세스가 종료 후 부모 프로세스가 다시 fork() 밑에서부터 수행

 

- 부모는 fork()의 결과값이 양수(>0)가 나옴

- 자식은 fork()의 결과값이 0이 나옴

- 이걸로 부모, 자식을 판단하여 자식을 부모와 다른 부분이 실행되게끔 만들 수 있음

 

exec() 시스템콜

- fork()만 사용시 모든 프로세스가 동일한 흐름을 가짐

- exec()로 새로운 프름을 만들 수있음

- execlp()가 실행되는 순간 그 이전것들은 다 잊어버리고 새로운 프로그램이 실행됨

- 여기서는 /bin/date가 실행, 이때는 main 함수의 시작부분부터 실행되게 됨

- 한번 exec()가 실행되면 다시는 부모 코드로 돌아올수 없음

- 꼭 fork()가 있고 exec()가 있어야 하는건 아님, fork()가 없어도 다른 프로그램으로 덮어씌우고 싶을때 exec() 사용하면 됨

- exec() 뒤에 있는 코드들은 절대 실행되지 않음

 

wait() 시스템 콜

- 프로세스를 블록 상태로 만드는 시스템 콜

- 블록 상태는 무언가를 기다리는 상태, wait()의 경우 보통 자식 프로세스를 만든 다음에 호출됨, 부모가 자식 프로세스를 끝날때까지 기다릴 때 사용됨

- 자식 프로세스가 끝나면 커널이 부모 프로세스를 깨움

- 위에 코드는 부모가 자식 프로세스가 끝날때까지 기다리는 코드

- 자식이 생성되면 부모와 경쟁하는 프로세스가 있고, wait()를 사용하면 부모가 자식이 끝날때까지 기다렸다가 수행됨

 

- 리눅스에서 어떤 명령어를 입력하면 해당 프로그램이 실행되는 동안 명령어 창에 깜빡거리는게 사라짐(쉘 프롬프트), 그게 wait()를 이용해 부모 프로세스가 자식 프로세스를 끝날때까지 기다리는 형태

 

 

exit() 시스템 콜

- 프로세스를 종료시킬때 사용되는 시스템콜

 

프로세스와 관련된 시스템콜 4가지

 

 

프로세스간 협력

- 독립적 프로세스: 모든 프로세스끼리는 경쟁관계이기 때문에 원칙적으로는 서로 다른 프로세스의 수행에 영향을 미치지 못함

- 협력 프로세스: 가끔은 다른 프로세스에 영향을 미치는게 효율성이 더 좋을때가 있음, 협력 매커니즘을 통해 가능해짐

 

- 협력 메커니즘(IPC: Interprocess Communication):

1) 메시지를 전달하는 방법

message passing: 원칙적으로는 프로세스끼리 메시지를 전달할 수 없음, 커널을 통해 메시지 전달

- 원칙적으로는 프로세스 사이에 공유 변수가 있으면 안되기에 다른 방식으로 통신

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

- Indirect Communication: mailbox 또는 port를 통해 메시지 간접 전달, 이 경우 꼭 Q가 아닌 다른 프로세스가 받을수도 있음)

 

2) 주소 공간을 공유하는 방법

shared memory: 원칙을 무시하고 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘

- A가 겹치는 공간에 어떤 데이터를 넣으면 B도 즉시 그 데이터를 볼수 있음

- 이것도 바로 공유가 가능한게 아니라 커널에 시스템 콜을 하면 그때 shared memory가 매핑이 되고 그 후부터 사용 가능

- shared memory는 신중히 사용해야함, 사용하려면 두 프로세스가 서로 신뢰가 가능한 상황이여야함

 

- 스레드의 경우 다른 프로세스는 아니지만 완전히 같은 메모리 공간을 공유하므로 shared memory의 일종이라고 볼수 있음

'[개발일지] > 필기' 카테고리의 다른 글

CPU Scheduling Algorithms  (0) 2021.08.16
CPU Scheduling  (0) 2021.08.15
Process2 - 스레드  (0) 2021.08.10
Process1  (0) 2021.08.03
System Structure & Program Execution 2  (0) 2021.07.28