Process Management
프로세스가 어떻게생기는가?
프로세스는 부모 프로세스가 자식 프로세스를 복제 생성하면서 생긴다.
즉 부모가 자식을 생성하는 형태이므로 => 트리형태로 형성된다.
프로세스는 자원을 필요로한다. 이걸 운영체제로 부터 받고, 부모와 공유를 할 수도 안할 수도 있다.
이게 무슨말이냐면, Copy-on-Write(COW)이다.
부모가 자식프로세스를 만들면 부모와 완전히 동일하게 된다. 심지어 운영체제가 부모의 context까지 => code data stack까지 완전히 동일하게 카피해서 주는데(자원을 주는거임) 결국 자식이 부모를 복사하게 되는데 write를 만나기 전까지는 부모와 동일하므로,
write 이전에는 code,data,stack을 공유하면서 쓰다가, write를 만나면, 그제서야
부모의 code,data,stack을 복사해서 새롭게 만든다는 것이다.
이렇게하면 자원의 낭비가 줄어든다.
그런데 이전에 물리적메모리에는 모든 code가 올라가지 않는다고했다. 왜냐하면 아직 실행안될부분인데 전부올리는게 아니라, 필요한부분만 가져와서 올리고 나머지는 disk의 swap area에 올라간다했는데
write하는부분이 이제 바뀌어야하면 그때 copy해서 부모와 공유하지않는 형태를 취한다.
실행
부모와 자식이 공존하면서 수행할수도 있고
자식이 종료될때 까지 기다렸다가(blocked) 부모가 실행하는경우도 있다.
프로세스의 생성
부모 프로세스의 주소공간이 있고, 자식이 이걸 복사하게 된다.
운영체제에 있는 데이터들, pcb라던지 자원도 싹 다 복사하게 된다.
그리고 일단 복제를 해놓고 이걸 덮어 쓸수있다.
그래서 프로세스의 생성은 2가지 단계로 이루어지는데
이런식으로 수행된다.
예시를 들면, 우리도 과제를할때 항상 템플릿을 새롭게 만드는것이 아니고 이전의 과제 템플릿을 먼저 가져오고
그다음에 제목을 바꾸고, 내용을 바꾸는 형식과 비슷하다.
프로세스의 종료
자발적으로 프로세스를 종료하고 싶을때는 프로세스가 exit라는 시스템콜을 하면 종료가 된다.
종료가 될때는 자식이 부모에게 output-data를 보낸다.
또한 프로세스의 각종 자원들이 운영체제에게 반납된다.
비자발적으로 프로세스를 종료할때는 abort를 수행한다.
fork
fork가 실행되면 자식프로세스를 실행하고 그 다음 시점부터 실행된다.
왜그럴까?=>대답을 먼저 해보자
바로 자식프로세스가 생성될때 부모를 copy한다고 앞에서 말했다 여기서는 부모 프로세스의 context도 같이 복사하는데 여기 programcounter라던지 이런것도 복사하게 된다. 프로세스를 복사할때 프로세스에 해당하는 일종의 레지스터인 programcounter도 복사한다.
그러니까 자식이 만들어지면 처음부터 읽는것이 아닌 그 다음줄인 if문을 수행하게 된다.
부모가 fork한경우 자식은 id가 0이고 부모는 양수다.
exec
exelp => 일종의 exec 시스템콜을 하는 함수 그럼 파라미터로 전달된 것의 main으로부터 다시 실행을 한다.
그러면 date라는 프로그램으로 덮어쓰는 형식이 된다.
그런데 항상 exec이 자식을 fork시키고 해야하는것은 아니다.
하지만 execlp 뒤에있는 코드는 실행불가하다 왤까?
이렇게 되면 execlp의 파라미터에 있는 파일의 main함수부터 시작하게 된다.
그렇게되면 이전으로 돌아오지 못한다.
그래서
int main(){
printf("start exece");
exelp("실행file");
printf("hello");
}
이러면 exelp의 실행 file의 main함수가 실행되괴
다시 여기 main함수로 돌아오지 못할것이다. 그러니까 exelp밑의 printf인
hello가 출력되지 않을 것이다.
wait
해당 프로세스를 blocked 상태로 바꾸는것이다.
보통 자식 프로세스를 만든뒤에 부모 프로세스가 wait 시스템 콜을 한다.
언제까지? 자식 프로세스가 종료 될때 까지,
만약 종료가 되면 다시 blocked에서 ready상태로 바뀐다.
exit
자발적 종료
마지막 문장 실행후 exit 시스템 콜
프로그램에 명시적으로 적지 않더라도, main함수가 return 되는 위치에 컴파일러가 넣어준다.
비자발적 종료
부모 프로세스가 자식 프로세스를 강제종료 시킨다.
자식 프로세스가 한계치를 넘어서는 자원을 요청시키거나
자식에게 더이상 부여할 테스크가 없다던가
사람이 직접 ctrl + C같은걸로 강제 종료를 시키거나
부모가 종료하는경우 자식을 싹다 죽이는 대참사가 일어난 뒤에 부모가 죽는다.
프로세스간 협력
독립적 프로세스 -> 하나의 프로세스가 다른 프로세스의 수행에 영향을 미치지 못함
협력 프로세스 -> 하나의 프로세스가 다른 프로세스의 수행에 영향을 미침
IPC(프로세스간 협력 메커니즘)
원칙적으로 하나의 프로세스는 자신의 주소공간에서만 수행이 가능하다. code,data,stack에서만, 그러므로 프로세스간에 어떠한 공유변수 없이 통신하는 시스템
고로 운영체제 커널을 통해서 전달해야한다.
Direct Communication
그림에서는 P가 목적지인 Q와 내용인 message를 적고, process Q로 보내는거 같지만,
이건 목적지를 적어줘서 이런식으로 표현했을 뿐이고, 커널을 통해서 간다.
Indirect Communication
mailBox에다가 메시지를 넣고 mailBox를 꺼내볼 수 있는 대상이 전부 메일박스에서 꺼내서본다.
그림에서와 같이 processA와 processB 둘다 각자 독립적이 주소공간인 code,data,stack이 있지만, 이게 물리적인 메모리에 매핑될때 일부 영역을 공유하도록 매핑을 하는것이다.
그러면, processA가 공유되는 메모리에 무언갈 적으면, processB도 해당하는 메모리 영역 내에 있으므로 이제 바로 볼 수 있다.
참고)
주소공간을 공유하는 예시중 하나가 thread이다.
지금 여기서는 프로세스간 공유이므로 thread가 여기에 해당하지는 않는다.
왜냐하면 쓰레드는 하나의 프로세스에 cpu 수행단위가 여러개 있는것이므로, 프로세스간 협력은 아닌데, 하나의 프로세스안에서 주소공간 자체를 공유하기 때문에 thread끼리의 협력이 매우 쉽다.