cs/운영체제

4강-2. Process Management 2

Tomato_Coffee 2023. 11. 3. 20:29

프로세스 복제

부모 프로세스의 code, data, stack, pc , 등등을 그대로 복사해서 자식 프로세스를 만듦

원칙적으로는 부모 프로세스와 자식 프로세스는 서로 경쟁하면서 자원을 서로 많이 차지하려고 함.

Copy-on-write(COW)

리눅스나 효율적인 운영체제에서는 일단 자식이 부모의 공간을 공유하고 있다. 

그러나 자식이 write가 발생한다면 그때 copy를 한다.( 내용이 수정이 될 때,  부모의 code, data, stack을 카피한다. )

그러나 부모의 모든 걸 copy 하는 게 아니다.

-> 원래 프로세스는 메모리에서 실행될 때, 모든 부분을 메모리 영역에 올려두고 작업하지 않는다. 따라서 잘게 쪼개서 물리적인 메모리에 올린다. 

-> 그 쪼개져서 올려진 메모리 부분에서 write가 발생한다면 그 메모리(부모)의 code, data, stack, 등등을 copy 한다.

 


프로세스 만들기  c언어

fork를 하게 되면 부모 프로세스의 문맥을 복제하게 된다. 따라서 부모의 pc register도 copy 하는데, 부모 프로세스가 [ pid = fork(); ]를 실행하게 되면 copy 가 되고 자식 프로세스의 pc register가 가리키는 명령어는 main 함수의 첫 라인이 아니라 fork() 바로 다음줄을 가리키게 된다.

자식 프로세스는 fork가 이루어진 다음 시점부터 실행이 된다.
if(pid == 0)​
	printf("\n Hello, I am child!\n");
.
.
.

fork()의 리턴값이 자식|부모 프로세스마다 다르다.

따라서 원본 복제본 구분이 가능해진다. ---> 부모 프로세스 | 자식 프로세스에게 서로 다른 일을 시킬 수 있게 된다.


exec() 예시

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

 

이렇게 하면 exec 이후 코드는 실행이 안된다. 덮어씌어지기 때문
echo 는 c언어에서 printf 함수라고 보면됨. 1 출력후 3 출력한다음 종료됨.

리눅스 shell
echo hello 3
output -> hello 3

echo라는 프로그램은 뒤에 있는 아규먼트를 그대로 출력해 준다.

execlp를 사용할 때는 프로그램 이름을 2번 써주고 그 프로그램에 전달할 아규먼트를 뒤에 넣어준다.(따옴표[""] 안에 넣어주고 콤마[,]로 구분해 준다. ) 그리고 마무리로 (char*) 0 끝내기


자식 프로세스가 종료될 때까지 부모 프로세스가 기다려줌.



프로세스간 협력

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

 

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

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