본문으로 바로가기

프로세스와 스케줄러

  • 프로세스
    • 메모리에 올려져서 실행 중인 프로그램을 뜻한다. 작업, task, job이라는 용어와 같은 의미로 사용되기도 한다.
    • 하나의 응용 프로그램은 하나 이상의 프로세스를 가진다.
  • 스케줄러
    • 스케줄러는 스케줄 알고리즘에 따라서 프로세스 실행을 관리한다.

스케줄링 알고리즘

  • FIFO 스케줄러
    • 가장 간단한 스케줄러, FCFS(First Come First Served) 스케줄러
  • SJF 스케줄러
    • SJF(Shortest Jop First) 실행시간이 짧은 프로세스부터 실행. 대기시간을 줄일 수 있다.
    • 모든 프로세스의 실행시간을 알아야 한다.
  • 우선순위 기반 스케줄러
    • 정적 우선순위: 프로세스마다 우선순위를 미리 지정
    • 동적 우선순위: 스케줄러가 상황에 따라 우선순위를 동적으로 변경
  • Round Robin 스케줄러
    • 큐에 순서대로 들어있는 작업을 짧은 단위시간 동안 처리하고 남은 작업을 다시 큐에 넣는 방식.
    • 시분할 시스템의 기반

프로세스 상태와 스케줄러

프로세스의 3가지 상태

(프로세스 생성과 종료 상태는 스케줄러의 영역이 아니기에 여기서 다루지 않음)

▲ 프로세스의 상태전이

  • running: 현재 CPU에서 실행 상태
  • ready: CPU에서 실행가능한 상태. 실행 대기 상태.
  • block: 다른 작업(하드를 읽는 등)으로 인해서 CPU에서 작업을 진행할 수 없는 상태.

선점형과 비선점형 스케줄러

  • 선점형 스케줄러(Preemptive Scheduling)
    • 스케줄러가 running 상태의 프로세스를 강제로 ready 상태로 만들며 다른 프로세스가 CPU를 점유할 수 있도록 조정할 수 있다.
    • 시분할 시스템이 가능.
  • 비선점형 스케줄러(Non-preemptive Scheduling)
    • 스케줄러가 running 상태의 프로세스를 강제로 ready상태로 만들 수 없기 때문에 프로세스 스스로 block 혹은 exit 될 때까지 계속 하나의 프로세스가 CPU를 점유하게 된다.
    • 시분할 시스템 불가능.

인터럽트

인터럽트란 CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치에서 예외상황이 발생하여 처리가 필요할 경우 CPU에 예외사항을 알려 처리할 수 있도록 하는 것.

인터럽트가 필요한 이유

  • 선점형 스케줄러 구현에 필요. CPU에서 작업 중인 프로세스를 중단시키고 다른 프로세스를 작업하도록 교체하기 위해서 필요.
  • IO Device와 커뮤니케이션. 저장 매체에서 데이터 처리 완료시 프로세스를 깨워야 함.
  • 예외 상황 핸들링에 필요. 예외상황이 발생할 경우 CPU가 해당 예외를 처리할 수 있도록 CPU에 알려야 함.

인터럽트 종류

  • 내부 인터럽트(소프트웨어 인터럽트): 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용 시 발생
    • 0으로 나눴을 때
    • 사용자 모드에서 허용되지 않은 명령 또는 공간 접근 시
    • 계산 결과에서 Overflow / Underflow 발생 시
  • 외부 인터럽트(하드웨어 인터럽트): 하드웨어에서 발생되는 이벤트(프로그램 외부)
    • 전원 이상
    • 기계 문제
    • 키보드 등 IO 관련 이벤트
    • Timer 이벤트: 선점형 스케줄러 구현에 필요함.

프로세스와 컨텍스트 스위칭

프로세스의 구조

프로세스의 구조는 크게 5가지로 구분 지어진다.

  • STACK: 임시 데이터(함수 호출, 로컬 변수 등)
  • HAEP: 코드에서 동적으로 만들어지는 데이터
  • BSS: 초기화되지 않은 데이터
  • DATA: 초기화된 데이터
  • TEXT(CODE): 코드 영역

▲ 프로세스의 구조

PC 레지스터와 SP 레지스터

  • PC (Program counter): CPU에 있는 레지스터로 현재 동작중인 프로세스의 다음에 실행될 명령어의 주소를 담고 있다.
  • SP (Stack pointer): CPU에 있는 레지스터로 현재 동작중인 프로세스의 top of stack 주소 값을 담고 있다.

컨텍스트 스위칭

켄텍스트 스위칭이란 CPU에 실행할 프로세스를 교체하는 기술을 말한다.

컨텍스트 스위칭을 하기 위해서는 현재 실행 중인 프로세스의 정보를 잠시 저장할 필요가 있다. 이때 현재 실행중인 프로세스의 정보를 PCB(Process Control Block)에 저장한다. PCB의 구성은 다음과 같다.

  • Process ID(PID)
  • Register 값(PC, SP 등)
  • Scheduling Info (Process State)
  • Memory Info(메모리 사이즈 limit)

file: 실시간성 떨어짐, 저장매체를 활용해서 시간 오래 걸림
커널 공간은 물리 메모리에서 공유함. 커널 공간을 사용하는 것이 핵심

프로세스 간 통신 (IPC)

프로세스간 통신을 줄여서 IPC(InterProcess Communication) 라고함. 프로세스간 통신이 필요한 이유는 다음과 같다.

  • 성능 향상을 위해서 멀티코어를 활용한 멀티 프로세스 기능을 사용할 수 있다. (병렬 처리)
  • 이때 프로세스 간 상태확인 및 데이터 송수신이 필요할 수 있음.
  • 하지만, 프로세스는 안전성을 위해 절대 다른 프로세스의 공간에 접근할 수 없다.
  • 때문에 별도의 프로세스간 통신 기술(IPC)이 필요하다.

IPC의 종류

프로세스의 구조를 살펴보면 모든 프로세스가 커널 공간을 가진다. 그리고 이 커널 공간은 모든 프로세스가 공유하며 커널 모드로 접근 가능하다. 때문에 대부분의 IPC는 이 커널 공간을 활용하 여하 구현할 수 있다.

▲ 실제 리눅스의 프로세스 구조

  • 저장매체를 활용하는 방식:
    • file 사용: 저장매체에 파일을 만들어 읽고 쓰면서 소통하는 방식. 실시간성 떨어지고, 저장매체 활용으로 시간이 오래 걸림.
  • 커널 공간을 활용하는 방식
    • Message Queue: 프로세스 간 단방향 큐를 만들어 통신하는 방식. 두 개의 큐를 생성하여 양방향 소통도 가능
    • Shared Memory: 커널 영역에 메모리 공간을 만들고 해당 공간을 변수처럼 쓰는 방식
    • Pipe: 부모 → 자식 방향으로 단방향 버퍼를 통한 통신
    • Signal: 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지를 알려주는 기법. 시그널 핸들러를 등록해서 해당 시그널 처리 실행.
    • Socket: 네트워크 통신 기술. 기본적으로는 클라이언트와 서버 등 두 개의 다른 컴퓨터 간의 네트워크 기반 통신을 위한 기술이지만, 하나의 컴퓨터 안에서 두 개의 프로세스 간에 통신 기법으로 사용 가능.