프로세스 생성
- 부모 프로세스 문맥을 그대로 복사해서 자식 프로세스 생성
- 생성 방법: 복제 생성
- 복제? 프로세스 문맥을 그대로 복사.
- 메모리 - 주소 공간 내 코드/데이터/스택 복사
- CPU - 프로세스의 어디까지 수행했는가를 가리키는 레지스터인 Program counter도 부모 것을 복사
- 프로세스가 하나 만들어지면? 그때부터는 독립적인 프로세스. 부모와 자식 간에 경쟁하면서 CPU를 빼앗기 위해.
- 자원 공유하는 방식도 있다?
- 자식이 부모 것을 복사해서 메모리에 올리면 메모리에 두 카피가 올라가. ⇒ 비효율.
- 가능한 공유할 수 있는 건 일단 공유해. 비효율적이니까 pc를 복사해서 둘다 똑같은 위치를 가리키고 있다가, 코드/데이터/스택 중에서 뭔가 값이 달라진다거나 함수 호출이 달라지면서 각자 길을 가게 되면 그제서야 부모와 공유하던 메모리 공간을 복사해서 자기 공간으로 만들어.(copy-on-write: cow)
- cow: write(원래 있던 내용을 바꾼다)하기 전까지는 copy하지 않는다. ⇒ write할 상황이 생기면 그제서야 부모의 코드/데이터/스택을 copy한다! 그것도 전부 카피하는 게 아니라 메모리 내에서 잘게 쪼개진 내용(page) 중 필요한 부분만!
- 새로운 프로세스를 만드는 건 fork() 시스템 콜: 운영체제가 만들어줘.
- 일단 복제생성한 다음 exec()으로 새로운 프로그램을 덮어씌워(자식한테)
- 총 2단계! 일단 카피하고 난 다음 새로운 걸 덮어 씌우는.
프로세스 관련 코드 4가지 소개
- fork(): 부모 프로세스를 복제해 자식을 만드는 콜
- exec(): 새 이미지를 덮어씌우는 콜
- wait(): 자식 프로세스가 종료될때까지 부모를 재우는 콜
- exit(): 모든 자원을 해제하는 콜
fork() 시스템 콜
int main() {
int pid;
pid = fork(); // 여기서 새로운 프로세스 만들어달라고 운영체제한테 요청!
if (pid == 0) // 자식 프로세스의 id가 0이다 -> 새로운 프로세스가 만들어졌다는 뜻!
printf("\\n Hello, I am child! \\n");
else if (pid > 0) // process id가 0보다 크면 부모 프로세스
printf("\\n Hello, I'm parent!\\n")
}
- 부모 프로세스: pid > 0
- 자식 프로세스: pid = 0
- 이때, 코드 전체를 자식이 복사해와서 fork 함수 아래부터 시작한다.