4강-2. Process Management 2

부모 프로세스의 code, data, stack, pc , 등등을 그대로 복사해서 자식 프로세스를 만듦
원칙적으로는 부모 프로세스와 자식 프로세스는 서로 경쟁하면서 자원을 서로 많이 차지하려고 함.

Copy-on-write(COW)
리눅스나 효율적인 운영체제에서는 일단 자식이 부모의 공간을 공유하고 있다.
그러나 자식이 write가 발생한다면 그때 copy를 한다.( 내용이 수정이 될 때, 부모의 code, data, stack을 카피한다. )
그러나 부모의 모든 걸 copy 하는 게 아니다.
-> 원래 프로세스는 메모리에서 실행될 때, 모든 부분을 메모리 영역에 올려두고 작업하지 않는다. 따라서 잘게 쪼개서 물리적인 메모리에 올린다.
-> 그 쪼개져서 올려진 메모리 부분에서 write가 발생한다면 그 메모리(부모)의 code, data, stack, 등등을 copy 한다.


fork를 하게 되면 부모 프로세스의 문맥을 복제하게 된다. 따라서 부모의 pc register도 copy 하는데, 부모 프로세스가 [ pid = fork(); ]를 실행하게 되면 copy 가 되고 자식 프로세스의 pc register가 가리키는 명령어는 main 함수의 첫 라인이 아니라 fork() 바로 다음줄을 가리키게 된다.
자식 프로세스는 fork가 이루어진 다음 시점부터 실행이 된다.
if(pid == 0) printf("\n Hello, I am child!\n"); . . .
fork()의 리턴값이 자식|부모 프로세스마다 다르다.
따라서 원본 복제본 구분이 가능해진다. ---> 부모 프로세스 | 자식 프로세스에게 서로 다른 일을 시킬 수 있게 된다.

exec() 하게 되면 date라는 프로그램으로 덮어씌어지게 된다. exec를 하게 되면 되돌릴 수 없게 된다.



리눅스 shell
echo hello 3
output -> hello 3
echo라는 프로그램은 뒤에 있는 아규먼트를 그대로 출력해 준다.
execlp를 사용할 때는 프로그램 이름을 2번 써주고 그 프로그램에 전달할 아규먼트를 뒤에 넣어준다.(따옴표[""] 안에 넣어주고 콤마[,]로 구분해 준다. ) 그리고 마무리로 (char*) 0 끝내기




스레드 간의 협력은 프로세스 간의 협력보다 더 수월하다. 서로 같은 주소공간을 공유하기 때문.

메시지(direct, indirect 둘 다)는 커널을 통해서 전달된다.

shared memory를 하려면 초반에 kernel에게 shared memory를 한다는 system call를 해서 mapping을 해야 한다.