여러 프로세스가 동시에 수행되는 것을 말한다. CPU는 한 번에 하나의 동작만 수행하기 때문에, 한 프로세스의 .text를 수행하면 다른 프로세스는 멈춰있는 상태이다. 이런 프로세스들을 동시에 수행하도록 관리하는 방법은 매우 빠른 속도로 하나씩 돌아가면서 수행하는 것이다. => 커널의 스케줄링 작업으로!
프로세스끼리는 부모와 자식 관계를 갖으며, 최초 프로세스를 제외한 모든 프로세스는 부모 프로세스에서 복제되어 생성된다. => fork() system call
사용
항상 부모 프로세스가 존재하며, 부모 프로세스는 기본적으로 자식 프로세스를 관리한다. 부모 프로세스는 자식 프로세스가 종료되면 자원을 정리한다.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){ // 부모 프로세스 혼자 있음
// 자식 프로세스 생성
// 생성된 자식 프로세스는 부모 프로세스와 동일한 작업
pid_t child_pid = fork();
if( child_pid>0 ){
//parent
printf("I'm Parent! I'm Busy!!\n");
while(1);
}
else if( child_pid==0 ){
//child
printf("HI! I'm baby! ByeBye\n");
//Die
}
return 0;
}
고아 프로세스는 자식 프로세스가 동작 중인데, 부모 프로세스가 먼저 종료된 프로세스를 말한다.
OS에 따라 표현이 다르다.
기본 running
Run Queue
상태 종류
sleep 은 실제로 자고 있는 게 아니다
ctrl + z 커맨드로 진입
프로세스가 죽지 못하고 있다. 프로세스가 종료되면 프로세스가 점유한 메모리를 정리해야 하는데 종료된 프로세스의 메모리가 정리되고 있지 않는 상태로, 부모 프로세스가 바쁘기 때문에 발생한다.
프로세스 종료 과정
SIGCHLD
Signal 을 보냄현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말한다.
멀티태스킹, 인터럽트 핸들링, 사용자 모드와 커널 모드 간의 전환에 의해 발생한다.
1. 멀티태스킹
1. 실행 가능한 프로세스들이 운영체제의 스케줄러에 의해 조금씩 번갈아가며 수행되는 것이다
2. 번갈아가며 프로세스가 CPU를 할당받는데 이때 Context Switching 발생한다
3. 사용자가 체감하기 힘든 속도로 처리되기 때문에 동시에 처리되는 것처럼 느낀다
2. 인터럽트 핸들링
1. I/O Request
2. time slice expired(CPU 사용 시간 만료: Round Robin)
3. fork a child
4. wait for an interrupt(인터럽트 처리 대기)
3. 사용자가 커널 모드 전환
1. Context Switching이 필수는 아니지만 운영체제에 따라 발생할 수 있다
Context Switching이 발생하게 되면 많은 Cost가 발생한다
Context Switching 비용은 Process가 Thread보다 많이 든다. Thread는 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 Context Switching 발생시 Stack 영역만 변경하면 된다.
저장 정보
- 프로세스 상태, PID 등
- 프로세스에 대한 다양한 정보들을 보관
CPU가 프로세스에서 작업할 때 어디까지 했는지 기록
- 작업할 수 있는가(Process State)
- 어디까지 했는가(PCB에 저장된 정보)