프로세스는 어떻게 생성되는가
- 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 |