프로세스 스케줄링
프로세스(실행중인 프로그램)
은 디스크에 저장되어있던 실행 가능한 프로그램이 메모리에 적재되어 운영체제가 관리하는 상태
프로세스 상태
생성(create
) → 준비(ready
) → 실행(running
) → 대기(입출력 waiting
) → 준비(ready
) → 실행(running
) → 종료(terminated
)로 크게 5가지 상태
- runninng process가 너무 오래 선점하고 있거나 I/O 작업을 하는 경우
context switch
- 운영체제가 준비 큐(Ready Queue), 대기 큐 (Waiting Queue) 등의 자료구조를 두고 프로세스를 관리
PCB
- Process Control Block
- 스케줄링 정보
ready
, running
, waiting
등의 정보를 관리
- 하나의 프로세스 - 하나의 PCB
CPU 스케줄링
프로세스 스케줄링 조건
- 프로세스가 실행 상태(
running
)에서 대기 상태(waiting
)으로 전환될 때 - 비선점(non-preemptive
)
- 프로세스가 실행 상태(
running
)에서 준비 상태(ready
)로 전환될 때 - 선점(preemptive
)
- 프로세스가 대기 상태(
waiting
)에서 준비 상태(ready
)로 전환될 때 - 선점(preemptive
)
- 프로세스가 종료되었을 때(
terminated
) - 비선점(non-preemptive
)
CPU 스케줄링 알고리즘
스케줄링 척도 : 이용률, 처리율, 반환시간, 대기시간, 응답시간
- 기한부 스케줄링 (deadline scheduling)
- 작업들이 주어진 마감시간까지 완성하도록 계획한 스케줄링
- 우선순위 스케줄링
- 프로세스 실행 중 우선순위가 높은 프로세스를 먼저 실행하는 방식으로 우선순위가 계속 밀릴 수 있다
- 우선순위가 동적으로 바뀔 수도 있고 고정적으로 운영되기도 한다
- FCFS 스케줄링
- 비선점 스케줄링으로 프로세스가 생성된 순서대로 대기큐에 넣고 순서대로 스케줄링한다
- SJF 스케줄링
- 비선점 스케줄링으로 작업이 끝날때 실행 시간이 가장 작은 것부터 먼저 스케줄링하는 방식
- SRTF 스케줄링(
Shortest Remaining Time First Scheduling
)은 선점 SJF 스케줄링으로 프로세스가 들어오는 경우 스케줄링 발생
- Round Robin 스케줄링
- 선점 스케줄링 방식으로 FIFO처럼 순차적이지만 CPU에서 제어하는 시간을 나눈다
- CPU 시간이 마무리될때까지 작업이 끝나지 않으면 다음 프로세스로 넘어간다
멀티 스레드
- 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행
- 하나의 프로세스에 2가지 이상의 작업을 처리할 수 있는 것
- CPU 스케줄링의 기본 단위로 프로세스는 적어도 하나의 스레드를 가진다
- 멀티 스레드(
multi thread
)
- 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행
- 각 스레드가 자신이 속한 프로세스의 메모리를 공유하기 때문에 시스템 자원의 낭비가 적음
- 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋음
- 멀티 프로세스(
multi process
) : 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행
Context Switch
- 스레드가 서로 교체될 때 스레드 간의 문맥 교환(
context switch
)이 발생
- 현재까지의 작업 상태나 다음 작업에 필요한 각종 데이터를 저장하고 읽어오는 작업
멀티 스레드 스케줄링
동시성(Concurrency)
: 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행할 수 있는 성질
병렬성(Parallelism)
: 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행할 수 있는 성질
- 우선순위 방식
- 우선순위가 높은 스레드가 실행 상태를 더 많이가지도록 스케줄링
- 순환 할당 방식
- 시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다른 스레드를 실행
스레드 모델
Kernel Thread
: 운영체제가 제공하고 직접 관리하는 스레드
User Thread
: user level의 Thread 라이브러리를 통해 관리되는 스레드
- Many-To-One model
- 하나의 Kernel Thread가 다수의 User Thread를 처리하는 구조
- User Thread 처리 중 시스템 콜에 의해 블록상태가 되면 전체 프로세스가 막히는 병목 현상 발생
- One-To-One model
- User Thread 한 개 당 Kernel Thread를 대응 시켜 작업을 진행
- Kernel Thread가 과도하게 생성되는 문제
- Many-To-Many model
- 다수의 User Thread를 다수의 Kernel Thread가 처리하는 구조
- Kernel Thread의 수는 User Thread의 수보다 같거나 적게 할당
- Two-Level model
- Many-To-Many model과 One-To-One model을 합친 구조
- 중요한 작업은 One-to-One으로, 나머지는 Many-to-Many로 처리
- 중요한 작업에서의 기다림 현상을 줄일 수 있다
공용 리소스 접근
Mutex
- 화장실이 하나밖에 없는 식당과 비슷
- 카운터에 키가 있으면 화장실에 사람이 없는 것이고 화장실에 들어갈 수 있다
- 다른 사람이 오더라도 카운터에 키가 없기때문에 기다리게 된다
→ key에 해당하는 오브젝트
가 있으며 이 오브젝트를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다
Semaphore
- 화장실 입구에는 화장실의 빈 칸 개수를 보여주는 판이 있다
- 화장실이 가득 찼으면 기다리게 된다
- 사람이 나오면 숫자가 늘어나고 기다리던 사람이 들어가게된다
→ 공통으로 관리하는 하나의 값
을 통해 상호배제를 달성
참고자료
http://www.tcpschool.com/java/java_thread_multi
https://seamless.tistory.com/42
https://worthpreading.tistory.com/90