Virtual Memory
page나 segment의 경우 프로그램을 자를 순 있는데 연속되지 않은 공간에 들어가긴 했지만 동시에 들어가야 했다.
그러니까 모든 페이지, 세그먼트가 다 메모리에 들어가 있어야만 했단 것
반면에 virtual memory라고 하는 것은 여러개의 프로그램들을 동시에 실행시키기 위해서 우리가 프로그램 전체를 메모리에 넣을 필요가 없다고 가정하고 시작 하는 것
예를 들어서 메인 함수에서 A라는 함수를 실행했는데 A는 while 문을 1000번 반복 실행해야 함
그러면 그 while문 1000번 실행 되는 동안 이 프로그램의 다른 함수는 우리가 실행 할 일이 없는데 전체 프로그램을 메모리에 넣어두는 것은 공간 낭비
그래서 지금 사용하고 있는 부분만 메모리에 집어넣고 나머지 부분은 여전히 하드디스크에 남겨 놓는 것
이걸 vitual memory system이라고 한다.
그리고 실제 메인 메모리와 하드디스크에 남아있는 부분을 합쳐서 메모리라고 부른다.
- 프로그램 실행
- OS는 전체 프로그램 중에서 main 함수가 포함되어 있는 몇 개의 조각만 메인 메모리로 불러온다
- 근데 내가 원하는 주소가 들어있는 페이지가 메모리에 없으면 → page fault
- 원하는 거 가져올 때 까지 계속 반복
- Thrashing
- 주어진 공간은 한정적이고 이 공간 안에 들어갈 수 있는 페이지 숫자는 제한됨
- 3개 들어가야 되는데 2개 밖에 없으면 계속 넣었다 뺐다 바꿔야 함
- 바로 다음에 호출 할 함수가 어느 페이지에 있는지 모르기 때문에 발생
- 어떤 페이지를 골라야 되는데 그냥 페이지 바꾸기만 함
- locallity-대부분의 경우 내가 호출하는 함수 위아래에 있음
- Presence bit
- 메모리 안에 있냐 없냐를 나타내는 것
- 페이지 테이블에 들어있음
- virtual memory system 에서는 전체 페이지가 10페이지라고 하면, 그 중 3 페이지 정도만 메모리에
- Modify bit
- 결국 메모리를 2번 읽음
- 원하는 데이터 읽으러 가려면 그 데이터가 어디에 있는지 알려주는 page table entry를 먼저 읽고
- 거기서 프레임 번호를 알아내서 실제 데이터나 명령어를 알아내러 가야함
- entry는 페이지 하나 당 하나
- 페이지 테이블의 각 페이지가 메모리에 있는지 없는지
- 만약 있다면 어느 프레임에 있는지 알려주는 페이지 테이블이 필요
- 즉, 페이지 테이블이 어디 있는지 알려주는 페이지 테이블
- relocation
- page table에 가서 frame 번호를 찾으면 됨
- 이게 내 페이지 번호에 해당하는 entry다 그러면
- 가서 프레임 번호를 찾아서
- 프레임 번호와 offset을 찾아서 physical address를 찾으면 됨
- 그 위치가 실제 메모리상의 내가 원하는 데이터나 명령어가 있는 위치
- 근데 문제가 뭐냐면
- page table이 이 프로그램의 페이지 테이블만 있는 게 아니라
- 메모리 안에 프로세스가 1000개 쯤 있다
- 우리가 프로그램을 통째로 메모리 안에 넣는 게 아니라 프로그램의 일부만 메모리에 넣을 수 있기 때문에 이제는 예전보다 훨씬 더 많은 프로세스가 동시에 실행됨
- 그러면 프로세스마다 페이지 테이블도 1000개의 프로세스가 있으니까 1000개의 페이지 테이블이 있을 것
- 페이지 테이블도 메모리에 있어야함
- 근데 이게 어디있는지 알 수 없다
- 찾으러 가야
- 지금 실행하고 있는 프로세스의 페이지 테이블이 어디에 있는지 하는 주소값을 레지스터에 넣어둔다
- 그니까 페이지 테이블 찾아가야 되는데 프로세스가 너무 많아서 페이지테이블도 너무 많으니까 페이지 테이블의 주소를 레지스터에 넣어두는 것
- 그러면 페이지 테이블 가서 페이지 프레임 찾으면 됨
- 페이지 번호에 페이지 테이블 포인터 더하면 해당하는 페이지에 대한 정보가 들어있는 페이지 테이블 entry의 주소가 만들어짐
- 그럼 이 주소에 가서 페이지 테이블의 주소를 읽어서 frame 번호를 알아낸 다음
- 그 프레임 전호랑 offset을 연결해서 physical address 만들어서
- 원하는 데이터나 명령어를 찾아감
- 즉 페이지 테이블이 어디에 있는지에 대한 페이지 테이블
- 2단계 페이지 테이블
- 먼저 virtual address가 주어짐
- 그러면 첫번째 10 비트가 root 페이지 테이블 안에 내가 원하는 정보가 들어있는 페이지 테이블
- 내가 원하는 정보가 들어있는 페이지 테이블이 몇 번째 entry에 있는지 나타내는 숫자
- 그럼 내가 원하는 페이지 테이블의 시작 주소를 구함
- 두번째 테이블에서 몇번째 entry인지하는 번호를 더하면
- 이 페이지 테이블 안에서 해당하는 프레임 정보가 들어있는 entry 주소가 나옴
- 이 프레임 번호를 갖다 offset과 붙이면
- 내가 원하는 데이터가 있는 곳의 주소가 됨