//구글콘솔 광고 추가가
연속 메모리 할당 : 프로세스에 연속적인 메모리 공간을 할당.

 

운영체제가 메모리를 관리하는 기본적인 기능 중 하나, 스와핑
: 현재 사용되지 않는 프로세스들을 보조기억장치의 일부 영역으로 쫓아내고 그렇게 생긴 빈 공간에 당장 사용할 새 프로세스 적재

스와핑

- 이점: 프로세스들이 요구하는 메모리 공간 크기 > 실제 메모리 크기
- 스왑영역 크기 확인하기 : free, top명령어로 확인 가능
연속 메모리 할당

- 프로세스는 메모리의 빈 공간에 할당되어야 한다. 빈 공간이 여러개 있다면?

어떤 빈 공간에 할당 될지에 따라 최초 적합, 최적 적합, 최악 적합의 세 가지 방식이 있다.

최초 적합(first-fit) 최적 적합(best-fit) 최악 적합(worst-fit)
- 운영체제가 메모리 내의 빈 공간을 순서대로 검색하다 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식.
- (빈 공간)검색 최소화, 빠른 할당.
-운영체제가 빈 공간을 모두 검색해본 뒤, 적재 가능한 가장 작은 공간에 할당. - 운영체제가 빈 공간을 모두 검색해본뒤, 적재 가능한 가장 큰 공간에 할당.
**연속 메모리 할당의 두가지 문제점
사실, 프로세스를 연속적으로 메모리에 할당하는 방식은 메모리를 효율적으로 사용하는 방법이 아님.
>> 1. 외부 단편화(external fragmentation)이라는 잠재적 문제가 발생하기 때문.
>> 2. 물리 메모리보다 큰 프로세스 실행 불가.

- 외부 단편화란?
: 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상.  남아있는 총 메모리 공간이 요청한 메모리 공간보다 크지만, 남아있는 공간이 연속적이지 않아 발생하는 현상.
>>해결 방법:
1. 메모리 압축 방식(conpaction) : 여기 저기 흩어져 있는 빈 공간들을 하나로 모으는 방식. 프로세스를 적당히 재배치시켜 흩어져 있는 작은 빈 공간들을 하나의 큰 빈 공간으로 만드는 방법.
2. 가상메모리 관기법 : 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술. 페이징( 현재 대부분의 운영체제가 사용하는 방법.)과 세그멘테이션이 있음.
외부 단편화가 발생했던 근본적인 문제는
각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문. 
페이징이란?
: 프로세스를 일정 크기로 자르고, 이를 메모리에 불연속적으로 할당함으로써 외부 단편화를 해결.
페이징(paging)
: 프로세스의 논리 주소 공간을 페이지(page)라는 일정 단위로 자르고,
 메모리의 물리 주소 공간을 프레임(frame)이라는 페이지와 동일한 일정한 단위로 자른 뒤
 페이지를 프레임에 할당하는 가상 메모리 관리 기법. 

- 페이징에서의 스와핑

  - 프로세스 단위의 스왑 인, 스왑 아웃이 아닌 페이지 단위의 스왑 인(페이지 인), 스왑 아웃(페이지 아웃)
  - 메모리에 적재될 필요가 없는 페이지들은 보조기억장치로 스왑 아웃.
  - 실행에 필요한 페이지들은 메모리로 스왑 인.
>> 프로세스를 실행하기 위해 모든 페이지가 적재될 필요 없다.
>> 달리 말해 물리 메모리보다 큰 프로세스도 실행될 수 있다. 

- 페이지 테이블
: (실제 메모리 내의 주소인) 물리 주소에 불연속적으로 배치되더라도,
(CPU가 바라보는 주소인) 논리 주소에는 연속적으로 배치되도록 하는 방법.
- 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표.
- 프로세스마다 페이지 테이블이 있다.
- 물리적으로는 분산되어 저장되어 있더라도 CPU 입장에서 바라본 논리 주소는 연속적으로 보임.
- CPU는 그저 논리 주소를 순차적으로 실행 하면 될 뿐임. 
- 외부 단편화를 해결하는 대신 내부 단편화라는 또 다른 부작용이 생김. 그래도 외부 단편화보다 메모리 낭비가 작음.

