🧭 CS Study - 운영체제
🚩 주제 : 프로세스 관리(Process Management)
🎥 강의 : KOCW 운영체제 강의 - 이화여자대학교 반효경 교수님
부모 프로세스(Parent Process)는 자식 프로세스를 생성한다. 보통의 경우, 자식 프로세스는 부모 프로세스 복제 생성을 통해 탄생한다. 부모 프로세스의 Program Counter값, code, data, stack 등을 복제한다.
한 부모 프로세스는 자식 프로세스를 여러개 만들 수 있다. 그러므로 자식 프로세스와 부모 프로세스는 트리 구조를 이루게 된다.
프로세스는 생성할 때 자원을 필요로 하는데 이는 운영체제로부터 할당받는다. 자식 프로세스는 자원을 부모와 공유할 수도 있고 그렇지 않을 수도 있다.
자식 프로세스가 생성될 때는 부모 프로세스의 주소공간을 복사해서 생성한다. 부모의 자원 데이터도 일단 복사한다. 그 뒤에 복제된 공간에는 새로운 프로그램을 올린다. fork() 시스템콜은 이러한 역할을 하는 시스템콜이다.
자식 프로세스가 종료될 때는 자식 프로세스가 부모 프로세스에게 데이터를 보내어 종료한다. 보통의 경우 자식 프로세스가 죽은 뒤에 부모 프로세스가 죽는다.
자식 프로세스가 부모 프로세스의 주소공간을 복제하니까 메모리에는 복제된 내용이 올라간다. 이는 자원이 낭비되는 것이다.(같은 값의 데이터가 메모리에 올라가니까..) 그래서 리눅스에서는 일단 자식 프로세스와 부모 프로세스가 공유할 수 있는 자원은 공유한다. 그 뒤에 자원의 값이 서로 달라져야할 때 메모리 공간 일부를 카피해서 자식 프로세스가 그 자원을 온전히 갖게 된다.
이를 Copy-on-wirte(COW)라고 한다. 이는 Wirte가 발생했을 때 Copy하겠다! 는 의미이다. COW의 규칙은 일단 복제해두고 새로운게 wirte되면 덮어 씌우는 것이다.
fork()
가 마지막으로 실행된 부분임을 알기 때문에(Program Counter를 자식 프로세스가 복제하기 때문에) 그 아래의 코드부터 실행한다.(다시 위에서 부터 실행하지 않음)fork()
결과 값으로 0을 얻고 부모 프로세스는 fork()
결과 값으로 자식 프로세스의 pid를 얻는다. 그 점을 이용하여 자식 프로세스와 부모 프로세스가 다른일을 하도록 코드를 작성 할 수 있다.exit()
시스템콜을 실행한다.** 비자발적인 종료
: 부모 프로세스가 자식 프로세스를 강제로 종료시킬 때
: 키보드로 kill, break를 입력한 경우
: 부모 프로세스가 종료되는 경우(부모 프로세스가 종료되어야 할 때는 부모프로세스가 종료되기 이전에 자식 프로세스들이 먼저 종료된다.)
프로세스의 동작 방식은 아래와 같이 나눌 수 있다.
message passing
shared memory
**thread는 이미 주소공간을 공유하기 때문에 협력이 편리하다.