운영체제의 자원 관리
운영체제의 주요 기능은 컴퓨터 자원을 효과적으로 관리하는 것이다. 컴퓨터의 핵심 하드웨어 자원인 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에 인터럽트를 발생 시켜 보고하는 역할
참고
운영체제와 정보기술의 원리