가상메모리
물리메모리의 한계는 결국 메모리 주소 버스 크기에 좌우된다.
32비트의 cpu면 2^32 가 물리메모리가 4gb가 되고. 64비트라면 2^64가 될것이다. 하지만 실제적으로는 비용상 8~32gb정도 장착된다.그렇다면 만약 프로그램이 5gb처럼 큰 프로세스는 돌아갈수 없으며, 동시수행되는 프로세스의 크기의 총합은 물리메모리 보다 클수가 없다는 단점이 발생한다.
즉 프로세스보다 메모리가 작으면, 할당이 될수가 없다.
이를 해결하는 방법은
- 프로세스의 메모리와 보조저장장치에 동시에 프로세스를 나눠서 저장하게 되면 프로세스는 실행하기에 충분한 메모리가 잇다고 착각하게 된다.
- 스와핑(swapping)을 통해서 해결할수 있다. 메모리가 부족할때 실행에 필요하지 않는 부분은 보조저장장치에 이동 하는것이다.
이렇게 하게 되면, 프로세스의 크기가 물리적 메모리의 크기에 의해 제약되지 않는다.
가상메모리를 이용하는 이점
- 프로세스간의 메모리 공유를 가능하게 함.
- 물리메모리의 크기를 걱정안해도 됨
- 메모리 계층 구조에서 높은 access rate와 비트당 낮은 저장 비용을 가짐
즉, 가상메모리란, 물리메모리가 엄청나게 크다고 프로스세스에게 착각하게 하고, 하나의 큰 프로세스 메모리를 잘게 잘라 필요한 현재 실행되고 있는 부분만 메모리에 할당하는 방식을 취하는 메모리방식이다.
요구페이징(demand paging)
필요한 페이지들만 물리메모리에 적재 하는 방법이다. 이는 가상메모리를 활용하기 때문에 가능하다.
그래서 안쓰는 파일이나, 한번썻지만 아직 필요없는것은 : 보조기억장치에 저장되고, 스왑영역에 저장되거나 실행파일로 주기억장치에 저장되어있을것이다.
요구 페이징을 하기 위해서는 lazy swapper(=pager)이라는 스와퍼를 사용하는데 이 스와퍼는 페이지가 필요한 경우에만 적제하는 역할을 한다.
장점:
Less io needed
Less memory needed
Faster response
More users
단점 :
특정페이지를 찾기 위해서 시간이 걸린다.
스왑영역 : 메모리가 부족할때 메모리를 비우고 페이지를 저장하는 하드디스크의 영역
스왑인(swap in) : 스왑영역의 페이지를 메모리 프레임으로 읽어오는 행위
스왑아웃(swap out) : 메모리 프레임에 저장된 페이지를 스왑영역에 보내는 행위
이러한 스왑영역에서 메모리를 할당하고, 혹은 이동시켜야 한다고 판단하게 하는 방법은 비트를 쓰는것이다.
- valid presence bit
- modified bit
Valid.presence bit : 현재 페이지가 물리메모리에 할당되어있는지 여부
비트가 1이면, 물리메모리에 올라와있으니 현재실행중, 0이면 하드디스크에 있음
즉 페이지 테이블에서 해당 페이지가 사용하고 싶어서 봣더니 valid bit이 0 이면 현재 하드디스크에 존재하기 때문에 스왑 인 해줘야한다.
Modified bit : 수정되어있는지 여부, 즉 한번이라도 돌아간 프로그램인경우
1이면 수정된적이 있으니, 이는 스왑영역에 저장함
0이면 수정된적이 없으니까, 스왑영역에 들어갈 필요가 없음
Page fault(페이지 부재)
현재 내가 접근할 페이지가 메모리에 올라와있지 않기 때문에 하드웨어가 os에 trap을 보낸다.
page fault 처리 과정
- 페이지 테이블을 통해 참조가 유효한지 확인
- 프리 프레임을 찾아 페이지를 가져와서 메모리 할당
- 페이지 테이블 갱신
- 페이지 fault에의해 중단된 instruction 재실행
즉 요구페이징을 하기 위해서 페이지 부재를 확인하고 trap을 보내서 메모리 할당후 재실행 한다.
페이지 폴트 처리과정,
Cpu에서 현재 사용하고자 하는 프로세스의 가상주소를 통해서 페이지 테이블을 검색해서 현재 내가 접근하고자 하는 페이지의 물리주소를 알게 된다. 여기에서 현재 메모리상에 쓰고자 하는 프로세스가 올라가 있는지 확인을 하게 되고 그렇지 않으면 페이지폴트가 발생한다.(trap) 이후 페이지 폴트 커널 코드를 통해서 현재 페이지폴트가 사용해야 하는 물리주소에 있는 프로세스를 스왑영역에 스왑아웃 시키고, 사용하고자 하는 페이지를 스왑인 시켜주는 것으로 실행시키며, 마무리 작업으로 페이지 테이블을 갱신하고 물리주소를 가져오는것으로 실행한다.
demand paging의 필수조건
- 중단된 프로세스의 상태를 레지스터에 저장해야함.
- Instruction fetcht, 페이지를 메모리로 가져온 후 다시시도,
- Operand fetch시 발생된 경우, 해당 페이지를 메모리에 가져온 후 instruction을 다시 인출해서 실행하게 한다.
- instruction fetch와 operand fetch는 무엇인가.
Instruction fetch는 주기억장치에서 명령어를 Cpu안으로 가져오는 동작을 의미한다.
Operand fetch는 주소를 통해 필요한 자료를 가져오는 동작
COW : 가상메모리에서 새 프로세스 생성 과정
Fork시스템 호출로 생성되는 프로세스에 메모리 할당 + 페이지 적재 하기 전에
Fork 시스템 호출을 하게 되는데, 이때 방법은 2개가 있다.
하나는 완전복사로 부모프로세스의 모든 페이지를 온전히 복사하게 된다. 그러면 부모프로세스 페이지 테이블 또한 동일하게 된다. 이때 exac을 하게 되는데, 이렇게 하게 되면, 모든 메모리가 반환되고, 실행파일(하드디스크)로부터 모든 파일을 다시 메모리에 올리는 과정이 필요하다. 즉 불필요한 작업이 많다.
그래서 이를 대신해서 Copy on write COW 라는 쓰기 시 복사 라는 방법을 쓴다.
자식프로세스를 위해 부모의 페이지 테이블만을 복사 하고, 자식이 부모 프로세스와 동일한 프레임 값을 공유하는 방법이다.
이때 자식 페이지 테이블에서는 COW표시를 해주는것으로 부모 혹은 자식페이지에서 수정이 발생하면, 이때 자식에게 새로운 프레임을 할당하고 부모 프레임을 복사하게 된다
이러한 방식을 사용하면. 전체 페이지들을 복사하지 않고 변경되거나, 변경 가능한 페이지들만 복사를 하게 되기 때문에 시간이 낭비되지 않는다 또한, 수정이 발생하지 않는 페이지에는 프레임을 새로 할당할 필요가 없다.
이런식으로 변경이 필요한 페이지 테이블에 한해서 새로운 프레임을 할당시켜주는 방식을 채택하였다.
쓰레싱(Threashing)
페이지 방법에서는 쓰레싱이라고하는 문제가 존재한다.
- 페이지 부재가 많이 발생하면 입출력이 많아지니까 시스템 성능이 떨어지고 이는 쓰레싱이라고 한다.
- 페이지 fault가 계속되면 프로세스에 많은 페이지가 적재 되는데 미리 아는 방법을 모르기 때문에 추기해야한다.
- 프로세스에게 할당 가능한 프레임은 무한한가? 아니다. 물리메모리에 한한다.
- 한 프로세스 할당하는 프레임 수와 페이지 부재수면, 프레임이 많을수록 부재가 적다
- 커널 코드와 커널 데이터는 항상 물리메모리에 적재
즉, 프로세스가 실제 실행 보다 더 많은 시간을 페이징에 할당하는 상태 : 쓰레싱
쓰레싱의 원인
- 프로세스가 실행에 필요한 충분한 프레임을 할당받지 못한 경우
즉 다중프로그래밍 정도가 임계점 이상으로 넘어가면 ( 메모리가 완전 꽉차버리면) 충분한 프레임 할당이 불가능 하기 때문에 쓰레싱이 발생하는것이다.
쓰레싱의 해결방법
- 다중 프로그래밍 정도 줄이기
- 빠른 보조저장장치의 사용
- 물리 메모리 증가
작업집합(Working Set)
대부분의 Os에서 요구 페이징을 쓰는 이유는 두개 특징으로 인해서 그렇다.
- 참조의 지역성
- 작업집합
참조의 지역성( reference of locality)
: Cpu가 짧은 시간 범위 내에 일정 구간의 메모리 영역을 반복적으로 참조하는 경향.
지역성은 크게 두개로 나뉜다.
- 시간 지역성 : 짧은 시간내에 다시 사용되는 특성
- 공간 지역성 : 메모리 공간으로 봤을때 현재 참조 번지 수 주변 번지가 계속해서 참조되는 경향
즉 짧은 시간동안에는 균일하게 메모리에 접근하는게 아니라, 특정 부분에 집중적으로 참조하는 특성을 나타내는데 이를 참조의 지역성이라고 한다.( 예시 : 반복문 )
이러한 참조의 지역성은 현재 프로세스의 실행 패턴을 관찰하는것으로 페이지 할당과 교체에 전략을 세우기 좋다.
그래서 이러한, 일정 시간 범위 내에서 프로세스가 참조한 페이지의 집합을 작업집합(working set)이라고 한다.
작업 집합의 예)
그래서 페이지 폴트는 작업집합을 메모리에 적재하는 과정을 의미한다.
작업집합은 새로운 작업이 형성될때 즉 현재 돌던 코드에서 지역성이 끝날때 이동을 하게 되고 새로운 작업집합을 형성하게 된다. 이를 작업집합 이동이라고 한다. 이러한 작업집합이 메모리에 탑제되지 않고 양이 너무많으면 쓰레싱이 발생
즉 이렇게 작업집합이 메모리에 얼마나 올라갈수 있냐가 컴퓨터의 성능에 상당한 영향을 미친다.
이를 위해서 알고리즘이 존재하는데 바로 프레임 할당 알고리즘과 페이지 교체 알고리즘 이 있다.
- 프레임 할당 알고리즘 같은 경우에는 프로세스당 할당할 프레임 수를 결정하는 것으로 최대한 페이지 부재를 줄일수 있도록 하는방법이며,
- 프레임 교체 알고리즘은 이러한 페이지 부재가 발생 햇을때, 빈 프레임이 없다면 스왑아웃할 프레임을 결정하는 알고리즘이다.
Uploaded by N2T