본문 바로가기

TIL/CS

프로세스(Process), 스레드(Thread), 스케줄링(Scheduling)

프로세스(Process), 스레드(Thread)

 

Process

 

CPU가 처리하는 작업(Task)라고도 불리며, 실행중인 프로그램을 의미한다.

구체적으로는, 보조기억장치(디스크)에 저장되어 있던 실행 가능한 프로그램이 메모리에 적재되어 OS가 관리하는 상태를 의미한다.

  • 컴퓨터에서 연속적으로 실행하고 있는 컴퓨터 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 운영체제로부터 시스템 자원을 할당받는 자원의 단위
  • 정리하면 프로그램의 실행된 부분을 의미합니다.

 

프로세스는 다음의 특징을 갖습니다.

  • 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받습니다.
    • 코드 영역(code area): 프로그래머가 작성한 프로그램이 저장되는 영역
    • 데이터 영역(data area): 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있습니다.
    • 스택 영역(stack area): 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역 변수 등이 저장됩니다.
    • 힙 영역(heap area): 동적으로 할당되는 데이터를 위해 존재합니다.
  • 최소 1개 이상의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 다른 프로세스의 자원에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC)를 사용해야 한다.
    • ex. 파이프, 파일, 소켓 등을 이용한 통신 방법
  • 그림에서 여러 프로세스가 동시에 실행되고 관리 되는 것 처럼 보인다. 하지만 CPU는 한 번에 한 가지 명령밖에 처리할 수 없다. 즉, 동시가 아니라 빠르게 프로세스들을 번갈아가면서 실행하고 관리하고 있는 것이다.

 

Thread

 

스레드란 하나의 프로세스 내에서 실행되는 하나 또는 여러개의 작업 단위이다.

프로세스가 할당받은 자원을 이용하는 실행의 단위이며, 프로세스의 메모리 구조에서 Stack 및 Register만 따로 할당받고 그 외 영역은 공유한다.

  • 프로새스 내에서 실행되는 여러 흐름의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당받은 자원을 이용하는 최소 실행 단위

 

스레드는 다음의 특징을 갖습니다.

  • 프로세스 내에서 각 필요한 Stack만 할당받고 Code, Data, Heap 영역은 공유해서 각 스레드가 공유합니다.
  • 같은 프로세스 내 스레드끼리 자원(Heap 등)을 공유하며 실행됩니다.
  • 즉, 스레드는 공유하는 자원인 Heap 영역에 있는 변수를 수정할 수 있습니다.
  • 프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생합니다.
  • 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동합니다.
  • 즉, 프로세스가 할당받은 자원을 이용하는 **처리 작업(실행의 흐름)**의 단위 입니다.

 

보통 하나의 프로세스 내에 기본적으로 하나의 스레드가 존재하며, 프로세스가 실행된다는 것은 프로세스 내부의 스레드의 흐름을 의미한다.

하나의 프로세스에 하나의 스레드만 허용하는 환경을 싱글 스레드 환경이라 하며, 싱글 스레드 환경에서는 프로세스와 스레드를 크게 구분 짓지 않아도 된다.

하나의 프로세스에 두 개 이상의 스레드가 존재하는 환경은 멀티 스레드 환경이라 하며, 대부분의 프로세스는 멀티 스레드 환경을 가지고 있다.

 

 

멀티 프로세싱 vs 멀티 스레드

 

멀티프로세싱

 

멀티 프로세스는 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것을 말한다.

여러개의 프로세스 중 한 곳에 문제가 발생하면 그 프로세스만 죽게되고 다른 프로세스에는 영향이 미치지 않는 장점이 있다.

하지만, Context Switching에서의 오버헤드가 발생하는 단점이 있는데, 이는 프로세스의 각각의 독립된 메모리 영역을 할당받아, 프로세스 간 공유하는 메모리가 없어 캐쉬 메모리 초기화 등의 무거운 작업이 진행되고, 많은 시간이 소요된다.

 

// Context Switching(문맥 전환) //

하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업

 

 

멀티 스레드

 

하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 방법

Window, Linux 등 많은 OS가 멀티 스레딩을 기본으로 하고 있다.

시스템 자원 소모 감소 시스템 처리량 증가(빠른 Context Switching), 간단한 통신 방법 등 다양한 장점이 있지만 주의 깊게 설계되어야 하고, 디버깅이 까다로우며 자원 공유의 문재(동기화)가 발생한다.

 

 

 

스케줄링(Scheduling)


스케줄링은 다중 프로그래밍을 가능하게 하는 OS의 동작 기법이다.

메모리에 적재된 프로그램을 CPU가 실행할 수 있도록, OS로 하여금 프로세스 또는 스레드에 CPU를 할당하는 것을 의미한다.

OS는 CPU의 한정된 자원으로 최대한 성능을 이끌어내기 위해 다양한 정책을 가지고 CPU를 할당한다.

 

공통 배정조건 : 오버헤드 ↓  사용률 ↑  기아현상 ↓

오버헤드 : 프로세스가 필요한 자원보다 더 많이 사용하지 않도록

