이 글은 면접을 위한 CS 전공지식노트의 책을 읽고 학습 후 스터디 공유를 위한 글입니다.
프로세스의 주소공간에는 존재하지만 RAM에는 존재하지 않는 데이터나 코드에 접근시 페이지 폴트가 발생한다.
페이지 폴트를 방지하기 위해 당장 필요하지 않은 영역을 하드에 옮기고 필요할 때 다시 RAM으로 올리는 행위를 반복하며 RAM을 관리하는 것을 스와핑이라고 한다.
→ 이런 현상을 스레싱이라 함
메모리 관리에 이어 메모리 할당에 대한 내용
고정 분할 방식
가변 분할 방식
이름 | 설명 |
---|---|
최초 적합 | 메모리공간의 위쪽이나 아래쪽 부터 시작 → 빈 공간이 있으면 바로 할당한다. |
최적 적합 | 프로세스의 크기 이상인 공간중 가장 작은 공간부터 할당 |
최악 적합 | 프로세스 크기와 가장 많이 차이가 나는 공간부터 할당 |
내부 단편화, 외부 단편화
- 내부단편화 (Internal Fragmentation):
내부단편화는 고정 분할에 따라 나뉜 메모리의 공간의 크기가 프로세스의 크기보다 커서 메모리가 남지만, 다른 프로세스가 사용할 수 없는 상태를 말한다.- 외부단편화 (External Fragmentation):
외부단편화는 메모리 내의 여러 빈 공간들이 분산되어 있고, 이 공간들의 총합은 필요한 메모리보다 충분하지만, 단일 프로세스에 할당하기에 충분한 연속된 공간이 없을 때 발생합니다.
페이징
세그멘테이션
페이지드 세그멘테이션
3번째 페이지 교체 후 page Fault 발생
#include <bits/stdc++.h>
using namespace std;
//list는 캐시를 뜻함.
//hash는 들어왔을 때
//해당 페이지가 있는지 없는지를
//빠르게 체크해서 해당부분을 erase하는 역할을 함.
class LRUCache {
list<int> li;
unordered_map<int, list<int>::iterator> hash;
int csize;
public:
LRUCache(int);
void refer(int);
void display();
};
LRUCache::LRUCache(int n){
csize = n;
}
void LRUCache::refer(int x){
//해시에 들어오는 페이지에 해당하는 값이 없을 때
if (hash.find(x) == hash.end()) {
if (li.size() == csize) {
// 가장 끝에 있는 것을 뽑아낸다.
// 이는 가장 오래된 것을 의미한다.
int last = li.back();
li.pop_back();
hash.erase(last);
}
}else {
cout << "지웁니당! : " << distance(li.begin(), hash[x]) << "번째 " << *hash[x] << '\n';
li.erase(hash[x]);
}
// 해당 페이지를 참조할 때
// 가장 앞에 붙인다. 또한 이를 해시테이블에 저장한다.
li.push_front(x);
hash[x] = li.begin();
}
void LRUCache::display(){
for (auto it = li.begin(); it != li.end(); it++){
cout << (*it) << " ";
}
cout << "\n";
}
int main(){
LRUCache ca(3);
ca.refer(1);
ca.display();
ca.refer(3);
ca.display();
ca.refer(0);
ca.display();
ca.refer(3);
ca.display();
ca.refer(5);
ca.display();
ca.refer(6);
ca.display();
ca.refer(3);
ca.display();
return 0;
}
/*
1
3 1
0 3 1
3 0 1
5 3 0
6 5 3
3 6 5
*/
💡 페이지 교체 우선순위
2비트(R: 참조 됨, M: 수정 됨)를 사용하여 페이지를 4가지 카테고리로 분류
1. R = 0, M = 0: 페이지가 최근에 참조되지 않았고 수정되지 않았음.
2. R = 0, M = 1: 페이지가 최근에 참조되지 않았지만 수정되었음.
3. R = 1, M = 0: 페이지가 최근에 참조되었지만 수정되지 않았음.
4. R = 1, M = 1: 페이지가 최근에 참조되었고 수정되었음.