8.1 배경(Background)
- 메모리는 각각 주소가 할당된 일련의 바이트들로 구성된다.
-명령어 실행과정
메모리로부터 명령어 하나를 가져옴 -> 해독 -> 메모리에서 피연산자를 가져와서 명령을 실행하고 메모리에 다시 저장
8.1.1 기본 하드웨어
- CPU는 레지스터 접근은 1사이클에 걸리지만, 메모리접근은 그 이상이 걸린다. -> 캐시를 이용해 CPU의 메모리 접근속도를 향상한다.
-
특정 프로세스가 접근할 수 있는 합법적인 메모리 주소영역을 설정하여, 프로세스가 합법적인 영역만 접근할 수 있도록 한다. base와 limit레지스터에 하한과 상한 주소 값이 들어가 있는데 CPU에서 만들어진 주소가 이 주소들 사이에 있는지 확인한다.
8.1.2 주소의 할당(Address Binding)
- 과정
원시 프로그램의 심볼 주소(변수 count) -> 재배치 가능 주소(첫번째 바이트로부터 열네번째 바이트) -> 절대주소(74014번지)
- 바인딩(binding)은 한 주소 공간에서 다른 주소 공간으로 맵핑하는 것
- 컴파일 시간 바인딩(compile time) : 프로세스가 메모리내에 들어갈 위치를 안다
- 적재 시간 바인딩(load time) : loader가 주소를 계산해야한다
- 실행 시간 바인당(execution time) : 프로세스가 load후에도 옮겨지는가?
8.1.3 논리 대 물리 주소 공간(Logical-Versus Physical-Address Space)
- 논리주소/가상주소 : CPU가 생성하는 주소, 실행시간 바인딩에서 논리,물리 주소가 다름
- 물리주소 : 메모리가 취급하는 주소
- MMU(Memory Managerment Unit)이 가상주소를 물리주소로 변경해준다.
위 그림에서는 논리 주소가 생성되면 기준 레지스터를 더해 물리주소로 변경된다.
8.1.4 동적 적재(Dynamic Loading)
- 프로세스 전체가 메모리에 올라오면 프로세스의 크기는 메모리의 크기보다 작아야한다.
- 각 루틴은 메모리에 올라오지 않고 재배치 가능한 상태로 디스크에 대기하다가 호출되면 메모리로 적재된다.
8.1.5 동적 연결 및 공유 라이브러리(Dynamic Linking & Shared Libraries)
- 동적 연결 라이브러리는 사용자 프로그램이 실행될 때, 사용자 프로그램에 연결된느 시스템 라이브러리이다.
- 동적 연결에서 라이브러리를 부르는 곳마다 스텁(stub)이 생기고, 그것은 이 라이브러리를 어떻게 찾을 것인가를 알려주는 작은 코드조각이다.
- 스텁은 필요한 라이브러리 루틴이 메모리에 있는가 확인하고, 없으면 가져온다.
8.2 스와핑(Swapping)
- 프로세스를 저장장치로 내보냈다가 다시 메모리로 올라 올 수 있다.
- 다중프로그래밍 정도(한번에 여러개의 프로세스를 실행)를 증가시킴
8.2.1 기본 스와핑
- 프로세스는 저장장치로 스왑아웃되고, 실행을 위해 메모리로 스왑인 된다.
- 제약, 스왑하려는 프로세스는 완전히 휴지 사애에있음을 확인해야함. 프로세스가 입출력장치와 신호를 주고받는 동안에는 스왑하면 안된다.
8.2.2 모바일 시스템에서의 스와핑
- 모바일 시스템은 플래시 메모리를 사용하여 1.저장 공간이 작고 2.쓰기가능횟수가 정해져있고 3.처리량이 저조한 이유 때문에 스와핑은 지원하지 않는다
- 메모리가 부족하면 프로그램을 반환하여 공간을 확보함., android는 상태를 플래시 메모리에 저장하여 빠른 재시작이 가능함.
- 대신에, 페이징기법을 사용한다.
8.3 연속 메모리 할당(Contiguous Memory Allocation)
- 초기 메모리 할당 방법중 하나
- 메모리는 운영체제를 위한 부분과 사용자 프로세스를 위한 부분으로 나뉨.
8.3.1 메모리 보호(Memory Protection)
-
8.3.2 메모리 할당(Memory Allocation)
- 가변분할 기법 : 각 사용자 프로세스는 연속된 단일 영역을 할당 받음
- 메모리 할당에 3가지 방법이 있다.
최초적합 : 첫 번째 사용가능한 공간을 할당. 검색은 집합의 시작 or 지난번 검색이 끝났던 곳
최적적합 : 사용 가능한 공간 중 가장 작은 것.
최악적합 : 가장 큰 가용공간을 선택.
8.3.3 단편화(Fragmentation)
- 외부단편화(external fragmentation) : 메모리에 할당,제거가 반복되면 어떤 hole은 매우 작아진다. 이러한 hole을 합치면 할당할 프로세스보다 크지만 분할되어있어서 할당할 수 없을 때 발생.
- 내부단편화(internal fragmentation) : hole에 100만큼의 공간이 있고 70크기의 프로세스를 할당하면 나머지 30부분은 사용하지 않는 부분.
- 외부 단편화 문제 해결 방법 : 압축(compaction), 메모리 모든 내용을 한곳으로 몰고 hole을 다른 한곳으로 몰아서 큰 블록을 만드는 것. -> overhead가 너무 크다
8.4 세그먼테이션(Segmentation)
- C 컴파일러는 코드,전역변수,힙,스택,표준C라이브러리와 같은 세그먼트를 생성한다. 각 세그먼트는 메모리에 분리되어 저장될 수 있다.
- CPU가 생성하는 주소는 각 세그먼트 시작 주소와, 그것에 offset으로 구성된다.
- 외부 단편화 문제가 생김,
8.5 페이징(Paging)
- 물리 메모리는 같은 크기 블록인 프레임(Frame)으로 나눔, 논리 메모리는 페이지(page)로 나눔.
- 가상 주소는 페이지번호,오프셋로 이루어짐
- 페이지 테이블(page table) : 주 메모리에서 각 페이지가 점유하는 주소를 가짐
논리주소가 2bit,2bit인 페이징 예
- 페이징 기법은 외부 단편화가 발생하지 않지만, 페이지 크기가 클수록 내부 단편화가 커짐, 페이지 크기가 작아지면 내부 단편화는 작아지지만 페이지 테이블의 크기가 커짐.
- 프레임 테이블(frame table)은 어느 프레임이 할당되어있고, 어느 프레임이 사용가능한지, 총 프레임은 몇 개가 되는지 등을 알고 있는 자료구조이다.
8.5.2 하드웨어 지원
- 페이지 테이블(page table) : 매인메모리에 유지된다.
- 페이지 테이블 기준 레지스터(Page-table base register)는 페이지 테이블의 위치를 가르킨다. 다른 페이지 테이블을 사용하려면 이 레지스터를 변경시킨다.
- 페이지 테이블에 접근하여(메모리접근1회) 메모리에서 프레임 번호를 얻어내어, 페이지 offset과 더하여 실제 주소를 계산한다.(메모리접근 1회) -> 메모리 접근이 두 번 필요하다. -> TLB(translation Look-aside Buffers)를 이용한다.
- TLB(translation Look-aside Buffers) : 소형 하드웨어 캐시. 각 항목은 키와 값으로 구성됨. 페이지 요청이 들어오면 TLB 키와 동시에 비교하여 맞는 것이 있으면 그에 대응하면 프레임 번호를 알려준다. 해당하는 내용이 TLB에 없다면 메모리와 작업을 진행하고 진행한 내용을 TLB에 저장하여 다음 참조 시에 빠른 처리를 지원한다.
- 실제 메모리 접근시간(Effective access time) :
TLBhitrate X 메모리접근시간 + (1-TLBhitrate) X (메모리접근시간X2)
8.5.3 보호(Protection)
- 각 페이지에 붙은 보호비트에 의해 구현됨.
- 유효/무효 비트 : 유효->관련된 페이지가 프로세스의 합법적인 페이지
무효->관련된 페이지가 프로세스의 논리 주소 공간에 속하지 않는다.
- 페이지 테이블 길이 레지스터(page table length register)는 페이지 테이블의 크기를 나타내는데 이것을 이용해서 프로세스가 제시한 주소가 유효한 범위 내에 있는지를 확인한다.
8.6 페이지 테이블의 구조(Structure of the page table)
- 페이지 테이블을 구성하는 방법 -> 계층적 페이지, 해시 테이블 페이지, 역 페이지 테이블
8.6.1 계층적 페이징(Hierarchical paging)
- 32비트 컴퓨터에선 페이지 테이블은 4MB정도로 크다.
- 페이지 테이블을 작은 조각으로 나눈다. 페이지 테이블 자체가 다시 페이지화 되는 것.
- p1은 바깥 페이지 테이블의 인덱스,p2는 안쪽 페이지 테이블의 페이지 내의 변위, d는 페이지의 오프셋
- 페이지의 접근 시간이 늘어나는 단점이 있다. 64비트 컴퓨터에서는 페이지 크기가 어마어마하게 크다.
8.6.3 해시 페이지 테이블(Hash Page Tables)
- 해시 테이블에 각 항목은 연결리스트를 가지고 있으며, 충돌을 일으켜서 이곳으로 해시되는 원소들이 연결된다.
- 각 원소는 가상 페이지번호, 사상되는 페이지 프레임 번호, 연결 리스트 상의 다음 원소 포인터를 가진다.
- 알고리즘 : 가상 주소 공간에서 페이지 번호가 오면 그것을 해싱함수에의해 해싱한다 -> 페이지 테이블에서 연결리스트를 따라가며 첫 번째 원소와 가상 페이지 번호를 비교해본다 -> 일치하면 그에 대응하는 페이지 프레임 번호를 가져와 물리주소를 얻고, 일치하지 않으면 다음 원소로 이동하여 반복.
8.6.3 역 페이지 테이블(Inverted Page Table)
- 보통 프로세스 마다 각자 하나씩 페이지 테이블을 가짐 -> 프로세스 전체가 공통으로 사용하는 페이지 테이블, 가상 주소에는 프로세스ID와 페이지 주소를 가지고 있다.
- 메모리공간을 작게 사용한다.
- 주소변환 시간이 더 오래 걸린다.