사용률 : 프로세스가 최대한 자원을 많이 받고 빨리 처리하도록

기아현상 : 프로세스가 자원할당을 못 받아서 처리하지 못하고 대기하고 있지 않도록

 

목표에 따른 배정조건

1. 배치 시스템 : 가능하면 많은 일을 수행. 시간보단 처리량이 중요

2. 대화형 시스템 : 빠른 응답 시간. 적은 대기 시간이 중요

3. 실시간 시스템 : 실시간 즉, 최소 응답 시간이 중요

 

정책에 따른 3가지 분류

1. CPU 이용률을 최대화

2. 오버헤드를 최소화

3. 모든 프로세스에 공평하게 분배

 

 

CPU Burst

 - 프로세스의 사용중에 연속적으로 CPU를 사용하는 구간을 의미

 - 실제 CPU를 사용하는 스케쥴링의 단위

 

I/O Burst

 - 프로세스의 실행 중에 I/O 작업이 끝날 때 까지 Block 되는 구간을 의미

 

 

스케줄링 동작시점

 

 

스케줄링 알고리즘에 따라 프로세스들은 상태변화가 일어나며 준비/수행 상태일 때 CPU를 사용하게 된다.

 

스케줄링이 일어나는 시점은 프로세스의 상태변화에 따라 크게 네 가지로 분류할 수 있따.

 

 

1. Running 상태의 프로세스가 Wait 상태로 변화할 때

 - I/O Request가 발생하거나 생성한 자식 프로세스가 종료 대기를 할 때

 

2. Running 상태의 프로세스가 Ready 상태로 변화할 때

 - Interrupt(중단)가 발생할 때

 

3. Wait 상태의 프로세스가 Ready 상태로 변화할 때

 - I/O Request의 처리가 완료되거나 생성한 자식 프로세스가 종료되었을 때

 

4. Running 상태의 프로세스가 Terminate 상태로 변화할 때

- 프로세스가 종료될 때

 

 

만약 스케줄링에 1번과 4번 방식만 채택한다면, 이것을 비선점 스케줄링 방식(Non-Preemptive Scheduling)이라고 한다.

 

2번과 3번 방식이 채택된다면, 이것을 선점 스케줄링 방식(Preemptive Scheduling)이라고 한다.

 

비선점 스케줄링에서는 하나의 프로세스가 실행중이라면 실행도중 I/O 요청이 들어오더라고 다른 프로세스에 의해 선점되지 않고 요청에 대한 처리가 끝날때까지 기다리게 되며, 결국 해당 프로세스가 끝날때까지 CPU는 해당 프로세스만이 차지하고 있게 된다.

 

선점 스케줄링에서는 하나의 프로세스가 실행중이더라도 다른 프로세스에 의해 선점될 수 있다.

 

 

