1. 가상메모리의 주요 구성 요소와 메커니즘
가상 주소 공간(Virtual Address Space)
가상 주소 공간은 프로그램이 메모리를 접근할 때 사용하는 주소의 집합입니다. 이 공간은 실제 물리 메모리의 크기와 독립적이며, 운영체제에 의해 관리됩니다. 프로그램은 이 가상 주소 공간을 실제 메모리처럼 사용할 수 있으며, 실제 물리 메모리의 위치를 신경 쓰지 않아도 됩니다.
가상메모리는 OS에서 사용되는 메모리 관리 기법의 하나로 컴퓨터가 실제로 이용 가능한 메모리 자원(실제주소, physical address)을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말합니다.
메모리 관리 단위(Memory Management Unit, MMU)
MMU는 CPU 내부에 있는 하드웨어 컴포넌트로, 가상 주소를 물리 주소로 변환하는 역할을 합니다. 이 변환 과정은 페이지 테이블을 통해 이루어지며, MMU는 이 페이지 테이블의 정보를 사용하여 변환을 수행합니다.
* 가상주소 : MMU와 페이지테이블(page table)에 의해 실제 주소로 변환됨
* 페이지: 가상 메모리를 일정 크기의 블록으로 나눈 것으로, 이들 각각은 연속적인 가상 주소 공간을 차지합니다.
* 프레임: 물리 메모리의 페이지와 같은 크기의 블록으로 나누어진 것으로, 페이지가 물리 메모리에 로드될 때 프레임 내에 배치됩니다.
가상메모리의 페이지들이 MMU에 의해서 관리되는 페이지테이블을 기반으로 실제주소와 Mapping 됩니다.
2. 페이지 테이블
페이지 테이블은 가상 주소와 물리 주소의 매핑 정보를 저장하는 데이터 구조입니다. 운영체제는 이 테이블을 관리하며, MMU는 가상 주소를 물리 주소로 변환할 때 페이지 테이블을 참조합니다.
가상메모리는 가상 주소와 실제 주소가 매핑되어 있는 페이지테이블로 관리되며 이때 속도 향상을 위해 캐싱계층인 TLB를 사용합니다.
가상 주소에서 바로 페이지 테이블을 가는게 아니라, TLB에서 있는지를 확인하고 만약 없다면 페이지테이블로 가서 실제주소를 가져옵니다.
TLB(Translation Lookaside Buffer)
TLB는 가장 최근에 접근한 페이지 테이블의 매핑 정보를 캐시하는 소규모의 고속 메모리입니다. TLB를 사용함으로써, 페이지 테이블에 대한 반복적인 접근을 줄이고 메모리 접근 속도를 향상시킬 수 있습니다.
3. 페이지폴트와 스와핑
가상메모리는 작은 메모리를 매우 큰 메모리로 보이게끔 하는 것이기 때문에 참조하려는 메모리 영역이 실제에는 없을 수도 있습니다. 이때, 페이지폴트가 발생합니다.
즉, 가상메모리에는 존재하지만 실제메모리인 RAM에는 현재 없는 데이터나 코드에 접근하는 경우가 있으며 이때에 페이지 폴트가 발생합니다.
메모리의 당장 사용하지 않는 영역을 하드디스크로 옮기고 하드디스크의 일부분을 "마치 메모리처럼" 불러와 쓰는 것을 스와핑이라고 합니다. (스와핑에도 여러가지 알고리즘이 있는데 이건 다음 포스팅에서 해볼게요!
압축하자면 !!
프로그램이 접근하려는 데이터나 코드가 현재 메모리에 로드되어 있지 않을 때 페이지 폴트가 발생합니다. 운영체제는 이를 처리하기 위해 필요한 페이지를 디스크에서 찾아 메모리로 로드합니다. 이 과정은 메모리 접근 지연을 초래할 수 있으나, 가상메모리를 통해 크기를 초과하는 프로그램 실행을 가능하게 합니다.
메모리 공간이 부족할 때, 운영체제는 사용 빈도가 낮은 페이지를 디스크로 이동시키는 스와핑을 수행합니다. 이후 해당 페이지가 필요할 때 다시 메모리로 불러옵니다. 스와핑은 메모리 사용의 유연성을 제공하지만, 디스크 접근은 메모리 접근보다 훨씬 느리므로 시스템 성능에 영향을 줄 수 있습니다.
4. 페이지 폴트의 과정
- 어떤 명령어가 유효한 가상주소에 접근했으나 해당 페이지가 만약 없다면 트랩(소프트웨어 인터럽트)이 발생되어 운영체제에 알리게 됩니다.
- 운영체제는 실제 디시크로부터 사용하지 않은 프래임(물리 메모리 최소단위)을 찾습니다.
- 해당 프레임을 실제 메모리에 가져와서 페이지 교체 알고리즘을 기반으로 특정 페이지와 교체합니다(스와핑 발생)
- 페이지테이블을 갱신시킨 후 해당 명령어를 다시 시작
5. 스레싱(Thrashing)
스레싱은 메모리의 페이지 폴트율이 놓은 것을 말합니다. 즉, 많이 스와핑도 일어나고 ,많이 페이지 폴트도 일어나는 상황을 말합니다.
메모리에 너무 많은 프로세스가 동시에 올라가게 되면 스와핑이 많이 일어나서 발생하는거죠! 페이지 폴트가 일어나면 CPU이용률은 낮아집니다.
이걸 좀 더 구체적으로 설명하자면,,,프로세스를 많이 올리게되면 그만큼 메모리 참조가 많아지므로 페이지 폴트가 많이 일어나게 되고 이로 인해 부족해진 메모리때문에 스와핑이 많이 일어나게 됩니다. 스와핑이 많이 일어나면 CPU이용률은 떨어지는데 그러면 CPU가 일을 안한다고 생각하고 CPU에 일을 더 주게되고 그럼 프로세스가 더 올라가게 되니 악순환이 반복됩니다! 이러한 악순환이 반복되어 "스레싱"이 일어납니다!
6. 스레싱 해결방법
- 하드위에적으로 해결
- 메모리 늘리기: 물리 메모리 용량을 증가시켜 스와핑과 페이지 폴트의 빈도를 줄입니다.
- HDD를 사용한다면 SSD로 바꾸기
- 운영체제에서 해결
- 작업세트: 프로세스의 과거 사용이력을 기반으로 많이 사용하는 페이지 집합을 만들어 한꺼번에 미리 메모리를 로드하는 것-> 프로세스의 작업세트(활발하게 사용되는 페이지 집합)를 추적하여 메모리 할당을 최적화합니다.
- PFF(page fault frequency): 페이지폴트 빈도를 조절하는 방법으로 상한선과 하한선을 만들고 상한선에 도달한다면 프레임을 늘리고, 하한선에 도달한다면 프레임을 줄이는 방법.
7. 가상메모리의 필요성
- 주기억장치(RAM)의 효율적 관리(스와핑): 하드디시크를 주기억장치에 대한 캐시로 설정하여, 당장 사용하는 영역만 유지하고 쓰지 않는 데이터는 하드디스크로 옮긴 뒤, 필요할 때만 램에 데이터를 불러와 올리고 다시 사용하지 않으면 하드디스크로 내림으로써 효과적으로 관리
- 메모리 관리의 단순화: 각 프로세스마다 가상메모리의 통일된 주소 공간을 배정할 수 있으므로 메모리 관리가 단순
- 메모리 용량 및 안정성 보장: 한정된 공간의 램이 아닌 거의 무한한 가상메모리 공간을 배정함으로써 프로세스들끼리 메모리 침범이 일어날 여지를 크게 줄임
이렇게 정리를 해보니 3차프로젝트에서 힙 메모리 에러가 나고 그걸 해결하니 cpu가 터졌다가 swap 메모리를 할당했더니 괜찮아졌던 기억이 나네요,,, 이걸 근본적으로 해결하려면 메모리를 늘려줬어야 했는데... 저는 돈이 없어서 swap메모리를 할당함으로써 해결했었습니다. 이에 대한 트러블 슈팅도 자세히 기록해볼게용!
'운영체제' 카테고리의 다른 글
메모리 계층 (0) | 2024.02.08 |
---|---|
시스템콜과 modebit (1) | 2024.02.08 |
인터럽트(Interrupt) (1) | 2024.02.08 |
운영체제와 컴퓨터시스템의 구조 (1) | 2024.02.07 |