//구글콘솔 광고 추가가
페이징의 이점은 외부단편화만 있는 것이 아니다!
쓰기 시 복사도 있다!
쓰기 시 복사( 프로세스 간에 페이지 공유할 수 있다의 대표적 예시)
 - 이론적인 fork()시스템 호출 :
>> 프로세스는 기본적으로 자원을 공유하지 않는다. >> 부모 프로세스가 적재된 별도의 공간이 자식 프로세스가 통째로 복제(부모 프로세스 복사본)되어 적재.
>> 단점: 프로세스 생성 시간 지연, 메모리 낭비(동일한 내용이 메모리에 중복해서 적재되기 때문)

이를 해결하는 방법쓰기시 복사 방법.
- 쓰기시 복사: 
>> 부모 프로세스와 동일한 자식 프로세스가 복제되어 생성되면 자식 프로세스는 부모 프로세스와 동일한 프레임을 가리킴(쓰기 작업없다면 이 상태 유지). 
>> 프로세스는 기본적으로 자원을 공유하지 않는다. 라고 말했듯이 부모 프로세스 / 자식 프로세스 둘 중 하나가 페이지에 쓰기 작업 수행 시 해당 페이지는 별도의 공간으로 복제됨.
>> 장점 : 프로세스 생성 시간 절약, 메모리 절약(중복해서 메모리를 저장하지 않기 때문.) 
프로세스 테이블의 크기는 생각보다 작지 않다.
프로세스를 이루는 모든 페이지 테이블 엔트리를 메모리에 두는 것은 큰 낭비.
프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않을 방법이 바로 계층적 페이징

 

계층적 페이징 (== 다단계 페이지 테이블)

- 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식. 페이지 테이블을 여러 페이지로 쪼개고 이 페이지를 가리키는 페이지 테이블(Outer페이지 테이블)을 두는 방식.

- 모든 페이지 테이블을 항상 메모리에 있을 필요가 없어짐.

>> CPU와 가장 가까이 위치한 페이지 테이블(Outer 페이지 테이블)은 항상 메모리에 유지, 필요한 페이지들만 메모리에 유지하면 됨.

- 계층적 페이징을 이용하는 환경에서의 논리 주소  

논리 주소의 구조
바깥 페이지 번호 안쪽 페이지 번호 변위
1. 바깥 페이지 번호를 통해 페이지 테이블의 페이지를 찾기.
2. 페이지 테이블의 페이지를 통해 프레임 번호를 찾고 변위를 더함으로서 물리 주소 얻기.

 

페이징을 통해 물리 메모리보다 큰 프로세스를 실행할 수 있지만,
그럼에도 물리 메모리의 크기는 한정되어 있다.
운영체제는 기존에 적재된 불필요한 페이지를 선별해 보조기억장치로 내보내고(=페이지 교체 알고리즘으로 해결) 프로세스들에게 적절한 수의 프레임을 할당해야 한다. 
요구 페이징

- 처음부터 모든 페이지를 적재하지 않고 필요한 페이지만을 메모리에 적재하는 기법. 요구되는 페이지만 적재하는 기법.

요구페이징이 실행되는 기본적인 양상
1. CPU가 특정 페이지에 접근하는 명령어를 실행한다.
2. 해당 페이지가 현재 메모리에 있을 경우(유효비트가 1일 경우) CPU는 페이지가 적재된 프레임에 접근한다.
3. 해당 페이지가 현재 메모리에 없을 경우(유효비트가 0일 경우) 페이지 폴트가 발생한다.
4. 페이지 폴트 처리 루틴은 해당 페이지를 메모리로 적재하고 유효 비트를 1로 설정한다.
5. 다시 1번을 수행한다.

요구 페이징 시스템이 안정적으로 작동하려면 해결해야 할 2가지 문제.
1. 페이지 교체.
2. 프레임 할당. 

>> 요구 페이징 기법으로 페이지들을 적재하다 보면 언젠간 메모리가 가득 차게 됨.
당장 실행에 필요한 페이지를 적재하려면 적재된 페이지를 보조기억장치로 내보내야 하는데, 이때 어떤 페이지를 내보낼지 결정하는 방법(알고리즘)이 바로 페이지 교체 알고리즘.
페이지 교체 알고리즘
>> 여러가지가 있지만 그중 제일 중요하게 생각해야 하는 게 바로 페이지 폴트가 적은 페이지 교체 알고리즘!!!

- 페이지 폴트가 발생하면 보조기억 장치에 접근해야 해서 성능이 저하되기 때문이다.

페이지 폴트 횟수는 어떻게 알수 있을까?
- 페이지 참조열(page reference string) : CPU가 참조하는 페이지들 중 연속된 페이지를 생략한 페이지열.
CPU가 논리 주소를 통해 특정 주소를 요구하는데 메인 메모리에 올라와 있는 주소들은 페이지의 단위로 가져오기 때문에 페이지 번호가 연속되어 나타나게 되면 페이지 결함이 일어나지 않음. 따라서 CPU의 주소 요구에 따라 페이지 결함이 일어나지 않는 부분은 생략하여 표시하는 기법을 페이지 참조열이라 한다. 
여러 페이지 교체 알고리즘들 중 세가지
FIFO 페이지 교체 알고리즘 - 가장 단순한 방식.
- 메모리에 가장 먼저 올라온 페이지부터 내쫓는 방식.
- "오래 머물렀다면 나가."
<단점>
- 프로그램 실행 초기에 잠깐 실행될 페이지가 있을 순 있겠지만, 프로그램 실행 내내 사용될 페이지가 있을 수 있는데 이런 페이지의 경우엔 먼저 적재되어 있다고 내쫓아선 안됨.
<보완책>
- 2차 기회(second-change) 페이지 교체 알고리즘(참조비트를 통해 내쫓을지 말지 한번의 기회를 더 줌)
 * 참조비트 1 : CPU가 한 번 참조한 적이 있는 페이지.>> 내보내지 않고, 적재된 시간을 현재 시간으로 설정,맨끝으로 보냄.(가장 최근에 적재된 페이지로 간주)
