호우동의 개발일지

Today :

article thumbnail

프로세스 스케줄링

  • 다중 프로그래밍 목적
    • CPU 이용을 최대화하기 위해 항상 어떤 프로세스를 실행하는 것

  • 시분할의 목적
    • 프로세스들 사이에서 CPU 코어를 계속 교체하는 것
      ← 각 프로그램이 실행되는 동안 사용자가 상호작용 할 수 있도록 하기 위해
  • 시분할과 다중 프로그래밍의 목적을 달성하기 위해 프로세스 스케줄러가 존재
    • 프로세스 스케줄러 : 코어에서 실행 가능한 프로세스 중 하나를 선택
      • 각 CPU 코어는 한 번에 하나의 프로세스만 실행 가능
        → 코어보다 많은 프로세스가 있는 경우, 초과 프로세스는 코어가 사용 가능해지고,
        다시 스케줄 될 때까지 대기

        • 현재 메모리에 있는 프로세스 수를 다중 프로그래밍 정도라고 함

  • 프로세스는 대부분 2가지로 나눌 수 있음
    • I/O 바운드 프로세스 : 계산에 소비하는 것보다 I/O에 더 많은 시간을 소비하는 프로세스
    • CPU 바운드 프로세스 : 계산에 더 많은 시간을 사용하여 I/O 요청을 자주 생성하지 않는 프로세스

 


스케줄링 큐

준비 큐 연결리스트 그림
준비 큐 연결리스트 그림

  • 프로세스가 시스템에 들어가면 준비(ready) 큐에 준비 상태가 되어 CPU 코어에서 실행되길 기다림
  • 큐(queue)는 일반적으로 연결 리스트로 저장
  • 준비 큐 헤더에는 리스트의 첫 번째 PCB에 대한 포인터 저장,
    각 PCB에는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 포함

대기 큐 연결리스트 구조
대기 큐 연결리스트 구조

  • 프로세스에 CPU 코어가 할당되면 프로세스는 잠시 실행되고,
    종료되거나 인터럽트 되거나 특정 이벤트 발생까지 기다린다. → 기다리는 곳이 위의 대기 큐

    • 프로세스가 디스크 같은 장치에 I/O 요청 → 장치는 프로세서보다 상당히 느림
      → 프로세스는 I/O가 사용 가능해질 때까지 대기 큐에서 대기

 


큐잉 다이어그램

큐잉 다이어그램 프로세스 흐름

  • 프로세스의 일반적인 표현은 아래의 큐잉 다이어그램으로 나타냄
    • 원 : 큐에 서비스를 제공하는 자원
    • 화살표 : 시스템의 나타나는 프로세스 흐름

  • 준비 큐와 대기 큐의 집합의 두 가지 유형의 큐가 제시되어 있음

  • 과정
    1. 새 프로세스는 처음에 준비 큐에 놓임
      • 프로세스는 실행을 위해 선택되거나 또는 디스패치 될 때까지 기다림

    2. 프로세스에 CPU 코어가 할당되고 실행 상태가 되면 아래의 이벤트 중 하나가 발생
      • 입출력 요청 : 프로세스가 I/O 요청을 공표한 다음 I/O 대기 큐에 놓일 수 있다.
        • 대기 상태에서 준비 상태로 전환된 다음, 다시 준비 큐로 들어감

      • 타임슬라이스 종료
        • 대기 상태에서 준비 상태로 전환된 다음, 다시 준비 큐로 들어감

      • 자식 프로세스 생성 새 자식 프로세스 생성 후, 자식의 종료를 기다리는 동안 대기큐에 놓임

      • 인터럽트를 기다림 : 인터럽트가 만료되어 프로세스가 코어에서 강제로 제거되어 준비 큐로 돌아감
  • 프로세스는 종료될 때까지 해당 주기를 반복
  • 종료 시점에 모든 큐에서 제거되고 PCB 및 자원이 반환

 


CPU 스케줄링

  • CPU 스케줄러의 역할 : 준비(ready) 큐에 있는 프로세스 중 하나를 선택해서 CPU 코어를 할당하는 것
  • I/O 바운드 프로세스는 I/O 요청을 대기하기 전에 몇 밀리초 동안만 실행 가능
  • CPU 바운드 프로세스는 오랜 시간 동안 CPU 필요하지만, 스케줄러는 장기간 부여할리가 없음
    → 프로세스에서 CPU를 강제로 제거하고 실행될 다른 프로세스를 스케줄 할 가능성이 높음
    → CPU 스케줄러가 더 자주 실행되는 건 맞음, 하지만 100밀리 초의 실행 간격은 가지고 있음
  • 스와핑 - 중간 형태의 스케줄링
    • 메모리에서 프로세스를 제거하여 다중 프로그래밍의 정도를 감소시키는 것이 유리함
    • 프로세스를 메모리에 다시 적재될 수 있으며 중단된 위치에서 실행을 계속할 수 있다.
    • 스와핑은 일반적으로 메모리가 초과 사용되어 가용공간을 확보할 때만 필요

 


문맥 교환

  • 인터럽트는 운영체제가 CPU 코어를 현재 작업에서 뺏어 커널 루틴을 실행할 수 있게 한다.
    • 이러한 연산은 범용 시스템에서 자주 발생
    • 인터럽트가 발생하면, 시스템은 인터럽트 처리 후에 문맥을 복구할 수 있도록
      현재 실행 중인 프로세스의 현재 문맥을 저장할 필요가 있음

  • 인터럽트 발생 시 CPU의 현재 상태를 저장하는 작업을 수행하고,
    연산을 재개하기 위해 상태 복구 작업을 수행
  • 문맥은 프로세스의 PCB에 표현
    • 문맥은 CPU 레지스터의 값, 프로세스 상태, 메모리 관리 정보 등을 포함

  • 문맥교환
    • 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업
      ← CPU 코어를 다른 프로세스로 교환하기 위해

    • 교환 속도는 기계마다 다르다.
      • 메모리의 속도, 반드시 복사되어야 하는 레지스터의 수, 특수 명령어의 존재 등에 좌우됨
      • 전형적인 속도는 수 마이크로초까지 분포되어 있음

    • 문맥교환 발생 시 과정
       
      1. 커널은 과거 프로세스의 문맥을 PCB에 저장
      2. 실행이 스케줄 된 새로운 프로세스의 저장된 문맥을 복구
      • 문맥 교환 시간은 순수한 오버헤드
        • 문맥 교환 진행될 동안 시스템은 아무런 유용한 일을 하지 못함
        • 문맥 교환 시간은 하드웨어의 지원에 크게 좌우됨
          • 운영체제가 복잡할수록, 문맥 교환 시 해야 할 작업의 양이 더 많아짐

프로세스 문맥 교환 다이어그램
프로세스 문맥 교환 다이어그램