Process 생성
Copy-on-write (COW) : 내용이 바뀔 때 복사해서 만듦
- 부모 프로세스(Parent process)가 자식 프로세스(Children process) 생성
- OS 시스템콜로 생성함
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로 함
- 자원의 공유
- 부모와 자식이 모든 자원 공유 모델
- 일부 공유 모델
- 전혀 공유하지 않는 모델
- 수행 (Execution)
- 부모와 자식은 공존하며 수행되는 모델
- 자식이 종료(terminate)될 때까지 부모가 기다리는(wait, blocked) 모델
- 주소 공간 (Address space)
- 자식은 부모의 공간을 복사함 (binary and OS data) 프로세스 문맥.
- 자식은 그 공간에 새로운 프로그램을 올림
- 유닉스 예)
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사 (OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
Process 종료 (Process Termination)
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)
a. 자식이 부모에게 output data를 보냄 (via wait)
b. 프로세스의 각종 자원들이 OS에게 반납
c. 자발적인 종료
- 부모 프로세스가 자식 수행 종료시킴 (abort)
a. 비자발적 종료
b. 자식이 할당 자원의 한계치 넘어섬
c. 자식에게 할당된 테스크가 더 이상 불필요 (더이상 시킬일 없을경우)
d. 부모가 종료(exit)하는 경우
- OS는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음
- 단계적인 종료 (자손 < 자식 < 부모 순으로 종료시킴)
fork() 시스템 콜
int main()
{
int pid;
printf("\n Hello, only parent!\n");
pid = fork();
if (pid == 0)
printf("\n Hello, I am children!\n");
else if (pid > 0)
printf("\n Hello, I am parent!\n");
}
💥 자식 프로세스는 부모 프로세스 문맥(program counter)을 복제하기 때문에 main()함수 부터 시작하지 않고 fork() 뒤 다음시점부터 실행함
exec() 시스템 콜
완전히 새로운 프로그램으로 덮어씌우는 콜
int main()
{
int pid;
pid = fork();
if (pid == 0)
printf("\n Hello, I am children!\n");
execlp("/bin/date","/bin/date",(char*) 0);
else if (pid > 0)
printf("\n Hello, I am parent!\n");
}
💥 자식 프로세스는 bin/date라는 함수를 실행 후 종료. 돌아올 수 없음. 새로운 프로그램으로 덮어썼기 때문
int main()
{
printf("1");
execlp("echo","echo",(char*) 0);
printf("2");
}
wait() 시스템 콜
자식이 종료까지 부모가 기다리는 모델
- 프로세스 A wait() 시스템콜 호출
- 커널은 child가 종료될 때 까지 부모프로세스 A를 sleep 시킴 (block상태)
- Child process가 종료되면 커널은 프로세스 A를 깨움 (ready 상태)
main(){
int childPID;
S;
childPID = fork();
if(childPID == 0)
else {
wait();
}
S;
}
exit() 시스템 콜
프로세스의 종료
- 자발적 종료
a. 마지막 statement 수행 후 exit() 시스템 콜을 통해
b. 프로그램에 명시적으로 넣어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
- 비자발적 종료
- 부모 프로세스가 자식 프로세스 강제 종료
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 테스크 더 이상 불필요
- 키보드로 kill, break 등 입력한 경우
- 부모가 종료하는 경우
프로세스 간 협력
- 독립적 프로세스
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 간 협력 메커니즘 (IPC: Interprocess Communication)
- 메시지 전달 방법
- message passing : 커널 통해 메시지 전달
- 주소 공간 공유
- shared memory
1. 서로 다른 프로세스 간 일부 주소 공간을 공유하게 하는 메커니즘
2. 커널에게 사용한다고 말해야 함
3. 서로 신뢰할 수 있는 프로세스
❗ thread : thread는 사실상 하나의 프로세스이므로 프로세스간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간 주소 공간을 공유하므로 협력 가능
- Message Passing Message system
- 프로세스 사이 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
-
Direct Communication
-
Indirect Communication
- mailbox (또는 port)를 통해 메시지 간접 전달
출처
http://www.kocw.net/home/search/kemView.do?kemId=1046323