가상메모리를 관리하는 기법인 세그먼테이션(Segmentation) 과 페이징(Paging)에 대해 알아보자.
먼저 가상메모리는 메모리에 로드된 즉, 실행중인 프로세스가 가상의 공간을 참조하여 마치 커다란 물리메모리를 갖고 있는 것처럼 사용할 수 있도록 하는 것이다.
간단하게 말해 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다.
예를 들어, 내가 실행하고자 하는 프로그램의 용량이 5GB인데, 메모리(RAM)는 4GB이다.. 그럼 어떻게 실행하지?
4GB에 10GB를 올리는 것도 문제인데, 억지로 올린다고 쳐도.. 해당 프로그램이 실행될 때는 다른 작업은 아무것도 못하게 되지 않는가.
이런 경우 사용되는 기술이 바로 가상메모리다.
가상메모리는 각 프로세스 당 메인메모리와 동일한 크기로 하나씩 할당된다. 그 공간은 보조기억장치(=HDD, SSD) 공간을 이용한다,
프로세스의 일부만 메모리에 로드하고 나머지는 보조기억장치에 두는 형태이다.
이렇게 할당되면 메모리 관리 장치(MMU) 라는 친구에 의해서 물리 주소로 변환이 되어 유저가 메모리 맵핑이 어떻게 되는지 의식할 필요 없이 알아서 가상메모리를 활용하여 작업한다.
자 그럼 가상메모리를 알아봤으니, 이 녀석을 관리하는 기법을 알아보자.
intel x8086 에서는 세그먼테이션과 페이징 기법을 함께 사용한다.
먼저 세그먼테이션에 대해 보자.
세그먼테이션(Segmentation) 기법이란
메모리를 서로 크기가 다른 논리적인 블록 단위인 '세그먼트(segment)'로 분할하고 메모리를 할당하여 물리 주소를 논리 주소로 변환하는 것을 말한다.
미리 분할하는 것이 아니고 메모리를 사용할 시점에 할당된다.
그럼 세그먼트가 무엇인가. 사전적 의미를 보자면... 서로 다른 크기를 가지는 논리적인 블록이 연속적인 공간에 배치되어 있는 것.
이렇게 추상적으로 말하면 도무지 이해가 안간다. 예전에 썼던 그림을 가져와봄..
메모리 레이아웃이다. (커널-스택-공유라이브러리-힙-BSS-데이터-코드)
이렇게 각각 나누어진 영역을 세그먼트라고 한다. 그리고 이렇게 영역별로 쪼개는 기술을 세그먼테이션이라고 한다.
각각 다른 크기의 논리적 블록을 연속적으로 배치한 것이 보입니까
각 영역들의 기능, 권한, 필요한 공간의 크기가 모두 다르기 때문에 세그먼테이션 기술로 분할하여 효율적인 메모리 관리가 가능하도록 한 것이다.
세그먼테이션을 사용하면 세그먼트 테이블(Segment Table)이라고 세그먼트의 시작주소(base)와 세그먼트의 길이(limit) 정보가 담긴 테이블을 운용한다.
이걸로 인해 각각의 세그먼트를 offset 단위로 관리할 수 있다. offset으로 관리하고, 논리적인 영역으로 나누어 놓으면.. 시작주소와 offset 값으로 실제 물리적 위치로 변환이 가능하므로 관리가 편하고, 세그먼트 간에 권한 레벨 관리도 수훨해진다.
다음은 페이징 기법에 대해 알아보자.
페이징(paging) 기법이란,
세그먼테이션과 가상 메모리를 고정된 크기로 나누어 메모리를 관리하는 것이다.
좀 더 디테일하게 말하자면, 커다란 크기의 작업을 고정된 일정한 크기로 나누어 잘게 쪼개어 처리하는 것이다. 이렇게 되면 불연속적인 메모리 요청 등에 유연하게 처리할 수 있다.
세그먼테이션은 논리적 블록을 필요에 따라, 다른 크기로 할당한 것이라면, 페이징은 고정된 크기로 나누는 것이다.
어렵게 생각할 것이 없다. 어셈블리 코드 한줄한줄이 모두 동일한 크기로 할당되지 않는가? 그게 페이징이다.
이 때, 잘게 쪼개어진 고정된 크기의 블록을 페이지(page)라고 한다. 이에 대응하는 물리 메모리를 페이지와 같은 크기로 나누는 블록 단위를 프레임(frame)이라고 한다.
페이징 기법이 적용된 시스템에서 가상 주소는 p(페이지 번호), d(offset) 두가지로 나타낸다. (그 정보는 페이지 테이블 엔트리 (Page Table Entry, PTE) 라는 곳에 있다.)
가상 주소 -> 물리 주소로 변환하는 과정을 address translation 이라고 말하는데 (그냥 영어로 적은거 ㅋㅋ)
주소 변환할 때 페이징 기법이 적용되어 있다면 p를 이용해 프레임 번호를 알아내고(p') 거기에 offset을 더하여 물리 주소를 구한다.
결론적으로
r(물리 주소) = p'(프레임 번호) + d(offset)
세그먼테이션으로 메모리 전체 레이아웃을 분할하고 프로세스가 요구하는 작업들을 동일한 크기로 쪼개어 페이지 단위로 작업을 처리한다.
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
플로피 디스크 (Floppy Disk) (0) | 2021.04.17 |
---|---|
화면 모드와 비디오 메모리 (0) | 2021.04.17 |
바이트 오더링 (Byte Ordering) (0) | 2021.04.17 |
함수 호출 규약 (Function Calling Convention) (0) | 2021.04.17 |
메모리 스택(Stack)영역 (0) | 2021.04.17 |