실행 중이지 않은 프로세스를 보조기억장치로 옮겨 놓았다가 필요할때 다시 불러오는 동작을 스와핑이라고 함.
swap-out: 현재 필요없는 프로세스가 보조기억장치로 가는거
swap-in: 다시 메모리로 돌아오는거
정의: 여러 개의 조각으로 나뉘는 현상. 대상은 일반적으로 공간 혹은 자료이다.
커다란 메모리가 프로세스의 스와핑 결과 중간 중간 뻥뻥 뚫리게 된다. 이는 아무리 큰 메모리라 하더라도 결국 이전에 할당 된 크기 만큼의 메모리 여러개로 나눠 진거나 마찬가지다.
외부라는 의미는 프로세스 밖에 단편화된 메모리 조각들이 생기기에 외부 단편화라고 한다
프로세스에 필요한 메모리 조각은 운영체제가 관리하는 최소 단위의 배수로 딱딱 떨어지지 않을 수 있다. 그럴 경우 운영체제가 할당하는 블록 내부에 빈공간이 생길 수 밖에 없는데 이는 곧 메모리의 단편화라고 할 수 있다.
프로세스의 내부에 생기기에 내부 단편화라고 한다. 당연히 앞서 본 외부 단편화의 크기 보다는 훨씬 작을 수 밖에 없긴하다
특히 외부 단편화에 있어 치명적이다.
왜냐하면, 프로세스가 한 뭉태기로 메모리에 실려 있어야 되는데, 스와핑의 결과 불가능한 단위 크기만큼 무수히 많은 외부 단편화가 일어나 있다면, 그 공간을 전부 다 못쓰게 되기 때문이다.
이를 극복하기 위해 페이징 개념이 등장하게 된다. 혹은 외부 단편화를 해결하기위해 적재된 프로세스들을 차곡히 정렬하는 메모리 압축memory compaction
도 방법이지만, 주소를 하나하나 옮기는 과정에서 무수히 많은 오버헤드가 발생하고 스와핑이 일어날때마다 해줘야되면 감당이 안됨
1️⃣ 메모리 할당 방식에 대한 설명으로 올바른 것 매칭
2️⃣ 외부 단편화 설명 옳지 않은 것
3️⃣ 메모리 스와핑에 대한 설명으로 옳은 것은?
4️⃣ 연속 메모리 할당에 대한 설명 중 옳지 않은것
페이징 paging: 프로세스의 근본은 연속된 논리 주소를 가져야 한다. 그러나 이렇게 되면 너무 나도 좋겠지만, 현실적으로 메모리 외부 단편화에 너무 취약하기 때문에 연속된 공간이 아닌 분산된 공간에 저장하더라도 마치 연속으로 저장되어 있는 거 마냥 사용 할 수 있다면 좋을거 같아서 만들어진 개념이 페이징
프레임 frame: 논리주소는 그렇다치고 실제 물리 주소가 있을거 아닌가. 이때 메모리를 관리하는 운영체제 및 하드웨어 입장에서 유동적으로 1byte 단위까지 유연하게 처리할 수 있게 해버리면 설계가 너무 어려워진다. 그래서 설계 용이한 단위로다가 메모리를 나눈것이다. 메모리의 총 공간을 일정 크기 단위로 나눌때 그 단위가 프레임이다.
페이지 인: 스왑 인이 프로세스 통짜로 메모리에 적재하는 거면, 페이지 인은 그 바라보면 대상이 페이지로 바뀐 것이다.
페이지 아웃: 사용 안하는 페이지는 보조기억장치로 옮겨지는 현상
내부 단편화: 프레임으로 메모리를 관리하는 개념이 도입되는 순간, 사용하지 못하는 공간이 발생하게 된다. 땅을 일정 건물로 다 나눠놓았는데 누구는 그 공간을 다 쓰고 누구는 그 공간을 낭비할 수도 있는 거다. 그런 개념이 발생할 수 밖에 없다, 원인은 프레임
페이지를 분산된 프레임 속에 적절하게 배치한다고 할때 CPU 입장에서는 당황스럽다. 명령어 자체는 그냥 바로 다음 주소인데 실제 논리주소와 물리 주소간 차이 발생하기 때문이다. 이 모든걸 해결해 주는게 페이지 테이블이다.
논리 주소에 매칭되어 실제 프레임 주소를 반환해주는 테이블을 이용해 오류 없이 계산한다.
각 프로세스 마다 페이지 테이블이 존재하고, 이 페이지 테이블은 메모리에 따로 적재되어 있으며, 해당 페이지 테이블의 주소는 CPU의 레지스터에 저장되어 있는데 그게 바로 페이지 테이블 베이스 레지스터
PTBR; Page Table Base Register
이다. 레지스터에 주소를 올려 놓은 것만으로도 메모리에 연속적으로 접근해야되는 수고를 덜어준다.
그런데 이렇게 주소만 가지고 있어도 어차피 메모리를 한 번 이상 접근해야되는건 똑같다. 그래서 이를 극복하기 위해 MMU 안에 TLB; Translation Lookaside Buffer
라는 캐시메모리를 두어 메모리 접근 없이도 바로 메모리 주소 참조할 수 있게하는 방식으로 성능을 향상시킨다.
핵심은. 명령어는 결국 페이지+ 변위이다.
더 구체적으로 만약 페이지의 단위가 4096이라 했을때, 논리주소 10000은 4096으로 나누면 페이지 번호이다. 그리고 논리주소를 4096으로 나눈 나머지가 변위가 되게 된다. 이게 페이지번호와 변위로 이루어져 있다는 의미이다.
페이지 번호로 찾아간 뒤 변위를 더해 필요한 주소값에 접근한다. 이때 페이지 번호와 매칭되는 값은 프레임 번호이고, 그것이 저장된 테이블이 페이지 테이블임.
페이지 테이블 한 행 한 행을 페이지 테이블 엔트리라고 한다.
페이지 테이블 엔트리의 핵심은 페이지 주소를 실제 프레임주소로 매칭시키는것. 그 외 여러 정보들이 저장되어 있다. 유효 비트
부호 비트
참조 비트
수정 비트
페이지도 스와핑을 한다. 막 실행중인 프로세스라고 하더라도, 페이지 단위로 페이지 아웃이 되어 있을 수 있다. 페이지 아웃이 일어나 잇는 상태면 유효비트 == 0, 페이지 인 되어 있는 상태면 유효 비트 == 1
존재 이유: 메모리에 없으면 참조 명령어가 일어날 때 페이지 폴트 예외를 발생시키고 폴트 처리 루틴을 수행한 뒤에 돌아와서 에러 없게 한다.
이진 보호 비트 : 읽기만 가능한 상태면 0 쓰기도 가능한 상태면 1
복잡한 보호 비트: r, w, x 등의 구체적인 보호 비트를 두고서 true면 1 false면 0을 두는 방식
존재 이유: 보호 비트가 없는 채로 읽기 쓰기 명령이 막 일어나면 데이터 무결성을 해친다.
cpu가 참조한 적있는지 아직 사용안했는지를 구별하는 비트
존재 이유: 페이지 교체 알고리즘에서 사용됨. LRU; Least Recently Used
페이지 교체 알고리즘은 참조비트 값을 비교하여 어떤 녀석을 페이지 아웃 시킬지 결정하기 때문
변경된 적이 있는지 없는지를 구별하는 비트
존재 이유: 디스크 저장 하드웨어 사용 자원 효율 향상에 필요함. 한번도 수정된 적이 없는 페이지는 디스크에 저장할 필요가 없기에 그냥 날려버리면 됨.
1️⃣ 페이징에 대한 설명으로 옳지 않은 것을 골라보세요.
2️⃣ 3️⃣ 4️⃣