Post

프로세스와 스케줄링 기법

프로세스와 스레드

프로세스(process)

프로세스는 프로그램이 CPU(프로세서)에서 실행될 수 있도록 메모리에 적재된 상태를 말한다. 각 프로세스는 낮은 주소에서 높은 주소로 올라가는 순서대로, Code, Data, Heap, Stack 영역으로 나뉜다.

  • Code 영역: 실행할 프로그램의 코드가 저장된다.
  • Data 영역: 프로그램의 전역변수와 정적변수가 저장된다.
  • Heap 영역: 사용자의 동적할당에 사용된다. 런타임에 크기가 결정된다(확장 가능). 낮은 주소에서 높은 주소로 올라간다.
  • Stack 영역: 지역변수와 매개변수가 저장된다. 컴파일 타임에 크기가 결정되며, 높은 주소에서 낮은 주소로 내려간다(+ 과거에는 영역을 누가 침범하느냐에 따라 heap overflow, stack overflow가 발생했지만, 현대에는 스택 크기에 제한을 두어 스택 크기가 힙을 침범하기 전에 막히도록 설계되어 있다. 힙 오버플로우는 매우 드물다).

이 4개의 영역들이 RAM에 적재되어야 해당 프로세스가 실행될 수 있다.

🔍 백그라운드에서 실행되는 프로그램도 프로세스다. 벡그라운드는 사용자 관점에서의 분류일 뿐, CPU에게는 ‘실행 중인 프로세스’와 다를 바 없기에 스케줄링의 대상이 된다.

Context switching

하나의 프로세스에서 다른 프로세스로 전환될 때 진행상황을 저장하고, 저장해뒀던 진행상황을 복원시키는 과정을 말한다. 보통 System call이나 interrupt에 의해 일어난다.

프로세스의 현재까지의 진행상태는 PCB(Process Control Block)에 저장된다. 각 프로세스마다 1개의 PCB가 있고, 여기에 아래와 같은 정보들이 저장된다.

  • PID
  • 스케줄링 상태(Ready, Run, Wait, Terminated 등)
  • 프로그램 카운터(다음에 실행할 명령어의 주소) 등의 레지스터 상태

PCB는 커널 스택(가상 메모리는 유저 모드에만 접근 가능한 유저 스택과 커널 모드에만 접근 가능한 커널 스택으로 나뉘어 있다)의 가장 앞 부분에 위치한다.

진행상황을 저장하고 다음 프로세스를 실행할 준비를 하다보니 overhead가 생긴다(=CPU의 사용률이 낮아진다). 그럼에도 context switching을 하는 이유는, 컨텍스트 스위칭 하는 시간보다 I/O 대기 시간이 더 길기 때문에 그동안 컨텍스트 스위칭을 해서 다른 작업을 처리하기 위해서다.

스레드(Thread)

프로세스 내에서의 실행 단위를 말한다. 프로세스 한 개가 여러 개의 스레드로 이루어져 있고, 스레드들이 프로세스 자원을 공유하면서 프로세스가 실행된다. 이때 지역변수와 매개변수를 담는 Stack 영역만 별도로 갖고, 나머지 세 영역은 해당 프로세스의 스레드들이 공유한다.

스레드들끼리도 context switching이 일어나는데, Stack 영역만 바뀌기 때문에 overhead가 적다(그리고 프로세스 간 context switching이 발생했을 때는 메모리 주소 체계가 다르기 때문에 MMU 설정도 변경해야 해서 더 긴 시간이 소요된다), 대신에 스레드의 경우 공유하는 영역(critical section)에 대해 race condition이 발생할 수 있기 때문에 동기화가 필요하다.

스레드의 상태는 TCB(Thread Control Block)에 저장된다. TCB도 PCB처럼 ID와 프로그램 카운터 등이 있고, 커널 스택에 위치한다.

❗ 한 개의 스레드에서 오류가 생기면 같은 프로세스 내의 다른 스레드에도 영향이 간다. 하지만 프로세스는 서로 격리되어 있어 영향이 없다. ex) 크롬의 각 탭은 프로세스다. 한 탭에 오류나도 다른 탭에 영향을 주지 않는다.



스케줄링 기법

선점 스케줄링 vs 비선점 스케줄링

현재 진행중인 작업보다 우선순위가 더 높은 작업이 들어왔을 때 강제로 CPU를 뺏어올 수 있냐 / 없냐에 따라 나뉜다.

  • 선점 스케줄링: 강제로 CPU를 뺏어와서 먼저 실행될 수 있다.
  • 비선점 스케줄링: 진행중인 작업이 CPU를 반환할 때까지 기다려야 한다.

선점 스케줄링 기법

  • RR(Round Robin)
    • 돌아가면서 일정 시간(Time Quantum)만큼 실행된다.
    • Time Quantum이 끝나면 다음 프로세스가 CPU를 강제로 뺏어올 수 있기 때문에(=선점) 동일한 CPU 점유시간을 보장한다.
    • 시분할(Time-Sharing) 시스템의 실현이다.
  • SRT(Shortest Remaining Time)
    • 남은 실행 시간이 가장 짧은 프로세스부터 실행한다.

비선점 스케줄링 기법

  • FCFS(First Come First Served)
    • 먼저 온 프로세스부터 실행한다(선입선출).
  • SJF(Shortest Job First)
    • 실행시간이 가장 짧은 프로세스부터 실행한다.
    • 실행시간이 긴 프로세스에게 기아 현상(starvation. 낮은 우선순위에 있는 프로세스가 무한정 기다리는 현상)이 발생할 수 있다.
  • HRN(Highest Response Ratio Next)
    • SJF에 Aging 기법을 더해서 기아현상을 보완한 방식이다(Aging 기법: 오랫동안 기다린 프로세스의 우선순위를 천천히 높여준다).
    • (대기시간 + 실행시간) / 실행시간 기준으로 우선순위를 계산해서 이 값이 높은 순으로 실행한다. 즉, 실행시간은 짧으면서 대기시간은 길었던 프로세스를 먼저 실행한다.


+) 페이지 교체 전략은 CPU의 책상(RAM)에서 뭘 내쫓을지 결정하고, 스케줄링 기법은 CPU가 한번에 한가지 일밖에 못하니까 뭘 먼저 처리할지 결정한다.
예를 들어, CPU 할당을 기다리는(Wait) 상태의 프로세스가 페이지 교체 전략에 의해 디스크로 내보내질 수 있다. 이때 이 프로세스의 PCB는 여전히 커널 스택에 살아있기 때문에, OS에서는 이 프로세스에 CPU를 할당할 차례가 되었을 때 Page Fault를 감지하고 해당 페이지를 디스크에서 RAM으로 불러와서 작업을 이어서 진행한다.

This post is licensed under CC BY 4.0 by the author.

Trending Tags