[운영체제] 프로세스와 스케쥴러

seonja kim·2021년 10월 7일
0

프로세스

  • 메모리에 올려져서 실행 중인 프로그램
  • 코드 이미지(바이너리): 실행파일, 예) ELF format
  • 프로세스라는 용어는 작업, task, job이라는 용어와 혼용
  • 응용 프로그램은 프로세스와 다른 개념
  • 하나의 응용 프로그램여러개의 프로세스가 상호작용하면서 실행될 수 있음

스케쥴러와 프로세스

스케쥴링 알고리즘

여러 프로세스 중 어느 순서로 프로세스를 실행시킬지 결정하는 알고리즘

목표

각 시스템의 목표에 맞게 구현해야 함
예를 들어

  • 시분할 시스템은 프로세스 응답시간을 가능한 짧게
  • 멀티 프로그래밍은 CPU활용도를 최대한 높혀서 프로세스를 빨리 실행할 수 있도록
    과 같이

FIFO 스케쥴러

  • 가장 간단한 스케쥴러 (배치 처리 시스템)
  • First in first out 순서대로 실행 (First Come First Served)

최단 작업 우선(SJF) 스케쥴러

  • Shortest Job First
  • 가장 프로세스 실행 시간이 짧은 프로세스부터 먼저 실행시키는 알고리즘
  • 이상적이지만 실제 실행 시간을 미리 예상하는 건 쉽지 않음

우선순위 기반 스케쥴러

  • Priority-Based 스케쥴러
    - 정적 우선순위 : 프로세스마다 우선순위를 미리 지정
    - 동적 우선순위 : 스케쥴러가 상황에 따라 우선순위를 동적으로 변경

Round Robin 스케쥴러 (선점형 스케쥴러)

  • 시분할 시스템 기반

프로세스 상태와 스케쥴링

멀티 프로그래밍과 wait

  • 멀티 프로그래밍 : CPU 활용도를 그대화하는 스케쥴링 알고리즘
  • wait : 간단히 저장매체로부터 파일 읽기를 기다리는 시간으로 가정

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

  • 선점형 스케쥴러 : 하나의 프로세스가 다른 프로세스 대신에 프로세서(CPU)를 차지할 수 있음
  • 비선점형 스케쥴러 : 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없음

선점형과 비선점형 스케쥴러 차이

위의 그림은 선점형일 때, 스케쥴링 방식이고 비선점형은 Block 또는 End만 가능함

  • 비선점형은 프로세스가 자발적으로 blocking상태로 들어가거나 실행이 끝났을 때만 다른 프로세스로 교체 가능

인터럽트

  • CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 CPU에 알려서 처리하는 기술
  1. 계산하는 코드에서 0으로 나누는 코드 실행시 (Divide-by-Zero interrupt)
  2. 타이머 인터럽트
    • 선점형 스케쥴러를 위해 필요
  3. 입출력(IO) 인터럽트 : 프린터, 키보드, 마우스 등

인터럽트 필요 이유

  • 선점형 스케쥴러 구현
    - 프로세스 running 중에 스케쥴러가 이를 중단시키고 다른 프로세스로 교체하기 위해 현재 프로세스 실행을 중단
  • IO device와의 커뮤니케이션
    - 저장매체에서 데이터 처리 완료시 프로세스를 깨워야 함 (block state -> ready state)
  • 예외 상황 핸들링
    - cpu가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생할 경우, CPU가 해당 처리를 할 수 있도록 알려줘야

인터럽트 종류

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

인터럽트 내부 동작

시스템콜 인터럽트
  • 시스템콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어 CPU에게 실행시켜야 한다.
  • 시스템콜 실제 코드
    - eax 레지스터에 시스템콜 번호를 넣고
    • ebx 레지스터에는 시스템콜에 해당하는 인자값을 넣고
    • 소프트웨어 인터럽트 명령을 호출하면서 0X80값을 넘겨줌
인터럽트와 시스템콜 (고급)

  • 시스템콜 인터럽트 명령을 호출하면서 0X80값을 넘겨줌
    - CPU는 사용자 모드를 커널모드로 바꿔줌
    • IDT(Interrupt Descriptor Table)에서 0X80에 해당하는 주소(함수)를 찾아서 실행함
    • system_call()함수에서 eax(시스템콜 번호)로부터 시스템콜 번호를 찾아서 해당 번호에 맞는 시스템콜 함수로 이동
    • 해당 시스템콜 함수 실행 후, 다시 커널모드에서 사용자 모드로 변경하고 다시 해당 프로세스 다음 코드 진행
사용자 / 커널모드와 프로세스, 인터럽트

인터럽트와 IDT

  • 인터럽트는 컴퓨터 부팅시 운영체제가 IDT(interrupt descriptor table)에 운영체제 내부코드를 기록

인터럽트와 프로세스

  1. 프로세스 실행 중 인터럽트 발생
  2. 현 프로세스 실행 중단
  3. 인터럽트 처리 함수 실행 (운영체제)
  4. 현 프로세스 재실행
profile
Adventurer

0개의 댓글