가상 메모리 개념
주소 공간과 물리 메모리 크기의 한계..
큰 프로그램의 실행시 문제점?
- 큰 프로세스가 물리 메모리 보다 큰 경우에..
- 여러 프로세스들을 합친 크기가 물리 메모리보다 큰 경우에..
가삼 메모리 개요
가상 메모리가 왜 필요한가? 물리 메모리 한계를 극복하는 해결책이 됨
가상 메모리 기법 핵심
- 물리 메모리를 디스크 공간으로 확장: 프로세ㅐ스를 물리 메모리랑 보조기억장치에 나눠서함. 프로세스한테 큰 공간있는것처럼 착각 시킴
- 스와핑: 물리 메모리가 부족할 대 실행에 필요하지 않은 부분은 디스크로 이동시킴, 실행 필요할때만 메모리로 이동
복습은 여까지만..
가상 메모리 어떻게 구현하는가
-요구 페이징(demand paging)
페이징 기법 토대로 프로세스의 일부 페이지들만 물리 메모리에 할당하고, 페이지가 필요할 때 물리 메모리를 할당받고 페이지를 적재시키는 메모리 관리 기법, 페이징이랑 스와핑이랑 합친거다
- 요구 세그먼테이션(demand segmentation)
세이먼테이션 기법+세그먼트 스와핑
요구 페이징
: 현재 실행에 필요한 일부 페이지만 메모리에 적재 후 나머지는 디스크에.. 필요할 때만 메모리에 넣음
프로세스의 페이지가 있는 디스크 영역은 스왑영역과 실행파일은 합친거다.
요구 페이징에서 운영체제는 첫 페이지만 물리 메모리에 적재하고, 실행 중 프로세스가 다른 페이지 필요로 할 때 페이지를 적재한다.
스왑 영역
메모리가 부족할 때, 메모리는 비우고 페이지를 저장해두는 하드 디스크의 영역이다. 리눅스는 디스크 내의 특별한 위치나 스왑 파티션에 구성하고 윈도우는 C:\pagefile,sys파일을 스왑 영역으로 사용함
페이지 테이블 항목
presen/valid bit | 해당 페이지가 물리 메모리에 있는지 여부 1메모리에 있음 0디스크에 있음 |
modified/dirty bit | 해당 페이지가 수정되었는지 여부 1수정되었음 쫓겨날때 스왑아웃됨 0은 수정 안된거 스왑영역 저장될필요없음 |
physical address | 1이면 프레임 번호 0이면 디스크 블록 번호 |
페이지 폴트
CPU가 액세스 하려는 페이지가 물리 메모리에 없을 때, 페이지 폴트 발생함
swap in = page in: 페이지를 스왑 영역에서 프레임으로 복사하는거
swap out = page out: 프레임에 저장된 페이지를 스왑 영역에 저장하고 프레임 비움
fork: 쓰기 시 복사(COW, copy on write)
프로세스의 생성.. 부모 프로세스가 자식 생성할 때. 프로세스 생성하는거는 메모리 할당이랑 페이지의 메모리 적재하는거에서 시작한다.
어케 자식 프로세스의 메모리를 만들까?
완전 복사하거나 쓰기 복사를 한다. 완전복사는 부모 프로세스의 모든 페이지를 완전히 복사하는건데 이건 비효율 적임(fork하고 exec하는게 일반적이니까?) 쓰기 시 복사는 자식 프로세스 만들 때 부모 프로세스의 페이지 테이블만 복사하는거. 그래서 자식이 부모의 메모리 프레임을 완전히 공유하고 자식은 페이지 테이블 항목에 쓰기 시 복사를 표기한다. 부모나 자식 중 하나가 페이지 수정하면 새로운 프레임을 할당하고 부모 프레임 복사함.
쓰기 시 복사하면 복사 다안하고 페이지 테이블만 복사해서 프로세스 만드니까 시간 효율적이고 fork하고 exec해도 손해가 없다. 또 부모나 자식이 둘 다 읽기만 하는 페이지는 새로 프레임을 할당할 필요도 없어서 메모리를 절약할 수 있다.
지역성과 스레싱
페이지 폴트와 스레싱
페이지 폴트와 디스크 I/O: 페이지 폴드 발생하면 무조건 디스크 인풋아웃풋 증가
스레싱?: 페이지 폴트가 계속 발생하여, 메모리 프레임에 페이지가 반복적으로 교체되고, 디스크 입출력 증가해서 CPU 활용률 떨어지는거
원인은 다중 프로그래밍이 과하거나, 잘못된 메모리 할당 및페이지 교체 알고리즘의 사용, 기본적인 메모리량이 적을 때, 우연히 특정 시간에 많은 프로세스를 실행했을 때이다.
스레싱 현상은 다중 프로그래밍이 높아지면 자연스럽게 CPU를 많이 사용하는데 이때 임계점을 넘어가면 발생한다.. 이 점을 넘으면 프로세서 이용률이 증가하는게 아니라 훅 떨어진다.
지역성
: 실행 중인 프로세스가 동일한 값이나 관련 저장 위치를 자주 액세스하는 현상
Working set Model(작업 집합 모델)
창 크기와 작업 집합.. 창 크기 키우면 페이지 폴트 줄어든다. 근데 그게 하기 어려우니 적절한 지점을 찾아야됨. 그리고 창 크기가 일정 크기 이상으로 커지면 더이상 프로그램의 크기가 줄어들거나 하지는 않음
Working set Model의 사용법
- OS가 각 프로세스의 작업 집합을 감시하고 각 프로세스에 작업 집합 크기에 맞는 충분한 프레임 할당
- 여분의 페이지 프레임이 있을 때는 준비 상태에 있는 다른 프로세스를 불러들인 후 프레임을 할당해 다중 프로그래밍의 정도를 증가함
- 다중 프로그램의 정도를 계속 ㅈ증가시켜서 모든 프로세스가 갖는 작업 집합 크기의 합이 전체 유효 프레임 수보다 커지면 잠시 중지시킬 프로세스 선정해서페이지 회수
- 작업 집합 방법은 가능한 다중 프로그래밍의 정도를 높이면서 스래싱을 방지해서 프로세서의 효율성을 최적화하려고 함
Working set Model 문제점
- 우선 작업 집합이 갖는 과거의 참조가 미래의 참조 보장 안할수도
- 작업 집합 크기와 구성 페이지들은 시간 경과하면 변함
- 각 프로세스에서 작업 집합을 모두 측정한다는 것은 현실적으로 불가능함
- 프로세스를 실행하면서 작업 집합을 삭제하거나 추가하기도 하니까 변화가 심함
- 각 프로세스가 참조한 페이지 시간이랑 시간 순서로 된 페이지 큐를 유지해야돼서 작업 집합으로 메모리 관리하기가 복잡함
- 작업 집합 창의 크기를 나타내는 매개변수의 최적값이 알려져 있지 않고 프로세스마다 이 값이 너무 다양함
아무튼 페이지 프레임수가 늘어나면 페이지 부재 비율은 줄어든다..일반적으로!
페이지 교체
메모리 프레임 중 하나 선택해서 비우고 여기다가 요청된 페이지 적재
특징?
- 페이지 폴트 핸들러에서 실행되는 작업
- 희생 프레임(victim frame): 비우기로 선택된 프레임
- 희생 페이지(victim page): 희생 프레임에 들어 있는 페이지
-희생 페이지는 스왑-아웃, 요청페이지는 스왑-인
선입선출 교체 알고리즘(FIFO)
: 선입 선충 대치 알고리즘이란..
가장 간단한 알고리즘.큐로 관리함. 큐의 헤드부분에 있는 페이지 먼저 대치하고 새로 들어온거는 뒤에.. 큐의 크기가 사용 가능한 메모리 프레임 수임
최적 페이지 교체 알고리즘(OPT)
최적페이지 교체 알고리즘이란 벨래디의 알고리즘.. 모든 알고리즘 중 페이지 부재 비율이 젤 낮다. 제일 오랫동아 사용 안한 페이지를 바꾼다는 개념.
최근 최소 사용 교체 알고리즘(LRU, Least Recently Used)
프로세스가 가장 최근의 페이지에 액세스했다? 또 할 가능성 있음.. 과거에 데이터 가지고 미래를 예측해보는거.
메모리 지역성을 이용한 알고리즘으로 각 페이지에 마지막으로 사용한 시간을 연관한다. 페이지 대치할 때 오랫동안 사용하지 않은 페이지를 선택하니까 시간적으로 거꾸로 찾는 최적 페이지 대치 알고리즘이라고 할 수 있다.
LRU 어떻게 구현할까..
- 카운터(계수기)를 이용해서 순서를 결정하기
: 각 페이지 테이블 항목에 사용 시간 레지스터를 연관시키고 프로세서에 논리 클록을 차가한 후에 카운터 필드 붙여서 프레임 순서를 결정함
MMU는 페이지 참조때 모드 ㄴ참조의 프로세서 클록을 각 페이지 테이블 항목에 업데이트함. 참조할 때마다 클록은 증가하고 클록 레지스터의 내용은 페이지의 해당 페이지 테이블에 있는 사용 시간 레지스터에 복사해 각 페이지의 최후 참조 시간을 갖음
- 스택 이용
: 페이지 번호를 스택에 넣어서 관리하고 페이지 참조할 대마다 페이지 번호를 스택에 위에 둬서 순서를 결정함. 맨 위에 있으면 최근에 쓴고 아래 있는거는 늦게 사용한게 되어서 페이지 부재 나면 교체한다.
- LRU 근접 알고리즘
: 최근 최소 사용 근접 알고리즘 개념임. 근데 이걸 이용한 페이지 대치에서 하드웨어 진원안해서 다른 알고리즘을 쓴다. 처음에 모든 비트는 0으로 하고 사용자 프로세스 수행할 때 참조된 각 페이지랑 관련된 비트를 1로 변환한다. 가격이 쌈
- 참조 비트 쉬프트 알고리즘
각 페이지에 참조 비트를 사용해 최근 참조 여부를 기록하고 주기적으로 비트를 쉬프트해서 페이지의 오래된 정도를 나타냄
페이지 접근하면 1로 설정하고 일정시간마다 왼쪽으로 쉬프트하고 하위비트에는 0채움. 일케하면 자주 참조된 페이지는 높은 값이고 오래된거는 값이 낮으니까 가장 값 작은거를 교체함(오래된거 교체)
- LRU 근접 알고리즘
NUR 알고리즘: 최근 사용하지 않는 페이지를 교체해서 낮은 오버헤드로 최근 최소 사용 페이지 교체 전략에 거의 동일한 배치임, 최근 사용하지 않는 페이지를 교체하는 방법으로, 최근에 사용하지 않는 페이지들은 가까운 미래에도 사용하지 않을 가능성 높다는 아이디어에 바탕함
최소 사용 빈도 수 알고리즘(LFU): 각 페이지마다 참조 횟수 카운터 있고, 수가 가장 작은 페이지 대치
최대 사용 빈도 수 알고리즘(MFU): 계수가 가장 작은 페이지는 방금 들어와서 아직 사용안했으니까 앞으로 사용할 확률이 젤 높다고 가정해서 대치 페이지 후보에서 빼버림. 그래서 가장 많이 쓴거를 바꿈