프로세스, 멀티 쓰레드, 스케줄링 알고리즘

와! 내일 개강!

프로세스

프로세스(Process)는 실행 중인 프로그램을 의미하며, CPU가 처리하는 작업(Task)이라고도 불립니다. 디스크에 저장되어 있던, 실행 가능한 프그램이 메모리에 적재되어 운영체제가 관리하는 상태입니다.
프로세스 상태는 다음과 같습니다.

  • 생성(New): 프로세스가 막 생성된 상태
  • 준비(Ready): 프로세스가 CPU에서 실행되기 위해 대기하는 상태
  • 실행(Running): 프로세스에 포함된 명령어가 실행되고 있는 상태
  • 대기(Waiting): 프로세스가 특정 자원이나 이벤트를 기다리는 상태
  • 종료(Terminated): 프로세스가 실행을 완료한 상태 프로세스 상태 변화도

쓰레드

쓰레드(Thread)는 경량 프로세스라고도 하며, 프로세스에서 실행 제어만 분리해서 처리하는 단위입니다.
쓰레드는 같은 그룹의 쓰레드와 코드, 메모리 주소 공간, 운영체제 리소스를 공유합니다. 프로세스는 하나 이상의 쓰레드를 가지고 각 쓰레드는 다음과 같은 동작을 담당합니다.

- 쓰레드 실행에 대한 상태 관리
- 실행을 위한 별도 스택
- 지역 변수와 쓰레드 특정 데이터를 저장하는 데이터 저장소
- 프로세스의 메모리와 자원에 대한 접근을 기록하는 컨텍스트 정보

쓰레드

쓰레드는 다음과 같은 특징을 가집니다.

- 사용자에 대한 응답성을 증가시킬 수 있다.
- 프로세스 자원과 메모리를 공유할 수 있다.
- 자원을 공유하기 때문에 경제적이다.
- 다중 프로세서와 다중 쓰레드를 혼합해서 병렬 실행이 가능하다.
- 현대 CPU들은 다중 쓰레드를 처리하는 하드웨어 로직을 가지고 있다.

멀티쓰레드

스케줄링 알고리즘

스케줄링 알고리즘은 프로세스 또는 쓰레드에 CPU를 할당해줄 때 순서를 정하는 것입니다. 크게 2가지 방법이 있습니다.

  • 선점 방식 : 새로운 프로세스가 ready queue에 들어왔을 때, 만약 높은 우선순위로 인해 실행이 되어야 한다면 진행중인 프로세스를 중단시키고 새로 들어온 프로세스를 진행시키는 방식입니다.
  • 비선점 방식 : 이미 진행중인 프로세스는 본인이 할당 받은만큼 다 할 때까지 양보하지 않는 방식입니다.

프로세스 스케줄링은 프로세스를 생성해서 계속해서 실행하지 않고, 다른 프로세스를 실행하는 동안 대기했다가 다시 실행하는 순서를 반복합니다.
프로세스 스케줄링 방식은 다음과 같은 것들이 있습니다.

  • 기한부 스케줄링(Deadline Scheduling)
    • 작업들을 동작 시간을 주어진 마감 시간까지 완성하도록 계획한 스케줄링이다.

      Untitled

    • 간트 차트

      Untitled

    • 평균 시간

      Untitled

  • 우선순위 스케줄링(Priority Scheduling)
    • 프로세스 실행 중에 우선순위가 높은 프로세스를 먼저 실행하는 방식으로, 낮은 우선순위가 계속 밀릴 수 있다.
    • 우선순위가 동적으로 바뀌는 방법도 있고, 고정적인 우선순위로 운영되기도 한다.

      Untitled

    • 간트 차트

      Untitled

    • 평균 시간

      Untitled

  • FIFO 스케줄링(FIFO Scheduling)
    • 비선점 스케줄링으로 프로세스가 생성된 순서대로 대기큐에 넣어놓고 순서대로 스케줄링 하는 방식이다.

      Untitled

    • 평균 시간

      Untitled

  • SJF 스케줄링(Shortest Job Scheduling)
    • 비선점 스케줄링 방법으로, 작업이 끝날 때까지 실행 시간이 가장 작은 것부터 먼저 스케줄링 하는 방식이다.

      Untitled

    • 평균 시간

      Untitled

  • 라운드로빈 스케줄링(Round-Robin Scheduling)
    • 선점 스케줄링 방식으로 FIFO처럼 순차적으로 실행하지만, CPU에서 제어하는 시간을 일정하게 나눠서 스케줄링하는 방식이다.
    • CPU 시간이 마무리될 때까지 작업이 끝나지 않으면 다음 프로세스로 넘어간다.

      Untitled

    • 간트 차트

      Untitled

    • 평균 시간

      Untitled


