프로세스의 정의
Process state (=context)의 3가지 종류
Program은 디스크에 저장되어 있는 수동적인 실행 파일을 뜻하고, Process는 능동적인 존재다.
- Program은 실행파일이 메모리에 로드되면 process가 된다.
Uniprogramming
Multiprogramming
Multiprocessing
Multiprogrammig을 통해 OS는 process들을 유지해야 한다. 각각의 프로세스마다 PCB (Process Control Block)으로 관리한다.
Ready Queue: 바로 실행될 수 있지만, 실행될 자리가 없어서 대기 중인 프로세스들이 위치한 곳.
Device Queue (I/O waiting Queue): I/O device wait으로 인해 밀려난 프로세스들이 위치한 곳.
job Queue: 위의 두 큐를 포함하여 시스템의 모든 프로세스의 집합.
Short-term scheduler (or CPU scheduler): ready queue에 있는 프로세스 중 실행시킬 것을 결정하는 스케줄러이다. 다음에 실행할 프로세스를 선택하고, CPU에 할당한다.
-> 자주 호출되므로, must be fast
Long-term scheduler (or Job scheduler): ready queue에 올릴 프로세스를 결정한다. degree of multiprogramming을 결정한다.
-> 자주 호출되지 않으므로, may be slow
프로세스 구분하기
CPU가 다른 프로세스로 교체할 때, 시스템은 context switch를 통해 실행 중이던 프로세스의 상태를 PCB에 저장하고, 새로운 프로세스의 상태를 가져온다.
Context-switch는 시간이 오래 걸리므로, 자주 사용하지 않도록 해야 한다. (OS와 PCB가 복잡할수록 context-switch 시간은 길어진다.)
부모 프로세스는 자식 프로세스를 생성한다. 또, 그 자식 프로세스는 다른 프로세스를 생성하여 트리 구조를 만든다.
프로세스는 프로세스 식별자 (pid)를 통해 관리된다.
Resource sharing options
Execution options
fork()
: 새로운 프로세스 생성. (복제)
fork()
의 return 값exec()
: fork()
한 후, 새로운 프로그램으로 내용을 교체한다.
예시 코드
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed");
return 1;
}
else if (pid == 0) { // child process
execlp("/bin/ls", "ls", NULL);
}
else { // parent process
wait(NULL); // 부모 프로세스가 자식 프로세스가 종료되길 wait
printf("child complete");
}
return 0;
}
프로세스는 마지막 문을 실행한 다음, exit()
을 실행해 OS에 종료를 요청한다.
wait()
을 통해, 자식에서 부모로 상태 데이터를 return한다. 따라서, wait()
은 자식의 종료 상태를 알 수 있다.부모는 중단 시스템콜을 호출하여 자식 프로세스를 종료시킬 수 있다. 이것을 호출하는 이유 3가지
부모가 종료되었을 경우 자식이 존재하는 것을 허용하지 않는 OS는, Cascading termination을 사용한다. 이는 부모가 종료될 때 모든 자식, 손자... 가 연쇄적으로 종료된다. 이 종료는 OS에 의해 시작된다.
부모 프로세스는 wait()
을 호출하여 자식 프로세스가 종료되기까지 기다릴 수 있다. wait()
은 종료 정보와 종료된 프로세스의 pid를 반환한다.
좀비 프로세스: 프로세스가 종료됐는데, 기다리고 있는 부모 프로세스가 없는 경우
고아 프로세스: 부모가 자식을 기다리지 않고 먼저 종료되었을 경우
💡 프로세스 간에 IPC가 필요한 이유?
-> 스레드는 stack 공간을 제외하고 다른 메모리 영역을 스레드 간에 공유하지만, 프로세스는 각각 독립적이다. 그러나 여러 이유에 따라 프로세스간의 협력이 필요하다. 따라서 프로세스 간 협력을 위해 IPC가 필요하다!
협력 프로세스는 다른 프로세스에 영향을 받거나, 영향을 줄 수 있다.
프로세스 협력이 필요한 이유
IPC의 종류
Message passing
Shared memory