본문 바로가기
ComputerScience/OperatingSystem

[OS] 4. 메인 메모리

by Develaniper 2021. 5. 20.

※본 포스팅은 공부목적(https://develaniper-devpage.tistory.com/77)에 따라 해당 블로그와 깃허브를 참조하여 제작된 포스팅 입니다.

 

1.  스와핑(Swapping)

프로세스 실행 중 임시로 메인메모리에 있던 프로세스를 보조메모리로 보냈다가 다시 되돌리는 경우가 있다. 예를 들어 RoundRobin 스케줄링의 경우 CPU할당 시간이 끝나면 주 메모리 관리기가 이 프로세스를 보조 메모리로 보내고 다른 프로세스를 메모리로 불러 들일 수 있다. 즉, 스왑 시킬 수 있다.

대략적인 개념은 위와같이 CPU 버스트 시간을 모두 사용한 프로세스를 메인메모리에서 내려 보조메모리에 저장하고 다음 프로세스를 올리는 작업을 말한다.

 보조메모리에 접근하는 것 자체가 많은 시간이 필요하기 때문에 메모리 공간이 부족할 때 Swapping이 시작된다.

 

2. 메모리 할당

 

 - 동적 공간 할당문제

 남아있는 메모리 공간 리스트에 대해 어떻게 메모리를 할당할 것인가에 대한 문제로

 일련의 공간들 리스트로 부터 일정크기의 블록을 요구하는 것을 만족시키는 방법에 대한 문제이다.

  1. 최초 적합 : 검색 시작 후 가장 가장 첫번째 사용 가능 공간을 할당하는 방법으로 가장 빠르게 공간할당을 할 수 있다.
  2. 최적 적합 : 사용 가능한 공간들 중 가장 작은 것을 선택한다. 아주 작은 나머지 공간을 만들어 낸다. 
  3. 최악 적합 : 가장 큰 공간을 택한다. 남은 공간이 충분히 커서 다른 프로세스들의 공간이 유용하게 사용될 수 있다.

※최적 적합과 최악적합의 경우 사용가능 공간 리스트 전체를 검색해야 한다.

공간 효율성 : BestFit > FirstFit > WorstFit

시간 효율성 : FirstFit > BestFit = WorstFit

 

 - 단편화

1) 외부 단편화

메모리에 필요한 만큼의 큰 공간이 남아 있지만  작은 단위로 여러 곳에 흩어져 있어서 실제로 메모리를 할당 할 수 없는 상황으로 세그먼테이션을 사용할때 발생되는 문제이다.

그림과 같이 3군데의 공간을 모아놓으면 각 1+1+2로 총 4의 공간이 나오지만 흩어져있어서 할당할 수 없는 상황이다.

 

2) 내부 단편화

필요한 양보다 더 큰 메모리가 할당되어서 메모리 공간이 낭비되는 현상이다. 페이징 같이 메모리를 일정 크기로 나누어서 할당을 할 때 발생하는 문제이다.

위 그림에서와 같이 3만큼의 크기가 필요한데 크기가 4인 공간을 할당하여 1이 낭비되는 현상으로 그 차이가 클 수록 낭비되는 공간이 많아질 것이다.

 

3. 페이징(Paging)

페이징은 외부 단편화 문제를 해소하기 위한 방법으로 물리메모리인 Frame과 논리 메모리인 Page라는 크기의 블록으로 나눠 프로세스를 페이지 단위로 나눈 후 사용하는 영역만 메모리에 적재시킨 후 프로세스를 진행하는 방법이다. 페이징 기법을 통해 논리 주소 공간이 한 연속적인 공간에 다 모여 있어야 한다는 제약을 없애고 외부 단편화를 해결할 수 있다. 하지만 페이징 기법을 이용하면 내부 단편화의 문제점이 남게된다.

- 방법

  1.  물리 메모리는 프레임이라는 같은 크기의 블록으로 나누어져 있다. 논리메모리는 페이지라고 불리는 같은 크기의 블록으로 나누어진다.
  2. 프로세스는 페이지단위로 나뉘어져 보조메모리에 저장되고, 프로세스가 실행 될때 그 프로세스의 페이지는 필요한 만큼 프레임에 나누어 들어가게된다.
  3. 각 페이지는 페이지테이블(재배치 레지스터)에 저장되며 몇번째 프레임에 할당되는지 mapping되어 저장된다.
  4. 물리메모리에 올라간 페이지를 참조할 때는 페이지 번호와(p) 페이지 변위(d)를 참조하는데 페이지 테이블의 번호를 통해 어떤 프레임에 저장되었는지를 확인하고, 변위를 통해 해당 페이지의 시작을 0으로 봤을 때 필요한 부분이 해당 페이지의 어느 위치에 있는지를 확인한다.

위 그림은 CPU가 0번째페이지의 4째 줄을 참조하고 있는 것을 표현했다고 보면 된다.

 

 

- 페이지의 크기

페이지의 크기는 얼마나 크게 관리하는게 좋을까?

  • 페이지 크기가 작을 수록
    • 페이지의 크기가 작다면 내부단편화의 크기가 줄어들어 더 효율적으로 메모리를 사용할 수 있다.
    • 페이지가 크면 불필요한 영역까지 함께 적재될 수 있다. 따라서 페이지 크기가 작을 수록 필요한 부분만 적재 할 수 있기 때문에 정밀도가 증가한다.(효율적인 메모리 사용)
    • => 메모리의 효율적 이용
  • 페이지 크기가 클 수록
    • 페이지의 크기가 크다면 디스크에 접근하는 횟수가 줄어들고 디스크가 페이지를 관리하는 것이 더 수월할 것이다.
    • 디스크 이동으로 한번에 불러 올 수 있는 페이지의 양이 더 크기 때문에 헤드 이동시간이 더 작다.
    • 페이지 내에 더 많은 내용을 담고 있기 때문에 페이지 테이블의 크기가 작아진다.
    • (가상메모리에서) 페이지 부재 횟수가 적어진다.
    • 하지만 작은 프로세스에 할당하게된다면 내부 단편화의 크기가 커질 것이다.
    • => 시간이 줄어듦