쓰레드 스케줄링은 쓰레드의 개수가 코어보다 많을 경우, 쓰레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 정하는 작업입니다. 쓰레드 스케줄링에 의해 쓰레드들이 아주 짧은 시간에 번갈아가며 그들의 메소드를 실행합니다.
쓰레드 스케줄링 방식은 다음과 같은 것들이 있습니다.

  • FCFS(First Come First Served)
    • 비선점형 스케줄링
    • 먼저 들어온 프로세스를 먼저 처리하는 방식이다.
  • SJF(Shortest Job First)
    • 선점 방식과 비선점 방식 둘 다 존재
    • 걸리는 시간이 짧은 프로세스를 먼저 수행시키도록 하는 알고리즘이다.
  • HRN(Highest Response-ratio Next)
    • 비선점형 스케줄링
    • 실행 시간이 긴 프로세스에 불리한 SJF 기법을 보완하기 위한 것으로, 대기 시간과 서비스 시간을 이용하는 방식이다.
    • 우선순위 = (대기시간+서비스시간)/서비스시간의 에이징 기법을 이용하여 우선순위를 계산하고, 우선순위가 높은 것부터 실행한다.
  • Priority Queue
    • 선점 방식과 비선점 방식 둘 다 존재
    • 프로세스마다 우선순위를 줘서 우선순위가 높은 것부터 실행시키도록 하는 것이다.
    • 우선순위 큐를 사용한다면 우선순위가 낮은 프로세스는 평생 대기만 해야하는 starvation(기아)이 발생할 수 있는데, 이것을 방지하기 위해 에이징 기법을 활용할 수 있다.
  • SRT(Shorest Remaining Time)
    • 선점형 스케줄링
    • 비선점 스케줄링인 SJF 기법을 선점 형태로 변경한 것이다.
    • SJF처럼 CPU 점유 시간이 가장 짧은 프로세스에 CPU를 먼저 할당하는 방식이다.
    • 단, 선점형이기 때문에 중요한 프로세스가 있으면 점유시간이 길어도 먼저 실행시킬 수 있는 권한이 있다.
  • Round Robin
    • 선점형 스케줄링
    • 일정 시간을 할당받아 주어진 시간이 경과하면 다음 프로세스에게 CPU를 넘겨주는 시분할 방식이다.
    • 주어진 시간이 너무 길면 FCFS와 같은 기능을 수행하고, 너무 짧으면 context switching이 빈번하게 일어나 오버헤드가 많이 발생하므로 적절한 시간 할당이 중요하다.
  • Multi-Level Queue(다단계 큐)
    • 프로세스를 특정 그룹으로 분류할 수 있을 경우, 그룹에 따라 각기 다른 준비 상태 큐를 사용하는 기법이다.
    • 프로세스가 특정 그룹의 준비 상태 큐에 들어갈 경우 다른 준비상태 큐로 이동할 수 없다.
    • 하위 준비상태 큐에 있는 프로세스를 실행하는 도중이라도 상위 준비 상태 큐에 프로세스가 들어오면 상위 프로세스에게 CPU를 할당해야 한다.
    • 각 준비 상태 큐에서는 Round Robin 기법이 적용된다.
  • Multi-Level Feedback Queue(다단계 피드백 큐)
    • 특정 그룹의 준비 상태 큐에 들어간 프로세스가 다른 준비 상태 큐로 이동할 수 없는 다단계 큐 기법을 보완하여, 다른 준비 상태 큐로 이동할 수 있도록 개선한 기법이다.