[Operating System] 시스템 콜 & 프로세스 간 협력
프로세스 생성(Process Creation)
부모 프로세스가 자식 프로세스를 생성한다. (트리 형성)
자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델이다.
주소 공간
자식은 부모의 공간을 복사(fork)하고 그 공간에 새로운 프로그램(exec)을 올린다.
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 */
print("\n Hello, I am parent!\n");
}
커널 address space에 PCB가 존재할 때 코드 섹션의 명령어가 fork일 때 그 명령이 CPU에서 수행되는데, 이 때 fork 명령어는 자신과 똑같은 프로세스를 생성하하는 의미를 가진다. 그래서 원래의 PCB를 복사하고 stack, data, code 섹션도 복사하여 자식 프로세스를 만든다. 또한, 원래 프로세스의 PC 값도 복사되어 복사된 공간에서도 똑같은 자리를 가리키게 된다.
위의 코드에서 pid = fork(); 에서 pid가 값을 받을 때 프로세스가 복제되어 나누어지기 때문에 다른 pid를 가지게 된다.
원래 프로세스의 pid에는 child process의 pid가 들어가고 새로 생성된 프로세스에는 pid로 0값이 들어간다.
자식 프로세스가 생성되면 부모 프로세스와 번갈아가며 CPU를 점유하며 실행된다.
exec() 시스템 콜
int main()
{
int pid;
pid = fork();
if(pid == 0)
{
printf("\n Hello, I am child. Now I'll run date \n");
execlp("/bin/date", "/bin/date", (char *)0);
}
else if(pid >0)
printf("\n Hello, I am parent!\n");
}
자식 프로세스에서 execlp를 만나게 되면 자식 프로세스의 코드가 execlp 안에 있는 코드로 오버라이딩 된다.
execlp 뒤에 명령어가 있어도 수행되지 않는다.
wait() 시스템 콜
자식 프로세스가 실행될 때 부모 프로세스는 wait 시스템 콜을 호출하고 커널은 자식 프로세스가 종료될 때까지 부모 프로세스를 sleep(blocked 상태 : sleep인 상태로 CPU를 점유하는 것은 효율적이지 않기 때문이다.)시킨다. 그러므로 우리는 메인 화면에서 자식 프로세스가 실행하는 화면만 볼 수 있다.
자식 프로세스가 종료되면 커널은 부모 프로세스를 깨운다.(ready 상태)
exit() 시스템 콜
- 프로세스의 종료
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려주는 시스템 콜
- 운영체제로 제어권이 넘어가는 시점 (exit이 불렸을 때 OS로 제어권이 넘어가면서 프로세스의 PCB나 stack, data, code를 정리한다.)
자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜을 통해 수행된다.
- 프로그램에 명시적으로 넣어주지 않아도 컴파일러가 exit 시스템 콜을 넣어준다.
비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시키는 경우(abort)
- 자식이 할당 자원의 한계치를 넘어서는 경우
- 자식에게 할당된 태스크가 더 이상 필요하지 않는 경우
- 부모가 종료(exit)하는 경우
- 키보드로 kill,break 등을 친 경우
- Ctrl + c와 kill의 다른 점
- Ctrl + c는 자발적 종료이다(자기가 exit 콜을 불러서 종료하는 경우)
- kill은 OS 차원에서 직접 프로세스를 정리하는 경우(PC정리, PCB정리 , 코드, 데이터 섹션 정리)
- Ctrl + c와 kill의 다른 점
프로세스 간 협력
독립적 프로세스( Independent process )
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.
협력 프로세스( Cooperating process )
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.
프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
Message Queue
- 프로세스와 커널 간의 연결 파이프를 만든다.
- A 프로세스가 커널 메모리에 데이터를 보내면(send) B 프로세스는 receive 명령을 이용해 데이터를 가져올 수 있다.
- 메시지 큐의 장점은 컨테이너 벨트가 가지는 장점을 그대로 가지게 됩니다. 컨테이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이, 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있습니다.
- 통신하려는 프로세스의 이름을 명시적으로 표시한다.
Shared Memory
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줍니다. 이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있습니다.
- 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동할 수 있습니다.
참고)
Ewha Woman Univ. Operating System (2023-1. Prof. JinWook Kwon)