즉, 한번더 기회를 줌.(참조비트 0으로 초기화 후 적재 시간을 현재 시간으로 설정.)
 * 참조비트 0 : CPU가 참조한 적이 없는 페이지.  >> 내쫓음.
최적 페이지 교체 알고리즘 - CPU에 의해 참조되는 횟수를 고려.
- 메모리에 오래 남아야 할 페이지는 자주 사용될 페이지.
- 메모리에 없어도 될 페이지는 오랫동안 사용되지 않을 페이지.
- 앞으로의 사용 빈도가 가장 낮은 페이지를 교체하는 알고리즘. 
- 가장 낮은 페이지 폴트율을 보장하는 페이지 교체 알고리즘.
- BUT, 실제 구현이 어렵다.

-"앞으로 오랫동안 사용되지 않을 페이지? 어떻게 예측하지??"
- 다른 페이지 교체 알고리즘 성능을 평가하기 위한 척도로서 하한선으로 간주. 
LRU(Least- Recently-Used)
페이지 교체 알고리즘
- 최적 페이지 교체 알고리즘: 가장 오래 사용되지 페이지 교체 방식.
- LRU 페이지 교체 알고리즘: 가장 오래 사용되지 페이지 교체 방식.
   - "최근에 사용되지 않은 페이지는 앞으로도 사용되지 않지 않을까??"

 

 

페이지 폴트가 자주 발생하는 이유는
나쁜 페이지 교체 알고리즘을 사용했거나, 프로세스가 사용할 수 있는 프레임 자체가 적어서!! 

 

스래싱과 프레임 할당
< 스레싱 >
- 프로세스가 실행되는 시간보다 페이징에 더 많은 시간을 소요하여 성능(CPU이용률)이 저하되는 문제를 말함.
- 동시 실행되는 프로세스의 수를 늘린다고 CPU 이용률이 높아지는 것은 아님.  
- 근본적인 이유 :
>> 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문.
>> 각 프로세스가 필요로 하는 최소한의 프레임 수를 파악하고, 프로세스들에게 적절한 프레임을 할당해줘야 한다.

< 프로세스의 크기나, 물리 메모리의 크기를 통한 프레임 할당 방식 2가지 >
1. 균등 할당(equal allocation) :
가장 단순한 할당 방식. 모든 프로세스들에게 균등하게 프레임을 할당하는 방식.
>> 권장은 ㄴㄴ. 상대적으로 크기가 큰 프로그램(게임)과 작은 프로그램(메모장)에게 똑같은 프레임을 할당한다 생각해 봐.
2. 비례 할당(proportional allocation) :
프로세스의 크기를 고려. 프로세스 크기에 비례하는 프레임 할당.
>> 완벽한 방식은 ㄴㄴ. 크기가 큰 프로세스인데 막상 실행해 보니 많은 프레임을 필요로 하지않거나, 크기가 작은 프로세스인데 막상 실행해보니 많은 프레임이 필요한 경우가 있기 때문. 결국 프로세스가 필요로 하는 프레임 수는 실행해 봐야 안다.
** 균등할당과 비례할당은 프로세스의 실행과정은 고려하지 않고 단순히 프로세스의 크기나, 물리 메모리의 크기만을 고려한 방식이라 정적 할당 방식이라 부름.

< 프로세스를 실행하는 과정에서 프레임을 결정하는 방식 2가지 >
1. 작업 집합 모델 사용 방식 : 
프로세스가 실행하는 과정에서 배분할 프레임 결정. 스레싱이 발생하는 이유는 빈번한 페이지 교체 때문이기에 CPU가 특정 시간 동안 주로 참조한 페이지 개수만큼만 프레임을 할당하면 된다. 
"프로세스가 일정 기간 동안 참조한 페이지 집합"을 기억하여 빈번한 페이지 교체를 방지하는 방식이 작업집합 모델 기반의 프레임 할당 방식. 
** 작업 집합이란 "실행 중인 프로세스가 일정 시간 동안 참조한 페이지의 집합".
- 작업집합을 구하려면??
> 1. 프로세스가 참조한 페이지
> 2. 시간 간격이 필요함.
2. 페이지 폴트 빈도 기반의 프레임 할당 방식 :
프로세스가 실행하는 과정에서 배분할 프레임 결정.
- 두 개의 가정에서 생겨난 아이디어 
1. 페이지 폴트율이 너무 높으면 그 프로세스는 너무 적은 프레임을 갖고 있다.
2. 페이지 폴트율이 너무 낮으면 그 프로세스가 너무 많은 프레임을 갖고 있다.
페이지 폴트율에 상한선과 하한선을 정하고, 그 내부 범위 안에서만 프레임을 할당하는 방식.
** 작업 집합 모델 사용방식과 페이지 폴트 빈도 기반의 프레임 할당 방식은 프로세스가 실행하는 과정을 통해서( == 관찰함으로써) 프레임을 할당하는 방식이라 동적할당 방식이라 부름. 

 

728x90

+ Recent posts