09-1. 운영체제를 알아야 하는 이유
운영체제, 문제해결
컴퓨터 구조에서 학습한 부품들을 관리하는 특별한 프로그램인 운영체제를 학습
운영체제(operating system)
사용자가 실행하는 응용 프로그램이 올바르게 실행되도록 돕고 자원을 할당해 주는 프로그램
✔️시스템 자원(자원) : cpu, 메모리, 보조기억장치, 입출력장치 ➡️ 모든 프로그램이 실행되기 위해 필요
운영체제도 프로그램이므로 다른 프로그램(인터넷 브라우저, 게임 등)처럼 메모리에 적재되어야 한다.
✔️메모리
- 커널 영역(kernel space) : 컴퓨터 부팅될 때 항상 운영체제가 적재
- 사용자 영역(user space) : 사용자가 이용하는 응용 프로그램 적재
➡️ 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 올바르게 실행되도록 한다.
- 프로그램 적재 : 메모리에 겹치지 않도록
- 메모리 자원 관리 : 실행 끝나면 삭제하는 등
📍 응용 프로그램(application software) : 특정 목적을 위해 사용하는 일반적인 프로그램
하드웨어를 조작하고 관리하는 일을 운영체제가 하므로 개발자는 간편하게 개발이 가능
하지만 결국 하드웨어가 프로그램을 실행하고, 하드웨어를 운영체제가 조작하는데, 운영체제는 프로그램이라 개발자와 대화가 가능해 문제 해결의 실마리를 찾을 수 있다.
09-2. 운영체제의 큰 그림
커널, 이중 모드, 시스템 호출, 운영체제 서비스
커널을 이해하고, 응용 프로그램이 어떻게 운영체제의 도움을 받으며 실행되는지, 응용 프로그램에 어떤 서비스를 제공하는지 학습
운영체제의 심장, 커널(kernel)
운영체제의 핵심 서비스를 담당하는 부분
어떤 커널을 사용하는지에 따라 실행하고 개발하는 프로그램이 하드웨어를 이용하는 양상이 달라지고, 컴퓨터 전체의 성능도 달라질 수 있다. 대부분의 운영체제 전공서는 운영체제의 핵심부인 커널을 설명한다.
✔️ 사용자 인터페이스(UI) : 운영체제가 제공하는 서비스 중 커널에 포함되지 않은 서비스 - 윈도우 바탕화면
- 그래픽 유저 인터페이스(GUI) : 그래픽 기반으로 컴퓨터와 상호작용
- 커맨드 라인 인터페이스(CLI) : 명령어 기반 컴퓨터 상호작용
이중 모드와 시스템 호출
사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하고 운영체제를 통해서만 접근하도록 해 자원을 보호한다.
e.g. 하드 디스크에 접근해 데이터를 저장하려고 운영체제 도움 요청 ➡️ 운영체제가 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행해 작업 대신 수행
이중모드(dual mode)
cpu가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
cpu는 명령어를 사용자 모드로써, 커널 모드로써 실행할 수 있다.
플래그 레지스터 속 슈퍼바이저 플래그를 통해 사용자 모드인지 커널 모드인지 확인 가능
✔️ 사용자 모드
- 운영체제 서비스 제공받을 수 없는 실행 모드 = 커널 영역의 코드를 실행할 수 없는 모드
- 일반적인 응용프로그램 디폴트 실행모드
- 하드웨어 자원에 접근 불가
✔️ 커널 모드(kernel mode)
- 운영체제 서비스 제공받는 실행 모드 = 커널 영역의 코드 실행 모드
- 모든 명령어 실행 가능
- 자원 접근 가능
시스템 콜, 시스템 호출(system call)
사용자 모드에서 커널 모드로 전환해 운영체제 서비스 제공받을 수 있다
일종의 소프트웨어적인 인터럽트이다.
➡️ 소프트웨어 인터럽트 : 인터럽트를 발생시키는 특정 명령어에 의해 발생
- 시스템 콜 실행
- cpu는 백업 후 커널 영역 내의 시스템 콜 수행 코드 실행 (인터럽트 서비스 루틴)
- 기존에 실행한 응용 프로그램으로 복귀해 실행
e.g. hdd에 데이터 저장하려면?
- hdd에 데이터 저장하는 시스템콜 발생시켜 커널 모드로 전환
- 운영체제 내의 hdd에 데이터를 저장하는 코드 실행해 hdd 접근
- 다시 사용자 모드로 복귀해 실행 계속
운영체제의 핵심 서비스
프로세스 관리
- 실행중인 프로그램 = 프로세스
- 일반적으로 1 cpu 1 프로세스 실행 ➡️ 프로세스들 번갈아 가며 실행
- 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행
- 여러 프로세스 동시에 실행 시 프로세스 동기화 필수
- 교착 상태 해결해야 함
자원 접근 및 할당
✔️ CPU
운영체제가 프로세스들에 공정하게 cpu를 할당하기 위해 어떤 프로세스부터, 얼마나 이용하게 할지를 cpu 스케쥴링 통해 결정
✔️ 메모리
프로세스에 어떻게 메모리를 할당하고, 메모리 부족한 경우 어떻게 하는지
✔️ 입출력장치
인터럽트 서비스 루틴은 커널 영역이다. (하드웨어 인터럽트도 마찬가지)
운영체제는 인터럽트 서비스 루틴을 제공해 입출력 작업 수행
✔️ 파일 시스템 관리
📍
개발자가 작성하는 프로그래밍 언어들은 내부적으로 시스템콜을 통해 실행된다.
printf도 내부적으로 시스템콜 통해 실행된다.
10-1. 프로세스 개요
프로세스, 프로세스 제어 블록, 문맥 교환, 프로세스 사용자 영역
운영체제의 핵심 서비스인 프로세스 관리 학습
- 프로세스 실행 전 : 보조기억장치에 있는 데이터 덩어리
- 프로세스 생성 : 메모리에 적재 후 실행하는 순간 프로세스
프로세스
- 포그라운드 프로세스(foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process) : 사용자가 보지 못하는 뒤에서 실행되는 프로세스
- 사용자와 상호작용하는 백그라운드 프로세스
- 데몬(daemon) : 사용자와 상호작용하지 않고 정해진 일을 수행하는 프로세스
모든 프로세스가 cpu동시에 사용할 수 없어 돌아가며 한정된 시간 만큼 cpu 사용
자신의 차례에 정해진 시간만큼 cpu 이용 후 타이머 인터럽트 발생 시 다음 차례 기다림
📍 타이머 인터럽트(타임아웃 인터럽트) : 클럭 신호 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
프로세스 제어 블록(PCB, process control block)
프로세스와 관련된 정보를 저장하는 자료 구조
- 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보 판단
- 커널 영역에 생성
- 프로세스 생성 시 만들어지고 실행 종료되면 폐기
- 새로운 프로세스 생성 = 운영체제 PCB 생성
- 프로세스 종료 = 운영체제 PCB 폐기
✔️ 프로세스 ID(PID)
: 프로세스 식별 위해 부여하는 고유한 번호
같은 일 수행하는 프로그램도 두번 실행하면 PID가 다른 두 개의 프로세스 생성
✔️ 레지스터 값
: 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용한 레지스터 중간값 복원해 이전까지 진행했던 작업 이어 실행
✔️ 프로세스 상태
✔️ 메모리 관리 정보
: 프로세스마다 메모리에 저장된 위치가 달라 주소 정보를 알아야 한다.
베이스 레지스터, 한계 레지스터, 페이지 테이블 정보 등이 담긴다.
✔️ 사용 파일과 입출력장치 목록
: 실행 과정에서 특정 입추력장치나 파일 사용 시 PCB에 해당 내용 명시
➡️ 커널 영역에 적재된 PCB 통해 프로세스 관리
문맥 교환
기존 프로세스 문맥을 PCB에 백업하고, 새 프로세스 실행 위한 문맥을 PCB로부터 복구하여 새 프로세스 실행하는 것
문맥(context)
하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
PCB에 기록되는 정보들을 문맥이라고 볼 수 있다.
인터럽트 발생 시 운영체제는 해당 프로세스의 PCB에 문맥을 백업 후 이어 실행할 프로세스의 문맥을 복구
➡️ 문맥 교환이 자주 발생하면 그만큼 빨리 번갈아 수행되므로 프로세스들이 동시에 실행되는 것처럼 보인다.
❓ 너무 자주 하면 오버헤드 발생 가능
프로세스의 메모리 영역
📍 프로세스 생성 시
- 커널 영역 : PCB 생성
- 사용자 영역 : 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 하나의 프로세스가 나뉘어 저장된다.
정적 할당 영역
크기가 고정된 영역
✔️ 코드 영역(code segment) = text segment
: 기계어로 이루어진 명령어 저장 ; read-only 공간
✔️ 데이터 영역(data segment)
: 프로그램이 실행되는 동안 유지할 데이터 저장 (e.g. 전역변수)
동적 할당 영역
프로세스 실행 과정에서 크기가 변할 수 있는 영역
✔️ 힙 영역 (heap segment)
: 프로그래머가 직접 할당할 수 있는 저장 공간
➡️ 힙 영역에 메모리 공간 할당했으면 반환해야 한다.
❓ 메모리 누수(memory leak) : 메모리 공간 반환하지 않아 메모리가 낭비되는 문제
✔️ 스택 영역(stack segment)
: 데이터를 일시적으로 저장하는 공간 (e.g. 매개 변수, 지역 변수)
- PUSH : 일시적으로 저장할 데이터 저장
- POP : 필요하지 않은 데이터 사라짐
➡️ 겹치지 않기 위해 힙영역은 낮은 주소에서 높은 주소로(아래 -> 위), 스택 영역은 높은 주소에서 낮은 주소로 할당
10-2. 프로세스 상태와 계층 구조
프로세스 상태, 부모 프로세스, 자식 프로세스, 프로세스 계층 구조
프로세스들은 각자의 상태를 가지고 계층적 구조를 이루고 있다. 프로세스 상태, 계층 구조 알아보고 코드 통해 확인
프로세스 상태
✔️ 생성 상태(new)
: 막 메모리에 적재되어 PCB 할당 받은 상태
✔️ 준비 상태(ready)
: 당장 cpu할당 받으면 실행할 수 있지만, 자신의 차례가 아니라 기다리고 있는 상태
✔️ 실행 상태(running)
: cpu 할당받아 실행 중인 상태. 일정 시간 동안만 cpu 사용이 가능
타이머 인터럽트 발생 시 준비 상태로 바뀌고 입출력 장치 사용 시 대기 상태가 된다.
✔️ 대기 상태(blocked)
: 입출력장치 작업을 기다리는 상태(특정 이벤트가 일어나길 기다릴 때 대기 상태가 되는데 대부분이 입출력 작업이 원인)
입출력 작업은 cpu에 비해 처리 속도가 느려 입출력장치가 입출력 완료 인터럽트 받을 때까지 대기 상태
➡️ 입출력 작업 완료 시 다시 준비 상태로 바뀜
✔️ 종료 상태(terminated)
: 프로세스가 종료된 상태. 운영체제는 PCB와 프로세스가 사용한 메모리 정리
프로세스 계층 구조
프로세스는 시스템콜을 통해 다른 프로세스를 생성할 수 있다.
- 부모 프로세스(parent process) : 새 프로세스 생성한 프로세스
- 자식 프로세스(child process) : 부모 프로세스에 의해 생성된 프로세스
각각 다른 PID를 가지는데 일부 운영체제에서 PPID(자식 프로세스의 PCB에 부모 프로세스의 PID)가 기록되는 경우도 있다.
자식 프로세스도 또 다른 자식 프로세스 생성 가능 ➡️ 계층 구조로써 프로세스 관리
최초의 프로세스 : init(유닉스) systemd(리눅스) launchd(macOS). PID는 항상 1
프로세스 생성 기법
부모 프로세스를 통해 생성된 자식 프로세스들은 시스템 콜인 복제(fork)와 옷 갈아입기(exec)를 통해 실행
- fork : 부모 프로세스가 자신의 복사본을 자식 프로세스로 생성
- 부모 프로세스의 자원(메모리 내용, 파일 목록 등) 상속 (PID 값이나 저장된 메모리 위치는 다르다)
- exec : 자신의 메모리 공간을 새로운 프로그램으로 덮어씀
- 복제된 자식 프로세스에 새로운 프로그램 내용을 덮어써서 다른 프로그램이 된다.
- 새로운 프로그램 내용으로 전환하여 실행
- PCB의 PID와 PPID는 exec 하기 전과 후가 같다.
- exec 호출 시 코드 영역과 데이터 영역의 내용은 실행할 프로그램의 내용으로 바뀌고 나머지영역은 초기화
- fork후 exec 호출 안하면 그냥 부모 프로세스 복제본이므로 자식 프로세스는 부모 프로세스와 같은 코드 실행하는 프로세스
e.g. bash 셸에 ls -> 셸 프로세스는 fork 로 자신과 동일한 프로세스 생성 -> 자식 프로세스는 exec 통해 ls 명령어 실행 위한 프로세스로 변경되고 메모리 공간에는 ls 실행 위한 내용들로 채워진다.
📌 파이썬으로 프로세스 다루기
1. 프로세스 만들기
2. 자식 프로세스 생성하기
📍__name__ == '__main__'
: 현재 파일이 직접 실행된 경우에만 특정 코드를 실행
3. 동일한 작업을 하는 프로세스 만들기
4. 각기 다른 작업을 하는 프로세스 생성하기
📌 기본숙제
프로세스 상태 다이어그램
10-3. 스레드
스레드, 멀티프로세스, 멀티스레드
스레드가 뭔지, 멀티스레드와 멀티프로세스의 차이가 무엇인지 학습
📍 스레드(thread)
: 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 스레드 가질 수 있다.
- 스레드를 이용해 하나의 프로세스에서 여러 부분을 동시에 실행 가능
프로세스와 스레드
✔️ 단일 스레드 프로세스
: 실행의 흐름 단위가 하나라 한 번에 하나의 부분만 실행
e.g. 웹 브라우저 실행한 후 게임프로세스 실행한 후 워드 프로세서 실행
✔️ 멀티 스레드 프로세스
: 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 됨 = 프로세스 구성하는 여러 명령어 동시에 실행
📍 스레드는 프로세스 내의 각기 다른 스레드ID, PC값, 레지스터 값, 스택으로 구성돼서 스레드마다 각기 다른 코드를 수행할 수 있다.
➡️ 필요한 최소의 정보만 유지하고 프로세스 자원을 공유하며 실행
➡️ 스레드1만의 코드/데이터/힙 영역이 있는 것이 아님(스택은 각각)
대부분의 운영체제는 cpu에 처리할 작업 전달할 때 스레드 단위로 전달하고, 스레드는 프로세스 자원 공유하며 실행에 필요한 최소한의 정보만으로 실행
➕ 리눅스는 프로세스와 스레드를 통합해 task로 명명
일종의 실행의 문맥(context of execution)으로 동등하게 간주
멀티프로세스와 멀티스레드
- 멀티프로세스 : 여러 프로세스를 동시에 실행
- 멀티스레드 : 여러 스레드로 프로세스를 동시에 실행
✔️ 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 vs 하나의 프로세스를 여러 스레드로 실행
: 프로세스끼리는 자원 공유하지 않으므로 프로세스 fork해 같은 작업 하면 모든 자원이 복제돼 메모리 적재되므로 메모리에 동일한 내용이 중복 존재하므로 낭비이다.
- 스레드들은 최소한의 정보만 유지하고 자원을 공유하므로 메모리를 효율적으로 사용
- 프로세스의 자원을 공유하므로 독립적인 프로세스와 달리 서로 협력과 통신에 유리
❓ 프로세스의 자원을 공유하므로 단점이 될 수 있다.
멀티프로세스는 한 프로세스에 문제생겨도 독립적이므로 다른 프로세스에 지장이 적거나 없는데 멀티스레드는 하나의 스레드에 문제생기면 다른 스레드도 영향을 받는다.
프로세스 간 통신(IPC)
기본적으로 자원을 공유하지 않지만, 프로세스끼리 자원을 공유하고 데이터를 주고받는 것
- 파일을 통한 프로세스 간 통신 : 프로세스A는 파일에 값을 쓰는 프로세스, 프로세스 B는 읽는 프로세스면 두 프로세스는 파일 속 데이터를 주고받으므로 프로세스 간 통신이 필요
- 공유 메모리(shared memory) : 서로 공유하는 메모리 영역을 두고 데이터 주고받는 것
- 전역 변수 사용 시
- 소켓, 파이프로 통신
📌 파이썬으로 스레드 다루기
1. 코드로 스레드 만들기
2. 동일한 작업을 하는 스레드 생성하기
3개의 스레드지만 동일한 프로세스를 공유하고 있다.
스레드 ID는 다르지만 PID는 동일하다
3. 다른 작업을 하는 스레드 생성
11-1. CPU 스케쥴링 개요
CPU 스케쥴링, 우선순위, 스케쥴링 큐, 준비 큐, 대기 큐, 선점형 스케쥴링, 비선점형 스케쥴링
운영체제는 cpu를 어떻게 프로세스에 배분하는지 학습
CPU 스케쥴링(cpu scheduling) : 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것
프로세스 우선순위
- 프로세스마다 우선순위가 달라 cpu요청 순서대로 하는 것은 효율적이지 못하다.
- 프로세스 상황에 맞게, 중요도에 맞게 프로세스가 cpu를 이용할 수 있도록 운영체제가 프로세스마다 우선순위를 부여한다.
- 운영체제가 PCB에 우선순위를 명시하고, 우선순위를 기준으로 먼저 처리할 프로세스를 결정한다.
➡️ 우선순위가 높을수록 더 빨리, 자주 실행(e.g. 입출력 작업이 많은 프로세스, 실시간 프로세스, 일부 백그라운드 프로세스 등)
프로세스 종류
✔️ 입출력 버스트(I/O burst) : 입출력장치 기다리는 작업
✔️ CPU 버스트(CPU burst) : CPU 이용하는 작업
- 입출력 집중 프로세스(I/O bound process) : 비디오 재생이나 디스크 백업 작업을 담당하는 등 입출력 작업이 많음
- 실행 상태보다 입출력을 위한 대기 상태에 더 많이 있음
- 입출력 버스트가 많은 프로세스
- CPU 집중 프로세스(CPU bound process) : 복잡한 수학 연산, 컴파일, 그래픽 처리 작업을 담당하는 등 cpu 작업이 많음
- 대기 상태보다 실행 상태에 더 많이 있음
- cpu 버스트가 많은 프로세스
일반적으로 CPU 버스트와 입출력 버스트를 반복하며 실행된다.
cpu집중 프로세스와 입출력 집중 프로세스를 동일한 빈도로 cpu를 사용하는 것은 비합리적이다.
입출력업이 많은 프로세스를 빨리 실행시켜 입출력장치를 작동시킨 후 cpu집중 프로세스에 집중적으로 cpu를 할당하는 것이 효율적이다. 어차피 입출력 작업 완료될때까지 대기 상태가 될 예정이기 때문!
📍 프로세스 우선순위 확인하기
PRI 값을 통해 확인할 수 있고, nice 명령을 통해 일부 프로세스의 우선순위를 변경할 수 있다.
스케쥴링 큐
❓
- PCB에 우선순위가 적혀있어도, 운영체제가 CPU 사용할 다음 프로세스를 찾기 위해 모든 프로세스의 PCB를 확인하는 것은 비효율적
- 메모리에 적재되거나 특정 입출력장치나 보조기억장치 사용 원하는 경우도 많은데 하나 하나 PCB 검사하는 것은 비효율적
❗️
스케쥴링 큐를 통해 필요한 자원에 따라 프로세스를 줄세우고 관리한다. (스케쥴링에서의 큐는 반드시 FIFO일 필요 없다)
- 준비 큐 (ready queue) : CPU를 이용하고 싶은 프로세스들이 서는 줄
- 대기 큐 (waiting queue) : 입출력장치를 이용하기 위해 대기 상태인 프로세스들이 서는 줄
- 하드 디스크 대기 큐
- 프린터 대기 큐 ...
운영체제가 프로세스들의 PCB들이 큐에 삽입된 순서대로 실행 + 우선순위가 높은 프로세스 먼저 실행
✔️ 입출력 작업 완료 인터럽트 발생 시
: 운영체제는 대기 큐에서 작업이 완료된 PCB 찾고 준비 상태로 변경 후(준비 큐로 이동) 대기 큐에서 제거
선점형과 비선점형 스케쥴링
- 선점형 스케쥴링 (preemptive scheduling) : 이미 cpu 쓰고 있어도 프로세스로부터 자원을 강제로 뺏어 다른 프로세스에 할당할 수 있는 스케쥴링 방식 (대부분의 운영체제 차용)
- 하나의 프로세스가 자원 독점 불가
- 프로세스마다 정해진 시간만큼 cpu 사용하고 시간 다 쓰면 타이머 인터럽트 발생해 cpu자원 빼앗아 다른 프로세스에 할당
- 자원을 골고루 배분할 수 있지만 문맥 교환 과정에서 오버헤드 발생 가능
- 비선점형 스케쥴링 (non-preemptive scheduling) : 하나의 프로세스가 자원 사용중인 경우 스스로 대기 상태에 가거나 종료되기 전까지 다른 프로세스가 끼어들 수 없는 스케쥴링 방식
- 하나의 프로세스가 자원 독점 가능
- 문맥 교환 시 발생하는 오버헤드가 적지만 당장 자원을 사용해야 하는 경우 무작정 기다려야 한다.
11-2. CPU 스케쥴링 알고리즘
선입 선처리 스케쥴링, 최단 작업 우선 스케쥴링, 라운드 로빈 스케쥴링, 우선순위 스케쥴링, 다단계 피드백 큐 스케쥴링
기본적인 스케쥴링 알고리즘 학습
선입 선처리 스케쥴링 (FCFS 스케쥴링, First Come First Served Scheduling)
준비 큐에 삽입된 순서대로 프로세스들을 처리하는 비선점형 스케쥴링 방식
❓ 호위 효과
CPU를 오래 사용하는 프로세스가 먼저 삽입 시 나머지 프로세스들이 기다리는 시간이 매우 길어질 수 있다.
최단 작업 우선 스케쥴링 (SJF 스케쥴링, Shortest Job First Scheduling)
준비 큐에 삽입된 프로세스 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케쥴링 방식
기본적으로 비선점형
라운드 로빈 스케쥴링 (round robin scheduling)
FCFS + 타임 슬라이스(각 프로세스가 CPU를 사용할 수 있는 정해진 시간)
정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU 이용하는 선점형 스케쥴링
삽입 순서대로 CPU 이용하고, 타임 슬라이스 전부 소진했는데도 완료 안됐으면 큐의 맨 뒤에 삽입 - 문맥 교환 발생
✔️ 타임 슬라이스 크기가 매우 중요
- 너무 크면 : FCFS와 똑같아 호위 효과 발생 가능
- 너무 작으면 : 문맥 교환 발생 비용 커서 오버헤드 발생 가능
최소 잔여 시간 우선 스케쥴링 (SRT, Shortest Remaining Time)
SJF + 라운드 로빈 알고리즘
정해진 타임 슬라이스만큼 CPU 사용하고 CPU 사용할 다음 프로세스로는 작업 시간이 가장 적은 프로세스 선택
우선순위 스케쥴링 (priority scheduling)
프로세스들의 우선순위 부여 후 가장 높은 우선순위부터 실행
- 최단 작업 우선 스케쥴링 : 작업시간 짧은 것에 높은 우선순위
- 최소 잔여 시간 우선 스케쥴링 : 남은 시간이 짧은 프로세스에 높은 우선순위
❓ 기아 현상 (starvation)
: 우선순위가 낮은 프로세스는 준비 큐에 먼저 삽입됐더라도 실행이 계속해서 연기될 수 있다.
❗️ 에이징(aging)
: 오래 대기한 프로세스들의 우선순위를 점점 높이는 방식
다단계 큐 스케쥴링 (multilevel queue scheduling)
우선순위별로 준비 큐 여러 개 사용
1. 우선순위가 가장 높은 큐의 프로세스들 먼저 처리
2. 우선순위가 가장 높은 큐가 비어 있으면 그 다음 우선순위 큐의 프로세스 처리
프로세스 유형별로 우선순위를 구분하여 실행할 수 있고, 큐별로 타임 슬라이스를 여러 개 지정이 가능하고, 큐마다 다른 스케쥴링 알고리즘을 사용할 수 있는 것이 장점이다.
❓ 프로세스가 큐 사이 이동이 불가능해 우선순위가 낮은 프로세스가 실행이 연기되는 기아 현상이 발생가능
다단계 피드백 큐 스케쥴링 (multilevel feedback queue scheduling)
다단계 큐 스케쥴링에서 프로세스들이 큐 사이 이동 가능해 기아 현상 보완 (가장 일반적인 스케쥴링 알고리즘)
새로 준비 상태 프로세스를 우선순위 높은 큐에 삽입 후 타임 슬라이스동안 실행
프로세스가 끝나지 않으면 다음 우선순위 큐에 삽입 후 실행
➡️ 실행이 끝나지 않으면 계속 우선순위가 밀린다
➡️ CPU 오래 사용하는 CPU 집중 프로세스들의 우선순위가 낮아지고, 입출력 집중 프로세스들은 우선순위가 높은 큐에서 실행
❗️ 낮은 큐에서 너무 오래 있으면 우선순위가 높은 큐로 이동시키는 에이징 기법 통해 기아 현상 예방 가능
📌 추가 숙제
Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기 |
선입선출은 큐에 삽입된 순서대로 프로세스를 처리하므로 A, B, C, D 순으로 CPU를 할당받는다.
'CS > 혼자 공부하는 컴퓨터 구조 + 운영체제' 카테고리의 다른 글
[혼공학습단 13기] 6주차 : 가상 메모리 | 파일 시스템 (0) | 2025.02.20 |
---|---|
[혼공학습단 13기] 5주차 : 프로세스 동기화 | 교착 상태 (0) | 2025.02.13 |
[혼공학습단 13기] 3주차 : 메모리와 캐시 메모리 | 보조기억장치 | 입출력장치 (0) | 2025.01.20 |
[혼공학습단 13기] 2주차 : CPU의 작동 원리 | CPU 성능 향상 기법 (0) | 2025.01.19 |
[혼공학습단 13기] 1주차 : 컴퓨터 구조 시작하기 | 데이터 | 명령어 (0) | 2025.01.16 |