✨ 부모 프로세스(Parent process)가 자식 프로세스(children process) 생성
✨ 프로세스의 트리(계층 구조) 형성
✨ 프로세스는 자원을 필요로 함
✨ 자원의 공유
✨ 수행 (Execution)
✨ 주소 공간 (Address space)
✨ 유닉스의 예
exec() 시스템 콜 : 프로세스를 하나 복사해 놓고 그 프로세스를 새로운 프로그램으로 덮어 씌워서 프로그램을 실행 하는 것.
✨ 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)
✨ 부모 프로세스가 자식의 수행을 종료시킴 (abort)
✨ 프로세스는 fork() 시스템 콜로 만들어 진다
부모와 자식은 완전 동일하다. 어떻게 구분을 하는가?
int main()
{ int pid;
pid = fork();
if (pid == 0) /* this is child */
printf("\n Hello, I am child!\n");
else if (pid >0) /" this is parent */
printf("\n Hello, I am parent!\n");
}
fork()를 한 변수의 값으로 구분.
Parent process
pid>0
Child process
pid = 0
fork() 만으로는 완전히 다른 일을 시킬수는 없다. 똑같은 일만 할 수 있음. 이때 다른 일을 시키고 싶다면 exec() 시스템 콜이 필요하다
✨ 프로세스는 exec() 시스템 호출에 의해 다른 프로그램을 실행할 수 있습니다.
int main()
{
printf("\n Hello");
execlp("/bin/date", "/bin/date", (char*) 0);
printf("\n Hello");
}
execlp를 하는순간 새로운 프로그램이 덫씌워지기 때문에 밑의 Hello는 출력되지 않고 다른 프로그램이 실행 된다.
int main()
{
int pid;
pid = fork();
if (pid == 0) /* this is child */
{ printf("\n Hello, I am child! Now I'll run date \n");
execlp("/bin/date", "/bin/date", (char*) 0);
}
else if (pid > 0) /" this is parent */
printf("\n Hello, I am parent!\n");
}
fork() 후 exec() 시스템 시스템 콜을 한 경우에 대한 예제 코드
✨프로세스 A가 wait() 시스템 콜을 호출하면
ex) Linux의 Vi 사용
wait() 시스템 콜을 하지 않으면 부모와 자식은 경쟁관계. 서로 CPU를 얻으려고 경쟁하는 프로그램.
wait()를 불러버리면 자식이 종료될때까지 부모 process를 blocked 시키는 것.
두가지 상황의 프로세스의 종료
✨자발적 종료
✨비자발적 종료
✨독립적 프로세스 (Independent process)
✨협력 프로세스(Cooperating process)
✨프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
메시지를 전달하는 방법
✓ message passing: 커널을 통해 메시지 전달
주소 공간을 공유하는 방법
✓ shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음===============================================================
Thread와 Shared Memory의 차이점
✓ thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들간에는 주소 공간을 공유하므로 협력이 가능.( thread가 만들어지는 거 자체가 메모리 공간을 공유함.)
Message system
Direct Communication
Indirect Communication