부모 프로세스가 자식 프로세스를 복제생성한다. 문맥(주소공간, program counter)을 모두 복제해 생성한다.
(효율적인 OS에서는 일단 copy하지 않고, 자식이 부모의 주소공간을 공유하다가 내용이 달라져야할 때, 일부를 copy. 즉, (내용을 바꾸는)write가 발생했을 때, copy를 하겠다 : COW)
프로세스의 트리 (계층구조) 형성 (자식을 여럿 생성, 자식이 자식을 생성..)
프로세스는 자원(CPU, memory)을 필요로 함
자원의 공유(보다는 경쟁) - 프로세스가 만들어지면 독립적인 프로세스가 됨
수행
부모 프로세스는 어떻게 자식을 생성할까?
프로세스 생성을 OS에게 부탁해 시스템 콜을 통해 자식을 생성한다.
주소공간 (Address Space)
: 자식은 부모의 공간을 복사(binary and OS data)한 뒤, 자식은 그 공간에 새 프로그램을 올린다.
유닉스의 예
: 프로세스의 세상에서는 자식이 부모보다 먼저 죽어야한다.
프로세스의 생성부터 종료까지 관리하는 시스템 콜 종류에 대해 알아보자.
: fork( ) 시스템 콜에 의해 프로세스가 생성된다. (caller에 의해 복제된 새 주소공간 생성)
// 부모 프로세스
int main()
{ int pid;
printf('\n Hello!\n');
pid = fork(); // 자식 프로세스 생성됨 (context복제됨)
if (pid == 0) // 자식일 때 // 여기서부터 자식 프로세스가 실행됨
printf('\n Hello, I am child!\n');
else if (pid > 0) // 부모일 때
printf('\n Hello, I am parent!\n');
}
자식 프로세스는 fork( ) 함수 이후부터 실행.
자식 프로세스의 결과=> Hello, I am child!
부모 프로세스의 결과=> Hello!
Hello, I am parent!
: 프로세스는 exec( ) 시스템 콜에 의해 다른 프로그램을 수행할 수 있다. 완전 새로운 프로그램(갓난아기)으로 덮어 씌워짐. 한 번 exec 하면 되돌아와 다음 함수를 실행할 수 없다. (exec 이후의 코드는 영원히 실행 불가)
(자식과 경쟁하지 않는 모델에서 사용됨)
: 프로세스 A가 wait( ) 시스템 콜을 호출하면, (보통 자식 프로세스를 만들고 wait)
: 프로세스의 종료
독립적 프로세스 (Independent process)
: 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 않는다.
협력 프로세스 (Cooperating process)
: 프로세스 협력 매커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미친다.
: 프로세스간 정보를 주고 받는 매커니즘
message passing : 커널을 통해 메시지 전달
shared memory : 서로 다른 프로세스 간에도 (물리적 메모리에 매핑할 때) 일부 주소 공간을 공유하게 하는 shared 메모리 매커니즘이 있음 (신뢰할 수 있는 프로세스끼리 사용한다. 처음에는 커널이 공간을 만들어 주고, 이후에는 자기들끼리 점잖게..)
cf) thread 간의 협력 : thread는 사실상 하나의 프로세스이므로 프로세스간 협력으로 보기 어렵지만, 동일 프로세스를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력 가능.
-Interprocess Communication
-Message Passing
message system : 프로세스 사이에 공유변수를 일체 사용하지 않고, 커널을 통해 통신하는 시스템.
Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시
Indirect Communication : Mailbox(또는 port)를 통해 메시지를 간접 전달 (아무나에게 보낼 수 있음)