Process

GAON PARK·2023년 11월 14일
0
post-custom-banner

Multi Process

여러 프로세스가 동시에 수행되는 것을 말한다. CPU는 한 번에 하나의 동작만 수행하기 때문에, 한 프로세스의 .text를 수행하면 다른 프로세스는 멈춰있는 상태이다. 이런 프로세스들을 동시에 수행하도록 관리하는 방법은 매우 빠른 속도로 하나씩 돌아가면서 수행하는 것이다. => 커널의 스케줄링 작업으로!

Process 간 관계

프로세스끼리는 부모와 자식 관계를 갖으며, 최초 프로세스를 제외한 모든 프로세스는 부모 프로세스에서 복제되어 생성된다. => fork() system call 사용
항상 부모 프로세스가 존재하며, 부모 프로세스는 기본적으로 자식 프로세스를 관리한다. 부모 프로세스는 자식 프로세스가 종료되면 자원을 정리한다.

Sample code

#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;
}

고아 프로세스 처리

고아 프로세스는 자식 프로세스가 동작 중인데, 부모 프로세스가 먼저 종료된 프로세스를 말한다.

  • 자식 프로세스의 부모 프로세스를 가장 최초의 프로세스로 변경한다
  • 자원이 정리된 뒤 사라진다

Process State

OS에 따라 표현이 다르다.

Linux Process State Machine

  • R = Running / Runnable
  • S = Interruptible Sleep
  • D = Uninterruptible Sleep
  • T = Stopped
  • Z = Zombie

process state - run

기본 running

  • 1 core 기준 하나의 process 가 하나의 running, 나머지 process 는 runnable 상태
    • runnable = 실행 대기중
    • running = 실행 중

Run Queue

  • 우선 순위 값에 따라 스케줄러가 먼저 수행할 것을 결정, 후보들이 존재하는 큐
  • run queue 에 있어야 core 가 수행
  • run queue 에서 탈출하는 경우
    • I/O 응답 대기하거나 신호 발생 시 탈출

process state - sleep

상태 종류

  • Uninterruptible sleep (D) = 방해 금지, signal 안 받음
  • interruptible sleep (S) = 방해 가능, signal 받음

sleep 은 실제로 자고 있는 게 아니다

  • process 가 중요한 일을 하기 때문에 끊기지 않아야 하는 경우 sleep 으로 진입
  • 디렉토리를 생성하거나, 디스크 I/O 작업을 수행하는 경우 진입
  • 일반적인 상황에서 D는 쉽게 볼 수 없다. 대부분 S 상태

process state - stop

ctrl + z 커맨드로 진입

process state - zombie

프로세스가 죽지 못하고 있다. 프로세스가 종료되면 프로세스가 점유한 메모리를 정리해야 하는데 종료된 프로세스의 메모리가 정리되고 있지 않는 상태로, 부모 프로세스가 바쁘기 때문에 발생한다.

프로세스 종료 과정

  1. 프로세스가 종료 → State : Zombie 진입
    1. 아직 Process Descriptor 가 남아있음
    2. 즉, 부모가 descriptor 를 제거하기 전까지 자식은 Zombie
  2. 프로세스는 부모 프로세스에게 SIGCHLD Signal 을 보냄
  3. 부모 프로세스는 signal 을 받아 정해야 한다
    1. 자식 프로세스의 자원이 정리될 때까지 기다려야 한다면, wait() system call 호출 → 커널이 정리
    2. 아니라면, 비동기적으로 자식 프로세스가 종료되는 것을 기다리지 않을 수 있음

Context Switching

현재 진행하고 있는 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이 필수는 아니지만 운영체제에 따라 발생할 수 있다

cost

Context Switching이 발생하게 되면 많은 Cost가 발생한다

  • Cache 초기화
  • Memory Mapping 초기화
  • Kernel은 항상 실행되어야 합니다. (메모리의 접근을 위해서..)

Process vs Thread

Context Switching 비용은 Process가 Thread보다 많이 든다. Thread는 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 Context Switching 발생시 Stack 영역만 변경하면 된다.

진행

  • Task의 대부분 정보는 Register에 저장되고 PCB에 관리된다
  • 현재 실행하고 있는 Task의 PCB 정보를 저장한다(Process Stack, Reday Queue)
  • 다음 실행할 Task의 PCB 정보를 읽어 Register에 적재하고 CPU가 이전에 했던 과정을 연속적으로 수행한다

PCB (Process Control Block)

저장 정보
- 프로세스 상태, PID 등
- 프로세스에 대한 다양한 정보들을 보관

CPU가 프로세스에서 작업할 때 어디까지 했는지 기록
- 작업할 수 있는가(Process State)
- 어디까지 했는가(PCB에 저장된 정보)

post-custom-banner

0개의 댓글