* 내부 단편화 : 하나의 페이지 크기보다 프로세스 크기가 작은 크기로 발생하는 메모리 낭비 문제. 주기억장치 내 사용자영역이 실행 프로그램보다 커서 프로그램의 사용 공간을 할당 후 사용되지 않고 남게 되는 현상.
(100MB의 메모리에 80MB의 크기의 프로세스를 올리게 되면 20MB의 내부 단편화가 발생.)

 

PTBR (프로세스 테이블 베이스 레지스터)
: 각 프로세스의 페이지 테이블이 적재된 주소를 가리킨다.
프로세스마다 페이지 테이블이 있고, 각 페이지 테이블은 CPU내의 프로세스 테이블 베이스 레지스터(PTBR)가 가리킨다.

PTBR

페이지 테이블이 전부다 메모리에 저장되어 있으면 부작용이 발생함. 
>> 메모리 접근 시간이 두배로 늘어남. (페이지 테이블 참조하기 위해 1번, 페이지 참조하기 위해 1번) 

이를 위해 사용하는 방식인 TLB
: CPU곁에 페이지 테이블의 캐시 메모리 이용. 페이지 테이블의 일부를 가져와 저장.
- CPU가 접근하려는 논리 주소가 TLB에 있다면? : TLB 히트 (메모리 접근 1번)
- CPU가 접근하려는 논리 주소가 TLB에 없다면? : TLB 미스 (메모리 접근 2번)
페이징에서의 주소 변환

특정 주소에 접근하고자 한다면 어떤 정보가 필요할까?

 - 이떤 페이지/ 프레임에 접근하고 싶은지, 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지에 대해 알아야 됨. (ex> 프로세스 A의 페이지 2에서 10만큼 떨어진 주소에 접근할래!)

페이지 시스템에서의 < 페이지 번호(page number)와 변위(offset) >로 이루어진 논리 주소는  >> 페이지 테이블을 통해 >> < 프레임 번호, 변위 > 로 이루어진 물리주소로 변환된다.
이 두가지의 변위는 같다.
페이지 테이블 엔트리 (PTE)
: 페이지 테이블의 각각의 행 .

현재까지 설명한 PTE: 페이지 번호, 프레임 번호. 이외에 담기는 정보는? 운영체제에 따라 달라지지만 알아보자.

1. 유효 비트 : 현재 해당 페이지에 접근 가능한지 여부. 현재 페이지가 스왑영역으로 쫓겨났는지 아닌지, 현재 페이지가 메모리에 적재돼있는지, 아닌지를 나타냄. 

- 유효 비트가 0인 페이지에 접근하려고 하면? 페이지 폴트(page fault)라는 인터럽트 발생.

** 페이지 폴트(page fault)라는 인터럽트
1. CPU는 기존의 작업 내역을 백업
2. 페이지 폴트 처리 루틴 실행
3. 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경.
4. 페이지 폴트를 처리했다면 이제 CPU는 해당 페이지에 접근할 수 있게 됨.

2. 보호 비트 : 페이지 보호 기능을 위해 존재하는 비트. 보호 비트는 페이지에 접근할 권한을 제한하여 페이지를 보호하는 비트.

3. 참조 비트 : CPU가 이 페이지에 한 번이라도 접근한 적이 있는지 여부. 

4. 수정 비트( = dirty bit) : CPU가 이 페이지에 한번이라도 데이터를 쓴 적이 있는지 여부.(수정이 됐으면 1, 안됬으면 0)

수정비트의 존재 이유는? 수정된 페이지는 스왑 아웃될 때 보조기억장치에도 쓰기 작업을 거쳐야(반영해) 하기 때문에. 

728x90

+ Recent posts