하드웨어와 제어구조
페이징과 세그먼테이션의 특성
- 프로세스의 모든 메모리 참조는 논리주소이며, 프로세스 수행 시간에 동적으로 물리주소로 변환
=> 한 프로세스가 스와핑으로 주기억장치에 적재할 때 다른 위치에 적재 가능함을 의미
- 한 프로세스의 주소공간은 여러 블록으로 분할될 수 있고, 프로세스 수행 중 이 블록들은 주기억장치의 연속된 영역에 위치할 필요가 없음
=> 프로세스가 수행될 때 페이지(혹은 세그먼트) 테이블을 활용해 동적으로 주소를 변환함으로써 가능케됨
=> 수행 시간에 프로세스의 모든 페이지(혹은 세그먼트)가 주기억장치에 적재될 필요가 없음(적재집합)
적재집합(resident set)
프로세스의 코드나 데이터 중 임의 시점에 주기억장치에 적재되어 있는 부분
주기억장치에 적재되지 않은 논리주소가 참조(적재집합에 없는 메모리 참조)되었을 경우
-> 처리기는 메모리 접근 오류(memory access fault)를 의미하는 인터럽트 발생
-> 인터럽트 당한 프로세스를 블록 상태에 두고 제어를 넘겨받음
-> 디스크 입출력 요청
-> 다른 프로세스에게 CPU를 넘겨 디스크 입출력이 진행되는 동안 수행
-> 운영체제가 제어를 돌려받고 이전에 메모리 접근 오류를 발생시켜 블록 되었던 프로세스를 준비 상태로 전환시킴
위 새로운 기법의 장점
- 보다 많은 프로세스를 주기억장치에 유지 가능
- 각 프로세스에 대해 일부 브록들만 적재
- 주기억장치보다 큰 프로세스 수행 가능
- 프로그래밍에 있어 가장 근본적 제약점 중 하나 제거
가상 메모리 페이징/세그먼테이션
페이징과 세그먼테이션에 가상메모리를 적용했을 때와 적용하지 않았을 때
단순 페이징 / 가상 메모리 페이징 | 단순 / 가상 메모리 세그먼테이션 |
---|
주기억장치는 프레임이라 불리는 고정 크기의 작은 블록으로 분할됨 | 주기억장치는 분할되지 않음 |
프로그램은 컴파일러나 메모리 관리 시스템에 의해 다수의 페이지로 분할됨 | 프로그래머가 컴파일러에게 프로그램 세그먼트를 명시해줌(분할 방식은 프로그래머에 의해 결정됨) |
내부 단편화 | 내부 단편화 없음 |
외부 단편화 없음 | 외부 단편화 |
각 페이지가 어느 프레임에 적재되어 있는지 나타내기 위해 운영체제는 프로세스 각각을 위한 페이지 테이블을 관리해야 함 | 각 세그먼트의 적재 위치와 길이를 나타내기 위해 운영체제는 프로세스 각각을 위한 세그먼트 테이블을 관리해야 함 |
운영체제는 가용 프레임 리스트(free frame list)를 관리해야 함 | 운영체제는 메모리에 흩어져 있는 가용 공간(free hole)들의 리스트를 관리해야 함 |
처리기는 페이지 번호와 오프셋을 사용해 절대 주소를 계산함 | 처리기는 세그먼트 번호와 오프셋을 사용해 절대 주소를 계산함 |
단순 페이징 | 가상 메모리 페이징 | 단순 메모리 세그먼테이션 | 가상 메모리 세그먼테이션 |
---|
오버레이를 사용하지 않을 경우, 수행할 프로세스의 모든 페이지가 주기억장치에 있어야 함 | 수행할 프로세스의 모든 페이지가 주기억장치에 있을 필요 없으며, 필요할 때 적재 가능함 | 오버레이를 사용하지 않을 경우 수행할 프로세스의 모든 세그먼트가 주기억장치에 있어야 함 | 수행할 프로세스의 모든 세그먼트가 주기억장치에 있을 필요 없으며, 필요할 때 적재 가능함 |
| 주기억장치로 한 페이지를 읽어들이기 위해 한 페이지를 디스크에 기록해야 할 수도 있음 | | 주기억장치로 한 세그먼트를 읽어들이기 위해 하나 이상의 세그먼트를 디스크에 기록해야 할 수도 있음 |
가상 메모리(Virtual memory)
- 프로그래머나 사용자가 가지는 디스크 상에 할당된 훨씬 큰 잠재적 메모리
- 효과적인 멀티프로그래밍을 허용하면서도 주기억장치를 사용할 때의 엄격한 제약을 해소시켜 줌
지역성(Locality)과 가상메모리
- 긴 프로그램과 다수의 데이터 배열로 구성된 큰 프로세스의 경우
- 모두 적재 시 비경제적
=> 각 프로세스는 메모리 상에 몇 개의 블록만 가지게 되고, 이를 통해 보다 많은 프로세스를 메모리에 유지할 수 있음
- 쓰레싱(thrashing)
- 과도한 스와핑으로 인한 블록 이동
=> 지역성의 원리(프로세스 내의 명령어 및 데이터에 대한 참조가 가지는 군집화 경향)에 기초하여 해결
- 가상 메모리를 실용적이고 효과적으로 사용하기 위해 필요한 요소
- 하드웨어(페이징,세그멘테이션) + 소프트웨어(블록 이동)
페이징
- 프로세스마다 고유의 페이지 테이블을 가짐
- 프로세스의 페이지들이 적재될 때 주기억장치에 설정
- 각 페이지테이블 항목에는 해당 페이지가 적재된 페이지프레임의 번호와 패리티비트(존재비트) P와 함께 저장
- 해당 페이지가 메모리에 적재된 후 그 내용이 변경되었는지 여부를 나타내는 변경비트 M를 가짐
- 페이징의 장점
- 투명한 페이징으로 외부단편화를 없애 주기억장치를 효율적으로 사용
- 블록들이 고정 크기이기 때문에 프로그램의 행태에 부합되는 정교한 메모리 관리 알고리즘 개발 가능
페이지 테이블 구조
-
메모리에서 한 워드를 읽을 때마다 페이지 번호와 오프셋으로 구성된 가상 주소가 물리 주소(프레임번호+오프셋)로 변환
-
페이지 테이블 시작 주소 특정 레지스터에 저장
-
일반적으로 페이지 번호 필드가 프레임 번호 필드보다 긺(n>m)
-
프로세스당 하나의 페이지 테이블 설정으로 메모리가 큼
=> 큰 페이지테이블을 구성하기 위해 2단계 구조 사용
- 32비트 주소체계의 경우
- 4KB(212)의 페이지
=> 4GB(232) 크기의 가상주소공간 설정
=> 페이지 각각이 4바이트
=> 220개의 PTE(Page Table Entry)로 구성된 4MB(1MB*4) 크기의 페이지테이블을 만들 수 있음
=> 210개의 페이지를 차지하는 페이지테이블이 210개의 PTE를 가지는 4KB의 루트 페이지 테이블에 사상되어 가상메모리 상에 유지
- 루트 페이지는 주기억장치에 상주
-
가상 주소의 처음 10비트는 루트 페이지에 대한 인덱스로 쓰이며 사용자 페이지테이블이 저장된 페이지를 위한 PTE를 찾아줌
-
그 페이지가 주기억장치에 없다면 페이지폴트 발생
-
주기억장치에 있다면 다음 10비트가 사용자 페이지테이블에 대한 인덱스로 쓰여 실제 페이지를 위한 PTE를 찾음
역페이지테이블(Inverted Page Table)
- 페이지테이블의 단점
- 크기가 가상주소공간 크기에 비례
=> 역페이지테이블의 사용
- 역페이지테이블
- 페이지번호 부분이 해시함수를 통해 특정 해시값으로 매핑
- 페이지테이블 항목의 개수가 실기억장치의 페이지프레임당 하나씩 설정
- 동일 해시 값에 의해 오버플로우 체인 필요
- 역페이지 테이블 제어비트
- 유효(valid)
- 참조(reference)
- 변경(modify)
- 보호(pretection)
- 잠금(locking)
TLB(Translation Lookaside Buffer)
- 모든 가상메모리 참조 -> 2번의 물리메모리 참조
- 페이지테이블 항목 참조
- 요구된 데이터 접근
=> 두 배의 메모리 접근 시간
=> 페이지테이블 항목들에 대한 특수 고속 캐시 사용(TLB)
- 가장 최근에 참조된 페이지테이블 항목들을 유지
- 페이지테이블 항목의 존재비트가 0일 경우 페이지폴트(page fault) 발생
작동순서
- 가장 처음 TLB에 페이지테이블 항목이 있는지 확인
- 있을 경우(TLB hit) -> 바로 프레임 번호 추출되어 실주소 구성
- 없을 경우(TLB miss) -> 페이지 번호로 페이지테이블을 인덱싱하여 페이지테이블 항목 참조
- 요구된 페이지가 주기억장치에 없을 때 페이지폴트 처리 루틴(인터럽트) 호출
- 지역성의 원리에 의해 대부분의 가상주소 참조는 최근에 사용된 페이지들 내의 위치들로 한정 -> 대부분의 참조는 캐시 안에 있는 페이지테이블 항목과 연계
TLB와 캐시
직접사상
- 페이지 번호가 곧 페이지 테이블 내에서 인덱싱하여 직접적으로 접근할 수 있게끔 사용됨
연관사상
- TLB는 페이지테이블의 일부 항목들만 포함. 대신 항목들은 페이지 번호도 포함해야 함
- 처리기에 특정 페이지 번호와 일치하는 TLB 항목이 있는지 조사하는 하드웨어 장착
TLB와 캐시의 동작
- 메모리 시스템은 일치하는 페이지테이블 항목이 TLB 상에 존재하는지 조사
- 존재 -> 프레임 번호와 오프셋이 결합된 실주소 생성
- 비존재 ->페이지테이블 상의 해당 항목 접근
- 실주소 생성
- 해당 워드를 포함한 블록이 캐시 상에 존재하는지 조사
- 존재 -> 캐시 상의 해당 워드가 CPU에게 보내짐
- 비존재 -> 해당 워드는 주기억장치로부터 읽힘
페이지 크기와 페이지 폴트의 관계
- 내부 단편화
- 페이지가 작을수록 적어짐
- 페이지가 작을 경우
- 큰 페이지테이블 필요
- 두 번의 페이지폴트 가능성(페이지테이블 + 프로세스페이지)
- 페이지의 개수가 많아져 페이지폴트 빈도 감소
- 페이지가 클 경우
- 개별 페이지들이 최근의 참조로부터 보다 멀리 떨어진 위치를 포함하여 지역성의 원리에 따른 효과 감소
-> 페이지폴트 발생률 증가
- 페이지 크기가 프로세스 전체 크기일 경우 페이지폴트 발생 X
- 한 프로세스에 할당된 프레임 개수도 페이지폴트 발생률에 영향
- 페이지 크기가 고정 + 주기억장치에 유지되는 페이지 개수가 증가하면 프레임이 많아지면서 폴트 발생률이 떨어짐
- TLB 크기가 고정되어있다고 할 때 프로세스의 메모리 크기가 커지며 지역성이 줄어들면서 TLB의 적중률 또한 감소
- 커지는 메모리에 비해 상대적으로 용량 증가가 어려운 TLB로 인한 병목지점 가능성
- 다른 대안
- 페이지의 크기 키우기 -> 성능이 떨어질 가능성
- 다수의 페이지 크기를 지원하여 유연성 증가 -> 복잡하여 현실적으로 어려움
세그먼테이션
- 메모리를 다수의 주소공간들(or 세그먼트)의 조합으로 볼 수 있음
- 세그먼트의 크기는 동적 설정, 메모리 참조는 (세그먼트 번호, 오프셋)의 주소 형식으로 이루어짐
가상메모리의 유익
- 점진적으로 커져가는 자료구조 처리의 단순화
- 필요에 따라 운영체제가 동적인 세그먼트의 크기에 맞춰 확장 및 축소 가능
- 프로그램 전체에 대한 재연결(relink)이나 재적재(reloading) 없이, 세그먼트 각각을 변경하거나 재컴파일이 가능
- 프로세스들이 세그먼트 공유 가능
- 세그먼트 보호 가능
- 프로그래머나 시스템 관리자가 자신에게 용이한 방식으로 접근 권한 부여 가능
세그먼테이션 구성
단순 세그먼테이션의 경우
- 프로세스마다 고유의 세그먼트테이블이 설정
- 프로세스의 세그먼트들이 적재될 때 주기억장치에 설정되며 각 세그먼트테이블 항목에는 그에 대응된 세그먼트가 적재된 메모리 영역의 시작주소와 길이가 저장
가상 메모리 세그먼테이션의 경우
- 동일한 장치로서 세그먼트테이블 필요하지만 추가 비트가 있음
- 존재 비트 P
- 테이블 항목에서 주기억장치에 적재되어 있는지를 나타냄
- 변경 비트 M
- 해당 세그먼트가 적재된 이후 그 내용이 변경되었는지를 나타냄
- 세그먼트 교체 시 변경된 세그먼트만 구별하여 디스크에 기록할 수 있게 해줌
- 세그먼트 + 오프셋으로 구성된 가상 주소를 물리 주소로 변환
- 세그먼트테이블이 프로세스의 크기에 따라 가변 길이를 가져 주기억장치의 참조 가능 영역에 세그먼트테이블을 유지해야 함
- 가상 주소의 세그먼트 번호를 세그먼트테이블의 인덱스로 사용하여 적재된 세그먼트의 시작 위치에 해당하는 주기억장치의 주소 + 가상주소의 오프셋 = 실주소 값(real address)
페이징과 세그먼테이션의 결합
페이징 고유의 장점 + 세그먼테이션 고유의 장점을 결합시키기 위해 두 기법 모두 제공되는 시스템도 있음
- 사용자의 주소 공간이 몇 개의 세그먼트로 나뉘어지고, 이는 다시 주기억장치의 프레임 크기와 동일한 고정 크기의 페이지들로 분할됨
- 한 세그먼트의 크기가 한 페이지 크기보다 작을 경우, 하나의 페이지만 차지
- 프로그래머 관점에서
- 논리주소는 여전히 세그먼트 번호와 세그먼트 오프셋으로 구성
- 시스템 관점에서
- 세그먼트 오프셋은 해당 세그먼트 내의 한 페이지에 대한 페이지 번호와 페이지 오프셋으로 보임
- 페이지 테이블의 다른 제어비트의 경우 공유나 보호등을 위해 사용
- 페이지 테이블의 변경 비트는 해당 페이지프레임에 다른 페이지를 적재하려 할 때, 기존 페이지의 내용을 디스크에 기록할 필요가 있는지 나타냄
보호와 공유
- 세그먼테이션이 보호와 공유 정책을 구현하기에 적합
- 각 항목에 시작 주소와 길이가 포함되어 있어 프로그램은 세그먼트 범위 밖의 주기억장치 영역에 접근 불가능
- 공유를 위해 다수의 세그먼트테이블이 특정 세그먼트를 참조하게 할 수 있음
- 페이징은 프로그램과 데이터의 페이지 구조가 투명하기 때문에 보호나 공유의 요건을 명확히 표현하기 어려움
- 보다 정교한 기법들로도 가능 -> 링-보호(ring-protection)