스케줄링의 종류
비선점 스케줄링(Non-Preemptive Scheduling

 

어떤 프로세스가 CPU를 할당받으면 그 프로세스가 종료되거나, I/O 요청이 발생하여 자발적으로 중지될 때 까지 계속 실행되도록 보장하는 방법

 

 - 순서대로 처리되는 공정성이 있고, 다음에 처리해야할 프로세스와 상관없이 응답시간을 예상할 수 있다.

 - 선점방식보다 스케줄러 호출 빈도가 낮고, 문맥교환(Context Switching)에 의한 오버헤드가 적다.

 - 일괄처리 시스템에 적합하며 자칫 CPU 사용시간이 긴 프로세스가 다른 프로세스들을 대기시킬 수 있으므로 처리율이 떨어질 수 있다는 단점이 있다.

 

 

비선점 1. FCFS (First Come, First Serve)

먼저 도착한 프로세스를 먼저 처리하는 기본적인 스케쥴링 알고리즘

 - FIFO큐를 이용하여 간단하게 구현된다.

 - 다만 Convoy Effect(호위효과)가 발생하는데, 긴 처리시간의 프로세스가 선점되어 버리면 나머지 프로세스들은 끝날때 까지 대기해야 한다.

 - 따라서 먼저 도착한 프로세스의 버스트 타임에 따라서 평균 대기시간의 편차가 크다. 

 

 

비선점 2. SJF (Shorted Job First)

CPU 버스트 타임이 가장 짧은, 최단 작업을 우선 스케줄링 하는 알고리즘

수행시간이 가장 짧다고 판단되는 작업을 먼저 수행

FCFS보다 평균 대기시간 감소, 짧은 작업에 유리

 

 - 가장 작은 평균 대기 시간을 달성할 수 있다.

 - 만약 CPU 버스트 시간이 동일하다면 FCFS 방식을 따름

 - 다만 선점형인 경우에는 위와 같이 진행되지만 비선점형일 경우 최소잔여시간우선 법칙을 따른다.

 

현재 CPU에 할당된 프로세스의 남은 잔여시간과, 새로 들어온 프로세스의 CPU 버스트 타임을 비교하여 더 적은 프로세스에게 할당하게끔 한다.

 

최적이긴 하지만 다음 프로세스의 버스트 시간을 계산하기 어렵다는 단점이 있어서 '비슷할것이다'라고 추측을 통해 진행하기도 한다.

 

 

비선점 3. HRN (Hightest Response-Ratio Next)

- 우선순위를 계산하여 불평등 보완(SJF 단점 보완)

- 우선순위 = (대기시간 + 실행시간) / (실행시간)

 

 

선점 스케줄링(Preemptive Scheduling)

 

OS가 CPU의 사용권을 선점할 수 있는 경우, 강제 회수하는 경우(처리 시간 예측이 어려움)

 

OS가 나서서 CPU 사용권을 선점하고, 특정 요건에 따라 각 프로세스의 요청이 있을 때 프로세스에게 분배하는 방식이다.

- 가장 자원이 필요한 프로세스에게 CPU를 분배하며 상황에 따라 강제로 회수할 수도 있음

 -따라서 빠른 응답시간을 요하는 대화식 시분할 시스템에 적합하며 긴급한 프로세스를 제어할 수 있다.

 

 

선점 1. 우선순위 스케줄링(Priority Scheduling)

 - 미리 주어진 프로세스의 우선순위에 따라서 스케줄링하는 방식

 

특징

1. 정적/동적으로 우선순위를 부여하여 우선순위가 높은 순서대로 처리

2. 우선 순위가 낮은 프로세스가 무한정 대기하는 기아 현상 발생 가능

3. Aging으로 우선순위를 증가시켜 기아현상 문제 해결 가능. 만약 우선순위가 같으면 FCFS를 적용한다.

 (Aging : 기다리는 시간에 따라 우선순위를 증가시켜주는 방식)

 

 

선점 2. 라운드로빈 (Round Robin)

 - FCFS에 의해 프로세스들이 보내지면 각 프로세스는 동일한 시간의 Time Quantum 만큼 CPU 할당

- 정해진 시간 할당량 만큼 프로세스를 할당한 뒤, 작업이 끝난 프로세스는 준비완료 큐(순환 큐)의 가장 마지막에 가서 재할당을 기다리는 방법(회전식)

- 시간할당량이 너무 작으면 빈번한 문맥 전환(Context Switching)이 발생하고, 너무 길면 FCFS와 다를 바 없어진다.

 

 

선점 3. 다단계 큐 (Multilevel-Queue)

 - 준비완료 큐를 여러개의 큐로 분류하여 각 큐가 각각 다른 스케줄링 알고리즘을 가지는 방식.

메모리 크기, 우선순위, 유형 등 프로세스의 특성에 따라 하나의 큐에 영구적으로 할당된다. 따라서 큐와 큐 사이에도 스케줄링이 필요하다. 우선순위 방식 혹은 시분할 방식으로 한다.

 

우선순위 방식

- 고정 우선순위의 선점형 방식으로 구현되며, 따라서 우선순위에 따른 큐의 스케줄링은 절대적이다.

 

예시)

더보기

우선순위가 높은 Forground Queue

 - 대화형 프로세스를 위한 큐

 - Round Robin

 

우선순위가 높은 Background Queue

 - 연산작업을 처리하는 프로세스 큐

 - FCFS

 

여기서 Forground Queue가 비어있지 않은 한 Background Queue는 먼저 실행될 수 없으며, Background Queue가 먼저 실행중이더라고 Forground Queue에 프로세스가 들어오면 선점된다.

 

 

 

1) 프로세스 : 메모리에 올라온 프로그램

2) 프로세스 생명주기 : 신규 - 준비 - 수행 - 대기 - 종료

3) PCB : 프로세스의 실행 정보와 상태 정보를 저장하는 자료구조 (PID, PC, Register, MMU 등)

4) 대기 큐 (Queue) : Job, Ready, Device Queue 등

5) Scheduler : Job, CPU, Device Schduler 등

6) Swapping : 안쓰는 프로세스 HDD로 내리고, 다시 쓰이면 메모리로 올리는 작업

7) Context Switching : Running 프로세스를 Ready로 만들고 다른 프로세스로 전환

8) Dispatcher : 컨텍스트 스위칭할 때 필요한 정보(PCB를 저장하고 꺼내는 프로그램)

9) CPU 시간공유 시스템 : (대부분의)OS에서 프로세스(스레드)가 시간단위로 나누어서 CPU를 사용할 수 있도록 관리해주는 시스템

10) 프로세스 메모리 공간 : 프로세스 주소 공간은 Code, Data, Stack, Heap 으로 구성됨

11) 커널 : 커널은 대부분의 운영 체제(OS)의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스

12) PCB : 프로세스의 실행 정보와 상태 정보를 저장하는 자료구조로 커널 프로세스에 존재

 

'TIL > CS' 카테고리의 다른 글

DBMS 발전 과정  (0) 2024.03.21
데이터베이스 시스템(DBMS) 개요  (0) 2024.03.21
데이터베이스(DB) 개요  (0) 2024.03.20
Process Management  (0) 2024.03.19
CPU, Memory  (0) 2024.03.18