728x90
운영체제의 메모리 관리
- 프로그램이 CPU에서 실행되려면 실행에 필요한 부분이 메모리에 올라와 있어야 한다.
- 동시에 여러프로그램이 수행되는 환경에서는 한정된 메모리 공간을 여러 프로그램이 조금씩 나눠 사용하는데
OS가 적절히 프로세스에 메모리를 할당해야 한다. - 메모리 할당 방법
- 균등 할당 : 프로세스마다 동일한 메모리를 할당하는 방식
- 비례 할당 : 프로세스의 크기에 비례하게 메모리를 할당하는 방식
- 우선 순위 할당 : 우선순위가 높은 프로세스에게 더 많은 메모리를 할당하는 방식
- 운영체제는 CPU에서 당장 수행해야 하는 부분만 디스크에 올리고 나머지는 디스크의 swap영역으로 놓았다가 다시 필요해지면 기존에 메모리에 있었던 부분과 교체하는 방식을 사용한다.
- 이처럼 메모리의 연장공간으로 디스크의 swap영역을 사용하게 된다면 물리적 메모리 크기에 대한 제약을 고려할 필요가 없어진다.
가상메모리
- 프로그램이 자기 자신만의 가상 메모리를 사용하는 것처럼 가정해 프로그램 하는 것을 지원한다.
- 가상 메모리 주소 공간은 논리적 주소로서 모든 프로그램마다 0부터 시작
- 프로세스마다 논리적 주소 공간을 가지고 이 주소공간의 일부는 물리적 메모리에 적재되고 일부 swap영역에 존재
가상메모리의 장점
- 메모리 사용량 감소 (프로세스 일부만 올리니까)
- 입출력 오버헤드 감소 ( 일부만 디스크 → 메모리 입출력 하니까)
- 시스템이 더 많은 프로세스를 수용할 수 있다.
- 프로그램이 물리적 메모리의 용량 제약에서 자유롭다 (메모리보다 큰 프로그램 실행 가능)
가상메모리의 종류
- 가상메모리 기법은 프로세스의 주소공간을 적재하는 단위에 따라
- 요구 페이징 기법과 요구 세그멘테이션 기법 두개로 나눌 수 있다.
- 대부분 요구페이징 기법을 사용
*페이징(Paging) : 페이지 단위의 논리-물리 주소 관리 기법
- 하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 깨는 메모리 관리방법
- 외부 단편화가 발생하지 않으며 별도의 압축이 필요하지 않고 다양한 크기의 메모리들을 공간에 맞춰야 하는 문제를 해결해준다.
- 프로세스는 Page라 불리는 고정 크기로 분할되고
- 메모리는 Frame이라는 고정 크기로 분할된다.
*세그멘테이션(Segmentation) : 프로세스를 세그먼트의 집합이라 생각
- 페이징과 비슷하게 세그먼트 테이블을 갖고 있다.
- 세그먼트의 크기는 동일하지 않다.
- 프로세스를 논리적 내용을 기반으로 나눠서 메모리에 배치한다.
- 세그먼트의 크기는 일정하지 않기 때문에 테이블에 limit 정보가 추가로 들어간다.
- 만약 세그먼트의 크기를 초과하는 주소가 들어오면 인터럽트가 발생해 해당 프로세스는 강제종료가 된다.
1. 요구페이징(Demand Paging)
- 프로그램 실행시 프로세스를 구성하는 모든 페이지를 한꺼번에 메모리에 올리는 것이 아니라 당장 사용될 페이지만 올리는 방식.
- 프로세스의 주소공간을 메모리로 적재하는 기법
- 특정 페이지에 대해 CPU 요청이 들어온 후에 해당 페이지를 메모리에 적재
- 어떤 페이지가 메모리에 존재하고 안하는지 구별해야 한다.**없을시 Page-fault
- 요구 페이징에서는 valid-invalid bit (유효-무효비트)를 사용하여 각 페이지가 메모리에 존재하는지 표시
- CPU가 참조하려는 페이지가 현재 메모리에 올라와 있지 않아서 유효-무효 비트가 무효로 세팅되어 있는 경우를 페이지 부재라고 한다.
Page-Fault(페이지 부재)
- CPU가 접근하려는 페이지가 메모리에 없는 상황
- 페이지 테이블의 유효-무효 비트가 0인 상태(무효인 상태)
- 페이지 부재 발생 시 페이지를 디스크에서 읽어봐야 하는데 이 과정에서 막대한 오버헤드가 발생한다.
- 따라서 요구 페이징 기법은 페이지 부재 발생률이 성능에 큰 영향을 끼친다.
동작과정
1. 찾으려는 페이지가 TLB(페이지 테이블의 캐시)에 없는 경우,
해당 페이지가 메모리에 있는지 페이지 테이블에서 유효-무효 비트를 확인한다.
2. 유효-무효 비트가 0이라면 **MMU(Memory Management Unit)**가
페이지 부재 트랩(소프트웨어 인터럽트)을 발생시킨다.
- 이때 CPU 의 제어권이 커널모드로 전환되고 운영체제의 페이지 부재 처리 루틴이 호출되어 페이지 부재를 처리하게 된다.
- *MMU(Memory Management Unit)를 통해 논리주소와 물리 주소를 나누어 사용함으로써 CPU를 속이게 된다.
3~4. 페이지 부재 처리 실행
- 운영체제는 해당 페이지에 대한 접근이 문제가 없는지 확인(부재 페이지의 보호비트를 참조해서 접근 가능 체크)
- 사용되지 않은 주소 영역에 속한 페이지를 접근하려 했거나 해당 페이지가 접근 위반일 경우에는 해당 프로세스를 종료한다.
- 해당 페이지에 대한 접근이 허용 가능하다면, 물리적 메모리에서 비어 있는 프레임을 할당받아 그 공간에 페이지를 읽어온다. → 허용가능할때 페이지를 읽어오는 동안 프로세스 wait상태
- 만약 비어 있는 프레임이 없다면 기존 메모리에 올라와 있는 페이지 중 하나를 디스크의 swap영역으로 쫓아낸다. → 이처럼 이미 메모리에 있는 페이지 중 하나를 다시 backing store (swap device라는 하드웨어의 일부분인데 디스크라고 생각해도 무방하며, 페이지를 임시로 보관하는 장소)에 보내는 것을 page-out, 새로운 페이지를 메모리에 올리는 것을 page-in이라고 한다.
- (= 만약 비어 있는 프레임이 없다면 페이지 교체 알고리즘을 통해 물리적 메모리에 있는 프레임 하나를 스왑 영역으로 쫓아내 비어 있는 프레임을 만든 후 적재한다. 이때, 디스크 스왑 영역에 있던 페이지를 물리 메모리에 적재하기 위해서는 시간이 많이 걸리므로, 해당 프로세스는 CPU 제어권을 빼앗기고 현재까지의 수행 상태를 CPU 레지스터 상태 및 프로그램 카운터 값을 PCB에 저장해 준다.
5. 디스크 입출력이 완료되어 인터럽트가 발생하면, 페이지 테이블에서 해당 페이지의 유효-무효 비트를 유효 비트로 설정하고, 봉쇄되었던 프로세스를 Ready-Queue로 이동시킨다.
6. CPU를 할당 받았을 때, PCB에 있던 값을 복원하여 중단되었던 명령을 수행한다.
Swap out : swap 영역으로 데이터를 내보내는 경우
Swap in : swap 영역에서 메모리로 데이터를 가져오는 경우
Q. 페이지 부재 발생시 메모리에 해당 페이지 적재해야하는데 이때 메모리가 꽉찼다면?
가장 쓸모없는 것을 swap영역으로 쫓아내고 그 자리에 페이지 부재된 페이지를 적재해야 하는데
이러한 과정을 페이지 교체라 한다.
교체 대상이 될 프레임의 범위에 따라 전역교체와 지역교체로 나눈다.
- 전역교체 방법은 모든 페이지 프레임이 교체 대상이 될 수 있는 방법이다.
- 지역 교체 방법은 현재 수행중인 프로세스에게 할당된 페이지 프레임 내에서만 페이지 교환을 하는 방법이다.
2. 요구 세그멘테이션 기법(Demand Segmentation)
- 선형적인 실제 물리 메모리를 논리적으로 나누어져 보이게 하는 기법이 세그멘테이션
- Paged Segmentation을 사용하는 경우
- 즉, 세부적인 구현에서는 demand paging만 사용된다고 볼 수 있음.
Paged Segmentation
- 페이징과 세그멘테이션 둘 다 합치는 방법
- 세그먼트를 페이징 기법으로 나눈다
- 세그멘테이션을 먼저 수행하고 각 세그먼트 별로 페이징을 수행한다.
- 세그먼트와 페이지가 동시에 존재하기 때문에 주소 변환도 두번 해야한다는 단점이 존재한다.
'Computer Science > OS (운영체제)' 카테고리의 다른 글
[linux] GUI 환경 vs CLI 환경, linux 명령어 몇개 (0) | 2023.04.01 |
---|---|
[OS / 메모리] 캐시메모리(Cache Memory), SRAM(Static RAM) (0) | 2022.03.27 |
[OS] 저장장치의 구조 (0) | 2022.03.20 |
[OS] 입출력 시스템(I/O system) (0) | 2022.03.20 |
[OS] 컴퓨터 시스템의 발전 (0) | 2022.03.18 |