Virtual Memory

누디·2022년 10월 23일
0

OS

목록 보기
5/5

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
    • 이 페이지가 메모리에 올라온 이후 업데이트가 된 적이 있냐 없냐는 것

    • page가 메모리랑 하드디스크 계속 왔다갔다 하기 때문에 문제 되는 것

      스크린샷 2022-06-14 오전 1.55.07.png

  • 결국 메모리를 2번 읽음
    • 원하는 데이터 읽으러 가려면 그 데이터가 어디에 있는지 알려주는 page table entry를 먼저 읽고
    • 거기서 프레임 번호를 알아내서 실제 데이터나 명령어를 알아내러 가야함
  • entry는 페이지 하나 당 하나
  • 페이지 테이블의 각 페이지가 메모리에 있는지 없는지
    • 만약 있다면 어느 프레임에 있는지 알려주는 페이지 테이블이 필요
    • 즉, 페이지 테이블이 어디 있는지 알려주는 페이지 테이블
  • relocation
    • page table에 가서 frame 번호를 찾으면 됨
    • 이게 내 페이지 번호에 해당하는 entry다 그러면
    • 가서 프레임 번호를 찾아서
    • 프레임 번호와 offset을 찾아서 physical address를 찾으면 됨
    • 그 위치가 실제 메모리상의 내가 원하는 데이터나 명령어가 있는 위치
  • 근데 문제가 뭐냐면
    • page table이 이 프로그램의 페이지 테이블만 있는 게 아니라
    • 메모리 안에 프로세스가 1000개 쯤 있다
    • 우리가 프로그램을 통째로 메모리 안에 넣는 게 아니라 프로그램의 일부만 메모리에 넣을 수 있기 때문에 이제는 예전보다 훨씬 더 많은 프로세스가 동시에 실행됨
    • 그러면 프로세스마다 페이지 테이블도 1000개의 프로세스가 있으니까 1000개의 페이지 테이블이 있을 것
    • 페이지 테이블도 메모리에 있어야함
    • 근데 이게 어디있는지 알 수 없다
    • 찾으러 가야
    • 지금 실행하고 있는 프로세스의 페이지 테이블이 어디에 있는지 하는 주소값을 레지스터에 넣어둔다
    • 그니까 페이지 테이블 찾아가야 되는데 프로세스가 너무 많아서 페이지테이블도 너무 많으니까 페이지 테이블의 주소를 레지스터에 넣어두는 것
    • 그러면 페이지 테이블 가서 페이지 프레임 찾으면 됨
    • 페이지 번호에 페이지 테이블 포인터 더하면 해당하는 페이지에 대한 정보가 들어있는 페이지 테이블 entry의 주소가 만들어짐
    • 그럼 이 주소에 가서 페이지 테이블의 주소를 읽어서 frame 번호를 알아낸 다음
    • 그 프레임 전호랑 offset을 연결해서 physical address 만들어서
    • 원하는 데이터나 명령어를 찾아감
    • 즉 페이지 테이블이 어디에 있는지에 대한 페이지 테이블

스크린샷 2022-06-14 오전 2.02.22.png

스크린샷 2022-06-14 오전 2.02.46.png

  • 2단계 페이지 테이블
    • 먼저 virtual address가 주어짐
    • 그러면 첫번째 10 비트가 root 페이지 테이블 안에 내가 원하는 정보가 들어있는 페이지 테이블
    • 내가 원하는 정보가 들어있는 페이지 테이블이 몇 번째 entry에 있는지 나타내는 숫자
    • 그럼 내가 원하는 페이지 테이블의 시작 주소를 구함
    • 두번째 테이블에서 몇번째 entry인지하는 번호를 더하면
    • 이 페이지 테이블 안에서 해당하는 프레임 정보가 들어있는 entry 주소가 나옴
    • 이 프레임 번호를 갖다 offset과 붙이면
    • 내가 원하는 데이터가 있는 곳의 주소가 됨

0개의 댓글