티스토리 뷰
모든 프로그램은 우선 메모리에 적재되어야 실행이 가능하므로 메모리는 프로그램을 실행하는 중요한 작업 공간이다. 그리고 다중 프로그래밍 환경에서는 한정된 메모리를 여러 프로세스가 함께 사용하므로 이를 효율적으로 관리하는 방법이 필요하다. 메모리 관리는 프로세스들을 위해 메모리를 할당하고 제거하며 보호하는 활동이다.
메모리 관리와 관련된 주요 정책
1. 적재 정책 : 디스크에서 메모리로 프로세스를 반입할 시기를 결정하는 것. (요구적재, 예상적재)
2. 배치 정책 : 디스크에서 반입한 프로세스를 메모리 어느 위치에 저장할 것인지 결정. 최초적합, 최적적합, 최악적합 등
3. 대치 정책 : 메모리가 충분하지 않을 때 현재 메모리에 할당된 프로세스 중 제거할 프로세스를 결정하는 교체 방법. 선입선출, 최근최소사용방법
논리적 주소 : 가상 주소, 프로그래머가 프로그래밍에 사용하는 주소
물리적 주소 : 논리적 주소에 대응하여 적재하는 실제주소로 메모리 칩이나 디스크 공간에서 만든다.
논리적, 물리적 주소의 변환은 메모리관리장치 MMU가 처리
바인딩 : 두 주소를 연결, 매핑 시켜주는 작업
메모리 할당 방법
1. 연속 메모리 할당 : 연속적으로 적재
2. 비연속(분산) 메모리 할당 : 페이지나 세그먼트 단위로 나눠 여러 곳에 적재
연속 메모리 할당
1. 단일 프로그래밍 환경
메모리를 제어하는 모든 권한이 사용자에게 있기 때문에 사용자 주소를 잘못 지정하면 운영체제가 손상.
=> 경계(한계) 레지스터를 두어 이를 방지.
=> 이런 메모리 할당 시스템의 문제는 사용자 프로그램의 적재. 사용자 프로그램의 시작 주소는 기준 레지스터 값 이후잉므로 기준 주소가 변하면 다시 적재해야 함. 다음 두가지 방법으로 운영체제의 동적 변화에 대비
a. 사용자 프로그램을 기준 레지스터보다 상위 메모리에 적재하는 것
b. 주소 바인딩을 연기하는 것. ex) 기준 값이 1400이라면 주소 346은 1746으로 대체
단일 프로그래밍 환경에서 연속 메모리 할당은 단순, 이해하기 쉬움. but 한번에 프로그램 하나만 사용가능, 메모리 효율 x
2. 다중 프로그래밍 환경
a. 고정 분할 방법(메모리를 여러 개의 고정된 크기로 분할)
논리적 주소가 분할된 메모리보다 크면 오류 발생, 작으면 내부 단편화 발생.(남은 공간을 활용하려고 처리하는 비용큼)
=> 내부 단편화는 스케줄링과 분할크기에 따라 메모리 낭비가 발생
=> 여러 프로세스가 메모리에 상주하므로 이 프로세스를 보호할 수 있는 메모리 보호 방법이 필요.
=> 기준 레지스터, 경계 레지스터 사용
고정 분할 방법에서는 프로그래밍의 성능이 분할 수에 제한을 받는다.(2,6,12kb의 내부 단편화가 생겼다고 생각) 성능을 향상시키려면 메모리 분할, 작업 큐와 관련된 분할 영역의 크기, 영역의 배치를 결정해야 한다.
b. 가변 분할 방법(필요한 만큼만 메모리를 할당)
가변 분할 방법에서는 기준 레지스터와 경계 레지스터를 사용하여 각 프로세스를 나타낸다. 가변 분할 방법에서는 운영체제가 메모리의 어느 부분을 사용하고 있는지 알 수 있는 테이블을 유지해야 한다. 사용 가능 공간을 어느 작업에 할당하는 것이 가장 좋은지 결정하는 일반적인 메모리 배치 방법으로 다음 알고리즘이 있다.
-최초 적합 : 프로세스를 사용 가능 공간 중 충분히 큰 첫번째 공간에 할당. 빠르지만 공간 활용률이 떨어질 수 있다.
-최적 적합 : 프로세스를 충분히 큰 사용 가능 공간 중에서 들어갈 수 있는 가장 작은 공간에 할당. 전체를 검색해야 되서 할당 과정에 많은 시간이 소요될 수 잇다.
-최악 적합 : 프로세스를 가장 큰 사용 가능 공간에 할당한다. 전체를 검색해야된다. 최적적합보다 메모리 활용 면에서 더 유용
가변 분할에서는 외부 단편화 문제가 발생한다. 프로세스들을 메모리에서 제거하고 새로운 프로세스를 적재할 때 사용 가능 공간을 작게 나눈다. 이것은 프로세스들이 연속된 메모리를 차지하는 과정에서 공백이 발생하기에 사용 가능 공간을 여러 개의 작은 공간으로 단편화할 수 있는 것이다.
=> 낭비를 해결하는 방안 : 메모리 통합과 압출 방법
메모리 통합 방법 : 하나의 작업이 끝났을 때 다른 빈 공간과 인접해 있는지 점검하여 하나로 합치는 것.
메모리 압축 방법 : 메모리의 내용을 적절히 움직여 사용 가능 공간을 큰 블록 하나로 만드는 것
c. 다중프로그래밍 환경의 버디 시스템
버디 시스템은 큰 버퍼들을 반복적으로 이등분하여 작은 버퍼들을 만들며, 가능할 때마다 인접한 빈 버퍼들을 합치는 과정을 반복.
분산 메모리 할당
1. 페이징
페이징은 작업을 크기가 동일한 페이지로 나눠 처리하는 방법이다. 즉, 프로세스를 크기가 동일한 페이지로 나누고, 메인 메모리도 프레임(페이지 프레임)이라는 고정 크기 블록으로 나눠 이 프레임에 페이지를 적재하는 방법이다.
페이징 테이블을 이용하여 논리적 주소를 물리적 주소로 변환한다.
-- 프로세서가 만드는 논리적 주소는 페이지 번호와 오프셋으로 구성. 페이지 번호 p를 페이지 테이블의 색인으로 사용하여 p 위치에 저장된 f 값을 얻는다. f는 메모리의 페이지 기준 주소로, 메인 메모리의 프레임 번호이다. 따라서 기준 주소 f에 오프셋 d를 더하면 메인 메모리의 물리적 주소가 된다. 이때 오프셋은 페이지 프레임 크기보다 작아야 한다.
외부단편화는 일어나지 않지만 내부단편화가 일어난다.
다중단계 페이징 시스템 : 논리적 주소가 클수록 물리적 주소로 변환하는 과정에서 필요한 페이지 테이블 크기도 증가하므로 메모리에 더 큰 적재공간이 필요(메모리 낭비)하다. 이 문제는 실제 참조할 페이지가 있는 영역에서만 단계별(n단계) 페이지 테이블을 설정하는 페이징 시스템을 구성하여 해결할 수 있다.
페이지 테이블은 크기가 매우 커서 관리가 중요. 가장 간단한 방법은 전용 레지스터를 사용하는 것.
연관 레지스터를 이용하여 논리적 주소를 물리적 주소로 변환하는 방법에는 직접매핑, 연관매핑, 연관직접매핑을 결합한 주소 변환이 있다.
공유페이지 : 공유 페이지는 페이징 시스템의 장점으로 시분할 환경에서 중요한 공통 코드를 공유할 수 있게 한다. 공유 코드는 재진입을 허용하므로 재진입 코드 또는 순수 코드라고 한다. 오직 읽을수만 있고, 스스로 수정하지는 못하며, 프로세스들은 재진입 코드에서 데이터 항목을 지정할 수 없다.
2. 세그먼테이션
페이징은 물리적 주소를 크기가 고정된 페이지로 분할하여 프로세스를 할당한다. 그러다 보니 사용자 프로그램과 프로세스 관점의 메모리가 일치하지 않는다. 이와 달리 세그먼테이션은 프로세스 관점을 지원하여 메모리를 크기가 변할 수 있는 세그먼트로 나눈다. 즉 페이징이 분산 적재라면 세그먼테이션은 각 크기에 따른 분산적재이다.
가변 크기 분할 방법처럼 세그먼테이션도 보통 최적 적합 알고리즘이나 최초적합 알고리즘으로 해결하는 동적 메모리 할당 방법을 이용한다.
페이징 vs 세그먼테이션
페이징은 물리적 주소 없이도 큰 가상 주소 공간이 가능하게 하려고 등장했다.
세그먼테이션은 프로그램과 데이터를 논리적으로 독립된 주소공간으로 나눈고 쉽게 공유 보호할 수 있게 하려고 등장했다.
페이화된 세그먼테이션
페이징은 내부 단편화가 발생할 수 있으나, 메모리를 효율적으로 사용할 수 있다. 세그먼테이션은 외부 단편화가 발생할 수 있으나, 가변적인 데이터 구조와 모듈 처리, 공유와 보호의 지원이 편리하다. 이런 장단점을 취합한 방법이 페이지화된 세그먼테이션이다. 이 방법은 세그먼트를 페이징하여 외부 단편화 문제를 제거하면서 할당 과정을 쉽게 해결했다.
'책 > 그림으로 배우는 운영체제' 카테고리의 다른 글
운영체제 정리3(프로세스 스케줄링) (0) | 2021.06.26 |
---|---|
운영체제 정리2(병행 프로세스와 상호배제, 교착상태, 기아상태) (0) | 2021.06.25 |
운영체제 정리1(컴퓨터 시스템, 운영체제, 프로세스, 스레드) (0) | 2021.06.24 |