(운영체제) 스레드, 스케줄링, 컨택스트 스칭

BaekGwa·2024년 8월 12일
0

💻 OS

목록 보기
2/2

운영체제

도입

스레드와 스케줄링

복습

  • 앞서 확인 한대로, CPU1개에 두가지 프로세스가 동작하고 있고, 각 프로세스는 2개의 스레드가 있다고 생각하면 아래의 그림처럼 이뤄져 있을 것이다.

  • 쓰레드A안에는 A1, A2, A3 등의 요소가 들어가 있고, 이를 스택 프레임이라고 부른다.
  • 코어는 스레드A 혹은 B, C, D등을 실행하게 된다. (한번에 하나씩)

  • 잠시 스레드A의 실행을 멈추고 스레드C 실행
  • 잠시 스레드C멈추고, D실행... B실행.. 다시 A실행.. 반복 (While 완료될떄까지)

이 과정을 스케줄링 하는 방법을 간단하게 살펴보자

스케줄링?

스케줄링(scheduling)은 다중 프로그래밍을 가능하게 하는 운영 체제의 동작 기법이다. 운영 체제는 프로세스들에게 CPU 등의 자원 배정을 적절히 함으로써 시스템의 성능을 개선할 수 있다
https://ko.wikipedia.org/wiki/%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81_(%EC%BB%B4%ED%93%A8%ED%8C%85)

  • 각 프로세스의 스레드는 운영체제 내부에 있는 스케줄링 큐에 들어가게 되고, CPU(코어)는 이 스케줄링 큐에 들어가있는 순서대로 작업(연산)을 진행한다.

운영체제 내부의 스케줄링 큐는 여러가지 존재 한다.

  • 새로운 큐 (New Queue): 새로 생성된 프로세스나 스레드가 초기화 대기 중 목록.
  • 레디 큐 (Ready Queue): CPU를 사용하기 위해 준비가 완료된 프로세스나 스레드의 목록.
  • 실행 상태 (Running State): CPU에서 현재 실행 중인 프로세스나 스레드 목록.
  • 블록 큐 (Blocked Queue): I/O 작업이나 자원 요청으로 인해 실행이 지연되고 있는 프로세스나 스레드의 목록.
  • 종료 큐 (Terminated Queue): 실행이 완료되거나 종료된 프로세스나 스레드의 목록.

동작 설명

실제로 스케줄링 큐는 다양한 알고리즘에 의해서 최적화 되고있다. (라운드 로빈, FIFO, 우선순위 등등)
해당 설명은 FIFO 관점에서의 간단한 설명이며, 실제 FIFO의 동작 원리와 맞지 않을 수 있다.

그럼 스레드 A 작업중, B, C를 들린 경우, 어디서 부터 다시 진행 해야될까?

처음부터는 다시 실행하면 너무 비효율 적이지 않을까?

따라서, 스레드A가 멈추는 시점에 CPU에서 사용하던 값과 위치를 저장해 두고, 다시 A작업을 할때 복귀한다.

컨텍스트 스위칭

멀티테스킹은 반드시 효율적인 것 만은 아니다.

  • 스레드 A, 스레드 B가 있고, 이 작업을 멀티테스킹을 진행한다면, 중지된 시점에서 진행중이던 스레드의 작업 진행 위치를 저장할 필요가 있다.
  • 저장하지 않는다면, 처음부터 다시 작업을 해야되는 비효율성이 발생될 것이다.
  • 이를 위해 스레드의 작업 위치를 정지 시점에서 저장하고, 다시 불러오는 것을 컨텍스트 스위칭 이라고 한다.
  • 위의 STEP3, STEP5 에서 진행하게 될 것이다.

스레드 작업의 종류

쓰레드가 하는 작업은 크게 2가지 이다

  • CPU-바운드 작업
    • CPU의 연산 능력을 많이 요구하는 작업
    • 계산, 알고리즘 처리, 데이터 처리 등 CPU의 처리속도가 작업 완료 시간을 결정하는 경우이다.
    • 제안 Thread 개수 : CPU 코어 수 + 1개
  • I/O 바운드 작업
    • 디스크, 네트워크, 파일 시스템 등과 같은 입출력(I/O) 작업을 많이 요구하는 작업을 의미한다.
    • I/O 작업이 완료될 떄까지 대기 시간이 많이 발생하며, CPU는 상대적으로 유휴 상태에 있는 경우가 많다.
    • 스레드가 CPU를 사용하지 않고, I/O 작업이 완료 될 때까지 대기한다.
    • 제안 Thread 개수 : CPU 코어 수 보다 훨신 많은 수의 Thread
      • 작업 자체가 CPU를 많이 사용하지 않으므로, 최대한 많은 Thread를 성능 테스트를 통해 생성.
      • 단, 너무 많은 Thread는 컨텍스트 스위칭 비용도 증가하므로, 최소 성능 기준을 정하고, 그 성능을 충족하는 최소한의 Thread를 생성하는 것을 추천 한다.

웹 어플리케이션 서버

  • 웹 어플리케이션 서버는 I/O 바운드 작업을 하는 경우가 많다.
  • 따라서, CPU 갯수+1 에 해당하는 Thread 수보다 더 많은 수의 Thread를 생성하는 것을 추천한다.
  • Spring Boot 의 기본 내장 Tomcat은 최대 스레드 수 (maxThreads): 200, 최소 스레드 수 (minSpareThreads): 10 이라는 Default 설정 값을 가지고 있다.
  • 웹 어플리케이션 서버에서 Thread동시 접속자 수와 밀접한 관계가 있다. 기본적으로 1가지의 요청을 처리하는데 Thread가 하나가 필요한데, Thread가 4로 되어있다면, 최대 4명의 동시 요청만 처리 가능하다는 뜻이다.
  • 성능 테스트를 통해서 최적의 Thread 숫자를 찾는 것이 가장 이상적인 방법이다.
profile
현재 블로그 이전 중입니다. https://blog.baekgwa.site/

0개의 댓글