운영체제의 주요 기능은 컴퓨터 자원을 효과적으로 관리하는 것이다. 컴퓨터의 핵심 하드웨어 자원인 CPU와 메모리는 CPU Scheduling(스케줄링)과 Memory Management(메모리 관리)을 통해 관리된다. 또한 주변 및 입출력 장치의 요청을 CPU가 효과적으로 처리하기 위해 Interrupt(인터럽트)를 도입했다.
1. CPU Scheduling(스케줄링)
1개의 CPU에서 다양한 프로세스를 수행하기 위해, 자원을 관리하는 방법
가장 효율적이면서, 특정 프로세스가 불이익을 받지 않도록 설정하는 것이 핵심
현재 CPU 자원을 뺏을 수 있는 스케줄링이면 Preemptive(선점형), 없으면 Non-preemptive(비선점형)이라고 함
FCFS(First Come First Serviced), Round Robin, Priority 등이 있음
Non-preemptive(비선점형)
FCFS(선입선출)
입력된 프로세스를 순차적으로 수행
CPU 연산 자체는 효율적이지만, 시스템 입장에선 비효율적
장시간 실행되는 프로세스 때문에, 전체 프로세스 실행이 느려지는 Convoy Effect 발생 문제
소수의 CPU Bound와 다수의 I/O Bound 프로세스 처리 시 문제될 수 있음
Priority(우선순위)
우선 순위가 높은 프로세스에 CPU를 먼저 할당한다.
이 경우 우선 순위가 낮은 프로세스는 계속 대기해야 하는 Starving 발생
Starving은 기다린 시간에 비례해, 우선 순위를 점차 높여주는 Aging을 사용해 해결 가능
Preemptive(선점형)
Round Robin
한 프로세스에 CPU가 할당 되는 시간을 고정 → 실행 시간이 짧은 프로세스도 실행될 수 있게 됨
프로세스 실행이 완료되지 않았다면, 그 프로세스는 Queue 맨 뒤로 보냄
프로세스의 할당 시간을 얼마로 설정할 지가 중요하다.
너무 길게 설정할 경우 선입선출과 다를게 없다.
너무 짧게 설정할 경우 Context Switching이 잦아져 오히려 성능이 하락할 수 있다.
2. Memory Management(메모리 관리)
메모리 : CPU가 직접 접근할 수 있는 컴퓨터 내부의 기억 장치
프로그램이 CPU에서 실행되려면 해당 부분이 메모리에 올라가 있어야 함
한정된 메모리로 다양한 프로그램을 사용하려면 메모리 자원 관리가 중요함
메모리 관리 개괄
메모리의 어느 부분이, 어떤 프로그램에 의해 사용되고 있는 지를 파악
프로그램의 주소(Address)를 통해 관리 됨
프로그램에 메모리가 필요할 때 할당하고, 더 이상 필요하지 않을 때 회수함
메모리 추가로 실행이 빨라지거나, 자원이 낭비될 수도 있기 때문에 효율적으로 잘 관리하는 것이 중요
다수의 프로그램이 동시에 메모리가 올라간 경우, 서로 다른 프로세스의 영역을 침범하지 않도록 보안을 유지하는 것도 중요
각 프로세스가 자신의 메모리 영역에만 접근할 수 있도록 관리해야 함
물리적 메모리 관리 방법
Fixed-partition(고정 분할), Variable-partition(가변 분할) 등의 방식이 있음
고정 분할
물리적 메모리를 몇 개의 분할로 미리 나누어 관리
각 분할에 하나의 프로그램이 적재되는 형태
변화에 대처하기 어려움
메모리에 동시 적재되는 최대 프로그램 수 = 분할 개수
분할 크기보다 큰 프로그램은 적재가 안됨
분할 크기보다 작은 프로그램을 적재할 경우, 분할 내 남는 영역이 발생
남는 영역 : Internal Fragmentation(내부 조각)
가변 분할
매 시점 프로그램의 크기에 맞게, 메모리를 분할해서 사용하는 방식
분할의 크기 때문에 프로그램 실행이 제한되지는 않음
물리적 메모리 크기를 초과하는 프로그램의 실행은 여전히 불가능함
분할의 크기와 개수가 동적으로 변하게 되기 때문에 관리 방식이 중요
프로그램에 할당되지는 않았지만, 크기가 작아 프로그램에 올리지 못하는 External Fragmentation(외부 조각)이 발생할 수 있음
가상 메모리
물리적 메모리보다 더 큰 프로그램이 실행되도록 지원
실행되는 프로그램의 크기는 가상 메모리의 크기에 의해서 결정
모든 프로그램은 물리적 메모리와는 독립적으로, 자신만의 가상 메모리 주소를 가짐
운영체제는 가상 메모리의 주소를 물리적 메모리 주소로 매핑(mapping)하여 물리적 메모리에 적재
가상 메모리가 물리적 메모리보다 더 큰 프로그램을 실행하는 방법?
프로그램이 실행 시, 모든 부분이 항상 사용되고 있는 것은 아님
현재 사용되고 있는 부분만 메모리에 올리고, 나머지는 보조 기억 장치에 저장하고, 필요할 때 적재하는 방식을 활용함
이때 사용되는 보조 기억 장치의 영역을 Swap area(스왑 영역)이라고 함
가상 메모리의 주소 공간
Page(페이지)라는 동일한 크기의 작은 단위로 나뉘어, 물리적 메모리와 스왑 영역에 저장 됨
동일한 단위로 메모리를 나누는 기법을 Paging(페이징) 기법이라고 함
3. 주변 장치 및 입출력 장치 자원 관리
Interrupt(인터럽트)를 활용해서 관리함
주변 장치들은 CPU의 서비스가 필요한 경우에 신호를 발생 시켜 서비스를 요청한다.
활용되는 신호를 인터럽트라고 부른다.
CPU는 평소에 CPU 스케줄링에 따라 작업을 수행하다가, 인터럽트가 발생하면 하던 일을 멈추고 인터럽트에 의한 요청 서비스를 수행한다.
인터럽트 발생 예시 : 사용자가 키보드에 글자를 입력한 경우
인터럽트의 활용
CPU가 인터럽트 전에 하던 작업을, 다시 재개할 수 있도록 기존에 수행하던 작업의 상태를 저장해둔다.
인터럽트의 종류는 요청하는 장치, 발생 상황에 따라 다양하다.
따라서 운영체제도 인터럽트의 종류마다 서로 다른 인터럽트 처리루틴을 가지고 있다.
주변 장치의 CPU : Controller(컨트롤러)
컨트롤러는 해당 장치에 대한 업무를 처리하고, 메인 CPU에 인터럽트를 발생 시켜 보고하는 역할