부모 프로세스가 자식 프로세스를 생성한다.
- 복제 생성
- 여기서 복제는 프로세스의 문맥을 모두 복사하는 것(코드/데이터/스택을 그대로 복사)해서 자식을 만들고 PC레지스터도 그대로 복사
프로세스는 자원을 필요로 함
- 운영체제로부터 받는다
- 부모와 공유한다
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
→ 메모리를 복사하면 어떻게보면 메모리를 낭비하는 것. 똑같은 내용을 하면 낭비할 필요가 없기 때문에 일단 카피하지 않고 부모의 주소 공간을 공유하는 경우가 있다.(리눅스와 같이 보다 효율적으로 운영하는 경우)
- 내용이 바뀌는 write가 발생해서 내용이 수정되면 그 때 카피를 한다. 잘게 쪼개진 부분 중에 변경이 발생되는 부분만 카피를 한다
- 원칙은 독립적인 프로세스이기 때문에 독립적인 공간을 갖는다
- 그대로 복사해서 주소공간을 할당
- 실행을 하다가 fork가 호출되면 새로운 프로세스가 실행되고 다른곳에서 똑같은 코드블럭이 시작됨
- 자식 프로세스의 코드블럭은 fork된 시점부터 다시 시작한다. 그대로 카피가 되기 때문에 복제본이 원본인척 하면 혼란스러워지는 상황이 일어날 수 있다
- 흐름도 같을 수 있다
→ 이런 문제를 방지하기 위해 운체에서는 부모와 자식을 구분한다
부모와 자식은 fork의 결과값이 다르다. 부모는 음수 자식은 0
- 덮어쓰기를 한다.
- 새로운프로그램으로 완전히 덮어씌움
- 반드시 자식을 만들어서 해야하는 것이 아니기 때문에 부모프로세스에서 할 수도 있음
- 함수호출시 프로그램 이름 두번 적어주고 덮어쓸 내용 적는 방식으로 코딩
- 일단 복제생성을 한 다음에 필요할 경우에 덮어씌움
- 커널은 자식이 종료될 때까지 프로세스를 sleep시킨다(block)
- 자식이 종료되면 커널은 프로세스 A를 꺠운다(ready)
- 독립적인 프로세스
- 프로세스는 각자의 주소공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스 수행에 영향을 미치지 못함
- 협력 프로세스
- 프로세스 협력 메커니즘을 통해 다른 프로세스의 수행에 영향을 미칠 수 있음
- message passing: 커널을 통해 메세지 전달
- 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신하는 시스템
- 다이렉트 커뮤니케이션: 프로세스의 이름을 명시적으로 표시
- 인다이렉트 커뮤티케이션: 메일박스 또는 포트를 통해 메시지를 간접 전달
- shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 공유메모리 메커니즘이 있음
exit이라는 키워드 프로세스가 마지막 명령을 수행한 후 운영체제에세 이를 알려줌
- 자식이 부모에게 outpou data를 보냄(via wait)
- 프로세스의 각종 자원들이 운영체제에게 반납됨
부모 프로세스가 자식의 수행을 종료시킴(abort)
- 강제종료
- 자식이 할당 자원의 한계치를 넣어섬
- 자식에게 할당된 테스크가 더이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더이상 수행되도록 두지 않는다
- 단계적인 종료(자식의자식의자식부터...)