• 연속 메모리 할당
프로세스 A B C D가 있을때
메모리 안에서 연속적으로 A의 크기만큼 메모리 할당후 B의 크기.. C.. D.. 형태로 메모리를 할당하는 걸
연속 메모리 할당이라고 한다
이렇게 연속적으로 메모리를 할당할때 고려할 점과 잠재적인 문제점을 알아보면..
• 스와핑
메모리에 적재된 프로세스 중 현재 실행되지 않는 프로세스를 보조 기억 장치로 보내고, 이렇게 얻은 공간에
다른 프로세스를 적재해서 실행하는 방법
쫒겨난 프로세스가 가는 보조기억장치의 영역을 스왑 영역 이라고 하고 스왑 영역으로 가는 걸 스왑 아웃,
스왑 영역에서 다시 메모리로 옮겨오는 것을 스왑 인 이라고 한다
스와핑을 통해 실제 메모리 사이즈보다 요구하는 메모리가 큰 경우에도 프로세스들을 동시에 실행할 수 있다
• 메모리 할당
프로세스를 메모리 내에 적제할때 어디로 배치할지에 대한 방식 3가지
- 최초 적합
빈 공간에 들어갈 수 있으면 바로 넣는 방식, 검색을 최소화하고 빠른 할당이 가능하다
- 최적 적합
빈 공간을 모두 검색하고 프로세스를 적재할 수 있는 공간 중 가장 작은 공간에 적재하는 방식
- 최악 적합
빈 공간을 모두 검색한후 가장 큰 공간에 적재하는 방식
• 가상 메모리
실행하려는 프로그램의 일부만 메모리에 적재하여 실제 물리 메모리보다 더 큰 프로세스를 실행하는 방법
여기서는 가상 메모리 방식 중 페이징을 알아보자
• 외부 단편화
프로세스를 메모리에 연속적으로 할당하면 외부 단편화가 발생한다
프로세스를 연속적으로 할당한 후 각 프로세스가 종료되는 순서는 순차적이지 않다
중간 중간 프로세스가 먼저 종료되서 50MB가 생겼다고 해도 50MB 크기의 프로세스를 새로 적재 할 수는 없다
이런 식으로 연속적으로 메모리를 할당 - 실행 - 종료가 반복되고 빈 공간보다 큰 프로세스를 적재하지 못해서
낭비하는 현상을 외부 단편화라고 한다
외부 단편화를 해결하는 방안으로 메모리를 압축(메모리의 빈 공간을 하나로 모으는 방식)하는 방식이 있다
하지만 압축 방식을 통해서 외부 단편화를 줄이기 위해 시스템은 하던 일을 중지해야 하고, 메모리에 있는 내용을
옮기느라 많은 오버헤드가 발생하게 된다
그러므로 외부 단편화를 없애기 위해서 다른 해결 방법인 페이징 기법이 등장하게 되었다!
• 내부 단편화
페이징을 통해 외부 단편화 문제를 해결 할 수 있었다..만 내부 단편화 문제가 생길 수 있다
프로세스의 크기가 깔끔하게 페이지 단위로 나누어 떨어지지 않을 수 있다.
1512KB 크기의 프로세스를 10KB단위로 페이징하면 마지막엔 10KB페이지에 2KB만 들어가게 된다
그럼 페이지 크기를 줄여서 내부 단편화를 작게하면?
내부 단편화는 페이지 크기보다 작은 사이즈로 발생한다. 페이지 크기를 줄이면 내부 단편화를 줄일수 있지만
페이지 크기가 작아질 수록 페이지 테이블의 크기는 커지기에 내부 단편화를 적당히 줄이면서 페이지 테이블의 크기도
너무 크지 않게 페이지의 크기를 조정하는게 필요하다
• 페이징
연속 메모리 할당에서는 서로 크기가 다른 프로세스를 통짜로 메모리에 연속적으로 할당해서 외부 단편화가 생기게 된다
메모리와 프로세스를 일정한 단위로 자르고 불연속적으로 할당 한다면 외부 단편화가 발생하지 않게 된다
페이징은 프로세스의 논리 주소 공간을 페이지라는 일정 단위로 자르고, 메모리 물리 공간을 프레임이라는 페이지와 동일한 크기로 자른 후 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다
페이징에서도 스와핑 처럼 페이지 단위로 페이지 아웃/페이지 인이 가능하다
프로세스의 일부를 메모리에 적재 할 수 있으니 실행에 필요한 페이지만 메모리에 실행하고 당장은 필요없는 페이지를
보조기억장치에 남겨두는 방식으로 사용 가능하다
이와 같은 방식을 통해 물리 메모리보다 큰 크기의 프로세스를 실행가능하다
• 페이지 테이블
그러나 프로세스가 메모리에 불연속적으로 배치된 경우에는 CPU가 프로세스의 페이지가 어디에 있는지 알 수 없기에
순차적으로 실행하는 것이 어려워진다
이를 해결하기 위해 페이징 시스템은 물리적으로 불연속적이라도 논리 주소에는 연속적으로 배치되게 페이지 테이블을
이용한다
페이지 테이블에서 페이지 번호화 프레임 번호를 매칭해주기에 페이지 테이블을 통해 CPU가 페이지 번호를 보고 해당
페이지가 적재된 프레임을 찾아갈 수 있다
결과적으로, CPU는 논리 주소를 순차적으로 실행하면 된다
프로세스마다 각자의 페이지 테이블을 가지고 있고, CPU내에 PTBR(페이지 테이블 베이스 레지스터)는 각 프로세스의
페이지 테이블이 적재된 주소를 가리키고 있다
프로세스 A가 실행중일 때는 PTBR이 A의 페이지 테이블을 가리키고 CPU는 프로세스 A의 페이지가 적재된 프레임을
알 수 있다, 다른 프로세스를 실행 중에는 PTBR이 해당 프로세스의 페이지 테이블을.. 이런 식으로 동작한다
• TLB
페이지 테이블을 두면 메모리에 접근할때 페이지 테이블을 보기 위해 한번, 다시 프레임에 접근하기 위해 한번
총 일을 두번하게 된다
이런 문제를 해결 하기 위해서 CPU 근처에 TLB라는 페이지 테이블의 캐시 메모리를 두고 참조 지역성에 근거해
최근 사용된 페이지 위주로 페이지 테이블의 일부 내용을 저정한다
TLB 히트가 되는 경우에는 메모리 접근을 한 번만 하면 되지만 TLB 미스가 나는 경우에는 페이지 테이블에 접근해서
프레임을 알아와야 한다
• 페이징에서 주소 변환
하나의 페이지나 프레임은 여러 주소를 포괄하고 있다
특정 주소에 접근하려면 어떤 페이지나 프레임에 접근할건지, 접근하려는 주소가 페이지나 프레임에서 얼마나 떨어졌는지
에 대한 정보가 필요하다
그렇기에 페이징 시스템에서 논리 주소는 페이지 번호와 변위로 이루어져 있다
32비트에서 N비트는 페이지 번호, 32 - N 비트는 변위로 이루어진다
변위는 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지 알기 위한 정보이다
페이지 테이블을 통해 논리주소<페이지 번호, 변위>를 물리 주소<프레임 번호, 변위>로 변환한다
• 페이지 테이블 엔트리
페이지 테이블에서 각각의 행들은 페이지 테이블 엔트리라고 한다
페이지 테이블 엔트리에는 페이지 번호, 프레임 번호 이외에도 유효비트, 보호비트, 참조비트, 수정비트가 있다
- 유효 비트
페이지 접근 가능 여부를 알려준다
페이지가 메모리에 적재되어 있으면 1, 페이지가 보조기억장치에 잇으면 0인 비트
유효 비트가 0인 상태에서 페이지에 접근하려고 하면 페이지 폴트라는 예외가 발생한다
페이지 폴트가 발생하면 HW인터럽트를 처리하는 것 처럼 아래의 과정으로 처리한다
1. 작업 내용 백업
2. 페이지 폴트 처리 루틴 실행
3. 페이지를 메모리로 가져오고 유효비트를 1로 변경
4. CPU가 해당 페이지 접근
- 보호 비트
보호 비트는 페이지의 RW 여부를 판별한다
보호비트가 0이면 읽기만 가능하고 1이면 읽기/쓰기가 모두 가능하다
코드 영역에 있는 페이지에 쓰기를 시도하면 OS가 이를 막아주는 방식으로 페이지를 보호한다
자주 보던 r-w-x 의 형태로 보호비트를 구현 할 수도 잇다
읽기 쓰기 실행을 1 - 0의 상태로 표현한다
- 참조 비트
CPU가 이 페이지에 접근한 적이 있으면 1, 아니면 0으로 표현
- 수정 비트
해당 페이지에 데이터를 써서 변경된 적이 있으면 1, 아니면 0으로 표현
수정 비트를 통해서 페이지를 메모리에서 꺼낼때 보조기억장치에 쓰기 작업을 할지 안할지를 판단
내용이 수정된 페이지는 수정 비트가 1로 변경되고 스왑 아웃 할때 변경한 값을 보조기억장치에 기록한다
• 쓰기 시 복사
페이징을 통해 외부 단편화를 해결하는 점 이외에도 프로세스 간에 페이지를 공유할 수 있다는 이점이 있다
fork 시스템 콜을 할때 메모리에 중복 저장하지 않고 자식 프로세스가 부모 프로세스의 프레임을 가리키게 할 수 있다
부모 프로세스의 메모리 공간을 복사하지 않고도 동일한 코드 및 데이터 영역을 가리키는 방법이다
프로세스 간에 자원을 공유하지 않기에 부모나 자식 중 하나가 페이지에 쓰기 작업을 하면 쓰기 작업을 하는 페이지가
그 때 해당 페이지를 복사하고 자기가 복사한 프레임을 가리키게 한다
쓰기 시 복사를 통해 프로세스 생성 시간을 줄이고 메모리 공간 절약이 가능하다
• 계층적 페이징
프로세스를 이루는 페이지 테이블 전부를 메모리에 두지 않을 수 있는 방법
페이지 테이블마저 페이징해서 다단계 페이지 테이블로 두는 기법
페이지 테이블을 여러 개의 페이지로 자르고, 잘린 페이지 테이블의 페이지를 가리기게 하는 방식
이렇게 페이지 테이블을 계층적으로 구성해서 필요한 페이지 테이블만 메모리에 올려서 사용하는 방식
논리주소도 <변위,페이지 번호>에서 <바깥 페이지 번호, 안쪽 페이지 번호, 변위>로 변화한다
- 바깥 페이지 번호 : CPU와 근접한 곳에 위치한 페이지 테이블 엔트리
- 안쪽 페이지 번호 : 페이지 테이블의 페이지 번호
더 많은 계층이 있는 계층적 페이징도 가능하지만, 페이지 폴트가 일어나면 메모리 참조하는 횟수도 많아지게 된다
알아서 쓰는 방식인 것 같다
'학교 강의 > 운영체제' 카테고리의 다른 글
스래싱 & 프레임 할당 (0) | 2024.07.21 |
---|---|
요구 페이징 & 페이지 교체 알고리즘 (0) | 2024.07.21 |
교착상태 (0) | 2024.07.10 |
프로세스 동기화 (0) | 2024.07.09 |
CPU 스케줄링 (1) | 2024.07.09 |