->
프로그램을 실행하려면 먼저 디스크에서 메모리로 적재해야 한다.->
여러 프로세스가 메모리에 상주할 수 있도록 OS가 동적으로 메모리를 세분화한다.->
프로세스 간의 상호 보호->
경쟁적인 프로세스들에게 적절히 나누어 할당한다.->
메모리 이용률과 시스템 처리량을 최대화 한다.->
디스크에서 메모리로 언제 들어 올지 결정하는 정책이다.
요구적재
참조 요청시 적재
예상 적재
예측되는 참조 요청까지 미리 적재
->
메모리의 어느 위치에 저장할 지 결정하는 정책이다.->
가변분할방식에서 first/best/worst fit이 있다.->
메모리가 충분하지 않을 때 현재 메모리에 적재된 내용 중 제거할 부분을 결정하는 교체 정책->
페이지 교체 알고리즘 중 FIFO, LRU, NUR 등등없다.
배치정책
예상적재
문제 : 가상주소와 물리주소의 대응 관계로 가상주소로부터 물리주소를 찾아내는 것을 무엇이라고 하는가?
정답 : 매핑
프로세스의 논리적 주소를 물리적 주소에 매핑하는 작업이다.
주소 매핑이란 논리적 주소와 물리적 주소 간의 대응을 뜻한다.
주소 바인딩의 시점은 총 세가지이다
1. 컴파일 시간
->
컴파일러가 절대 주소를 생성한다. 메모리 적재 위치를 바꾸려면 다시 컴파일한다.
2. 적재 시간
->
로더가 절대 주소를 생성한다. 이때 컴파일러는 상대 주소를 생성한다.
->
메모리 적재 위치를 바꾸려면 재적재한다.
3. 실행 시간
->
실행시간에 절대 주소를 생성한다.
->
실행 시간에 적재 위치를 이동 할 수 있다.
->
하드웨어의 지원이 필요하다(MMU, base and limit registers)
프로세스의 논리적 주소를 물리적 주소로 바꿔주는 것이다.
실행 시간
동적 링킹이라고도 한다.
프로그램 내의 루틴이 호출되는 시점에 적재를 한다.
적재가 미뤄진 라이브러리 코드는 실행 파일에 포함되지 않는다.
장점
->
프로그램 초기 적재 시간 절약 -> 실행 파일 크기가 작다.
->
메모리 절약 : 사용되지 않는 루틴은 메모리에 적재되지 않는다.
-> 사용 빈도가 낮고 크기가 큰 루틴에 유용하다 (오류처리 루틴 등)
먼저 주 프로그램이 메모리에 적재되어 실행된다.
주 프로그램이 호출한 루틴이 이미 메모리에 적재되어 있지 않다면,
재배치 가능 연결 적재기가 불려져 요구된 루틴을 메모리로 적재하고,
이러한 변경사항을 프로그램의 주소 테이블에 기록해 둔다.
그 후, CPU 제어는 그 루틴으로 보내진다.
정적적재
1. 실행 파일에 필요한 루틴들이 모두 들어 있다.
2. 실행 속도가 빠르다.
3. 메모리 효율이 낮다.
동적적재
1. 실행파일에 DLL은 포함이 되지 않는다.
->
DLL : 실행 파일에서 해당 라이브러리의 기능을 사용 시에만, 라이브러리 파일을 참조하여 호출한다.
2. 실행속도가 느리다.
3. 메모리 효율이 높다.
->
Swap Out : 프로세스가 보조기억장치로 이동->
Swap In : 프로세스가 메모리로 이동스와핑은 가상기억장치의 페이징 기법으로 발전하였다.
메모리가 모자라서 쫓겨난 프로세스는 저장장치의 특별한 공간에 모아두는데 이를 스왑영역이라고 한다.
1번
4번
연속메모리 할당
1. 한프로세스에 연속된 메모리를 할당하는 것이다.
2. OS오버헤드가 적다. 왜냐하면 주소변환이 단순하기 때문이다.
3. 프로세스의 수행시간이 짧다
4. OS의 제어가 쉽다.
5. 고정분할에 경우 내부단편화가 발생한다. 가변분할에 경우에는 발생하지 않는다.
6. 고정분할에 경우에는 외부단편화가 발생하지 않는다. 가변분할에는 발생하낟.
불연속메모리 할당
1. 한프로세스에 불연속한 메로리르 할당한다.
2. OS오버헤드가 많다. 주소변환이 복잡하기 때문이다.
3. 프로세스의 수행시간이 길다.
4. OS의 제어가 어렵다
5. 페이징의 경우에는 내부단편화가 있다. 세그먼테이션에는 없다.
6. 페이징에는 외부단편화가 없다. 세그먼테이션에는 있다.
3번
운영체제 영역과 사용자 영역으로 구분된다.
경계 레지스터를 이용하여 운영체제를 보호한다.
고정분할 방법은 다시 같은크기 분할과 다른크기 분할로 나뉜다.
할당 알고리즘은 빈공간과 프로세스의 요구 메모리량을 고려하여야 한다.
메모리를 미리 분할하여 프로세스에게 분할된 영역을 할당한다.
OS의제어가 쉽다.
내부단편화가 있다.
외부단편화가 없다.
MFT
최초적합, 최적적합, 최악적합으로 나뉜다.
분할된 부분을 탐색하면서 딱맞는 크기의 메로리홀에 넣을지 아니면 최초에 확인한 경우 홀에 넣을지 아니면 가장큰 홀에 넣을지를 결정한다.
메모리를 미리 분할하지 않고 프로세스가 요구하는 크기만큼씩 할당한다.
OS의 제어가 어렵다
내부단편화가 없다.
외부단편화가 있다.
MVT
20비트
34KiB
크기가다른 고정분할 방법
- 이 방법은 또 두가지로 나뉜다. 큐를 하나를 두는 방법과 여러개를 두는 방법
- 나뉘어진 크기가 다르기 때문에 이렇게 큐를 나누어주면 고정분할을 할 때에 최초할당을 하면서 최적할당을 함께 할 수 있다.
- 내부 단편화가 적게 발생하는 방법이다.
들어갈 수 있는 첫번째 공간에 할당을 한다.
->
가능 공간의 리스트 맨 앞 부터 검색을 한다.
->
이전 검색이 끝난 곳부터 검색을 한다.
장점
->
속도
단점
->
공간 활용률이 낮다.
들어갈 수 있는 가장 작은 공간에 할당한다.
장점
->
공간 활용률이 높다.
단점
->
할당 과정에 많은 시간이 소요된다.
->
가용 공간이 정렬되어 있지 않으면 전체를 검색해야한다.
->
가용 공간 반복 정렬이 필요하다.
들어갈 수 있는 가장 큰 공간에 할당한다.
장점
->
최적 적합보다 공간 활용률이 높다.
단점
->
할당 과정에 많은 시간이 소요된다.
->
가용 곤간이 정렬되어 있지 않으면 전체를 검색해야 한다.
->
가용 공간 반복 정렬이 필요하다.
20K공백
17K공백
32K공백
40K
20K
인접한 빈메모리를 통합한다.
메모리를 압축한다. (조각모음)
외부 단편화를 해결하기 위한 방법 중 메모리를 압축하는 방법이다.
->
압축하는 동안 시스템은 모든 일을 중지해야 한다.->
대화형 프로세스는 응답시간이 증가한다.->
실시간 시스템은 심각한 문제가 발생한다.->
프로그램을 적재할 때 재배치 관련 정보를 보관해야 한다.->
시스템 자원의 소모가 크다.고정 분할일 경우 영역별 큐 / 통합 큐 둘중에 하나를 선택해야 한다.
고정 분할일 경우 분할 영역의 크기와 개수
->
시스템 부하 분석이 필요하다
->
개수는 다중 프로그래밍의 정도이다.
->
영역의 크기에 따라 시스템 전체의 효율이 다르다.
가변 분할일 경우 메모리 압축 시기 혹은 주기
큰 공간을 반복적으로 이등분하여 공간들을 만들며, 가능할 때마다 인접한 빈 공간들을 합치는 과정을 반복한다.
->
고정 분할 방식처럼 구역이 생기고 내부 단편화가 발생한다.
->
가변 분할 방식처럼 유동적인 메모리 분할이 가능하다.
이등분 시 서로를 버디라고 한다.
6번
페이지의 크기는 2^12
가상 주소 공간의 크기는 2^18
페이지 개수는 2^6
가상 메모리 비트수는 18개
6비트, 12비트
1, 0
1, 3
2, 0
10,3
0, 256
1KB
2^6
64KB
4B
4개
2+2 = 4b
16B
4B
8개
3+2 = 5b
32B
8B
8개
64B
8B
8개
64B
2^12B
2^20개
2^32B
2^12B
2^20개
2^32B
13
15
64개
26
2^10
22
2^16
23
페이지 테이블 구현은 메모리 액세스 성능을 좌우한다.
페이지 테이블의 구현 방법
->
페이지 테이블 전용 레지스터들
->
직접매핑 : 페이지 테이블을 메모리에 적재한다.
->
연관매핑 : 페이지 테이블을 연관 기억장치에 적재한다.
->
연관.직접 결합 매핑 : 페이지 테이블의 일부는 연관 기억장치, 나머지는 메모리에 적재
페이지 테이블 전용 레지스터들
->
매우 빠른 주소 변환 가능
->
페이지 테이블 항목이 적어야 한다.
->
대부분의 컴퓨터에서 불가능하다.
직접매핑
->
페이지 테이블을 메모리에 적재
->
페이지 테이블 기준 주소는 PCB에 저장
->
페이지 테이블 기준 레지스터를 사용한다.
->
메모리 액세스 시간문제
->
프로세스 메모리 위치에 액세스할 때 항상 두번씩 액세스
연관매핑
->
페이지 테이블을 연관 기억장치에 적재
->
페이지 번호를 연관 기억장치의 모든 키와 동시에 비교하여 해당 프레임 값 추출
->
장점 : 매우 빠르게 검색 가능
->
단점 : 하드웨어가 비쌈 : 모든 프로세스의 페이지 테이블 항목을 저장할 만큼 크기가 충분한 연관기억장치를 갖추기 곤란하다.
연관 매핑
직접 매핑
연관직접결합매핑
->
페이지 테이블은 메모리에 저장
->
최근에 사용한 페이지만 기억장치에 저장
->
연관 기억장치에 해당 페이지가 없을 때만 직접 매핑한다.
->
지역성을 활용한다.
->
프로세스가 메모리를 균일하게 액세스하지 않고 집중적으로 액세스한다.
->
유효 접근 시간의 예
->
적중률 : 페이지 번호를 연관레지스터에서 발견하는 비율
->
적중률이 80퍼일때 (0.8800)+(0.21550)=950나노초
TLB (Translation Look-aside Buffer)
->
변환 우선참조 버퍼
->
페이지 테이브릐 캐시
->
최근에 일어난 논리적 주소와 물리적 주소의 변환 테이블을 저장
->
가상 주소가 주어지면 프로세서는 먼저 변환 우선참조 버퍼를 조사하여 페이지p를 찾는다.
원하는 페이지 테이블의 항목이 있으면 프레임 번호 PFN을 조사하여 메모리 주소를 추출한다.
없으면 프로세서는 페이지 번호를 사용하여 페이지 테이블을 조사한다.
이떄 원하는 항목이 있다면 해당 페이지는 메인메모리에 적재되어 있으므로 변환 우선참조 버퍼를
갱신하여 메모리 주소를 추출한다.
400ns
2000.75 + 4000.25 = 150+100 = 250
->
공통 코드나 라이브러리 코드에 적용한다.->
여러 프로세스가 동시에 수행 가능하다.->
읽기 가능 수정 불가->
재진입 코드 또는 순수 코드공유페이지는 같은 프로세스가 달라도 같은 프레임 번호를 가진다.
불연속 메모리 할당 에서만 이러한 메모리 공유가 가능하다. 연속메모리에서는 못한다.
페이지 테이블의 유효 비트
- Invalid인 페이지는 디스크에 있다.
- valid인 페이지는 메모리에 있다.
페이지 테이블의 접근 제어 비트
- vrwe (유효비트, 리드, 라이트, 실행)
참조비트
- 가상메모리에서 메모리에서 프레임을 쫓아 낼 때 사용한다.
- 최근에 참조를 한적이 있으면 다시 참조 할 가능성이 있다.
수정비트
- 수정비트는 고쳐진 녀석이라면 내쫓을 때, 디스크에 copy를 하고 나서 내쫓아야 한다. 이 비트가 0이라면 copy를 안하고 바로 버려버리면 된다.
PTLR - 논리적 주소 공간 밖의 주소 사용 금지
페이지 테이블의 유효 비트 - 페이지의 주기억장치 적재여부
페이지 테이블의 접근제어 비트 - 권한 있는 프로세스만 페이지 읽기, 쓰기, 실행
프로그램(사용자) 관점을 지원하는 메모리 관리 체계
프로세스 주소 공간을 세그먼트로 나누어 불연속적으로 할당
->
컴파일러가 프로그램을 실행파일로 변환하면서 세그먼트들로 구성
가변 분할 방법으로 할당
->
세그먼트 크기가 다르다.
세그먼트는 논리적 단위이다.
프로그램은 세그먼트의 집합이다
->
메인프로그램
->
함수, 프로시저, 모듈
->
스택
->
전역변수
세그먼테이션 테이블은 limit와 base로 구성됨
4400
6600
여러 프로세스가 공통적으로 사용하는 세그먼트의 공유
적절한 보호 체계가 필요하다
페이지 공유보다 단순하다.
페이징보다 세그먼테이션에서의 보호와 공유는 더 효율적이다.
보호에서는 세그먼테이션 역시 rwx 비트를 테이블에 추가하는데, 세그먼테이션은 논리적으로 나누기 때문에 해당 비트를 설정하기 매우 간단하고 안전하다.
페이징은 code+data+stack 영역이 있을 때 이를 일정한 크기로 나누므로 두가지 영역이 섞일 수가 있다.
그러면 비트를 설정하기가 매우 까다롭다.
공유에서도 마찬가지이다.
페이징에서는 한 페이지가 code 영역 외에 다른 영역도 포함할 확률이 높다.
하지만 세그먼테이션은 정확히 code 영역만 나누기 때문에 효율적으로 공유를 수행 할 수 있다.
Segmentation Fault
Segmentation Fault
2번
세그먼테이션을 하되 각 세그먼트를 페이지 단위로 쪼개어 저장한다.
->
외부 단편화 문제를 제거하면서 할당 과정을 쉽게 해결한다.
페이징과 세그먼테이션의 장점을 취합했다
->
페이징은 할당 과정이 단순하고 메모리를 효율적으로 사용한다.
->
세그먼테이션은 공유와 보호를 편리하게 한다.