주메모리의 크기가 커짐에 따라 페이지도 함께 커져왔고, 어떤 CPU나 OS는 여러개의 페이지 크기도 허용한다. (Solaris)

 

- 프레임테이블과 페이지 테이블

 프레임 테이블 - 운영체제 입장에서는 이런 프레임들에 대해 프레임의 가용 여부, 할당여부, 총 프레임의 수, 가용프레임의 수 등을 관리해야 하는데 이는 프레임 테이블에 저장되어 있다.

 

페이지 테이블 - 또한, 운영체제는 모든 프로세스의 주소들을 실제 주소로 사상할 수 있어야 하는데 이를 위해 페이지 테이블을 유지하고 있다.

 

- 페이지 테이블 저장위치

페이지 테이블은 메인 메모리,  CPU내부 레지스터에 저장할 수 있는데 두가지의 장/단점은 다음과 같다.

레지스터에 저장하면 주소변환속도는 매우 빠르지만 페이지 테이블의 양이 매우 한정적이다.

메인 메모리에 저장하면 크기에 제한은 없을 수 있지만 메모리에 2번 접근해야하므로 속도가 2배로 느려진다.

=> 이에 따라 TLB(Translation Look-aside Buffer)라고 하는 별도의 페이지테이블 칩을 만들어 저장한다. TLB는 캐시와 동일한 역할을 수행하고 전체 페이지 테이블은 메모리에 위치하며 테이블의 일부를 TLB에 가져와 사용한다.

 

- 공유페이지

페이징의 또 다른 장점은 코드를 쉽게 공유 할 수 있다는 점이다.

예를 들어 한 프로그램은 150KB의 코드50KB의 자료공간으로 이루어져 있어서 20명의 사용자가 이 프로그램을 이용한다고 생각해보자. 이 프로그램을 실행하기 위해서는 200KB의 메모리 공간이 필요하기 때문에 20명의 사용자가 사용하려면 200KB*20으로 총 4000KB의 공간이 필요할 것이다. 하지만 코드부분의 페이지를 공유하게 된다면 150KB+50KB*201150KB만으로 20명의 사용자를 지원 할 수 있다.

4. 세그멘테이션

세그멘테이션은 메모리를 사용자 관점에서 지원하는 메모리 기법이다.

세그멘테이션은 프로세스를 세그먼트(segment)로 나눈다. 세그먼트란 사용자 관점을 지원하는 단위로 code, data, stack과 같이 논리적인 실행단위로 나눌 수 있다. 세그먼트는 예보다 더 작은 단위로 나눌 수 도 있다.

 

그림과 같이 서로 다른 크기로 세그먼트를 나눌 수 있으며 각 세그먼트는 사용자의 관점으로 나눌 수 있다.

 

- 세그먼트 테이블

세그먼트 테이블을 만드는 법은 페이지 테이블과 유사하나 조금의 차이점이 있다.

 

세그먼트 테이블 또한 두가지의 변위를 통해 메인메모리에 접근을 한다. 하지만 다른점은 세그먼트 테이블이 base와 limit로 나뉘어 있다는 점이다.

만일 변위 d의 범위가 s가 가리키는 2번째 limit보다 큰(700이상) 수일 경우 세그먼트의 범위를 벗어나기 때문에 트랩(cpu가 자신에게 거는 인터럽트(내부 인터럽트))을 발생시킵니다.

 즉, 세그먼트들의 크기가 모두 다르기 때문에 세그먼트 테이블은 세그먼트가 시작하는 위치 뿐 아니라 세그먼트의 크기를 저장하여 범위를 벗어 나는지 확인하는 과정을 거친다.

위 그림에서 참조하는 메모리 주소는 100(2에 매핑되는 시작주소)+100(limit를 벗어나지 않은 변위 d)으로 200이 된다.

 

세그멘테이션은 사용자관점의 분할 방식을 사용하고 메모리영역의 보호와 공유를 할 때 페이징에 비해 유리하다. 하지만 세그멘테이션을 할 경우에는 그 크기가 제각각이므로 외부단편화라는 문제점이 남아있다.

 

 - 세그먼테이션과 페이징 비교

위에서 언급했듯이 세그멘테이션은 페이징에 비해 공유와 보호측면에서 이점이 있다.  하지만 프로세스의 크기가 제각각이라 빈 메모리공간의 크기가 제각각이다.

 결론적으로 세그멘테이션의 보호와 공유라는 장점과 페이징의 외부단편화 문제를 해결하기 위해 두개를 합쳐서 사용하는 방법이 있다. 세그먼트를 페이징 기법으로 나누는 방법이다.

 하지만, 두가지 방법을 함께 쓴다면 주소 변환도 2번 해야한다는 단점이 있다. 즉, CPU에서 세그먼트 테이블에서 주소를 변환한 후 페이지 테이블에서 주소를 변환해야 한다.

 

 

https://velog.io/@codemcd/운영체제OS-13.-페이징

 

댓글