주기억 장치

이한수·2022년 3월 22일
0

OS

목록 보기
6/10

개인 공부 내용 정리 목적입니다.
참고 : 양희재 교수님 (OS)
참고 : https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-12.-%EC%A3%BC%EA%B8%B0%EC%96%B5%EC%9E%A5%EC%B9%98%EA%B4%80%EB%A6%AC

OS의 또 다른 중요한 기능이 메모리에 대해서 알아보자.

메모리는 주소와 데이터로 구성되어 있다.

CPU와 메모리는 양방향으로 위 그림과 같이 주고 받는다.

CPU는 주소를 가지고 메인 메모리에 요청을 하거나 해당 주소에 계산 결과를 저장하고, 메모리는 요구하는 주소에 저장되어 있는 데이터를 CPU에게 전달한다.

다중 프로그램이 환경에서는 제한적인 메모리 공간을 이용하여 여러 프로세스를 사용하기 위해서는

여러 프로그램들이 사용될 때는 메모리에 올라갔다가 내려 갔다가를 반복한다.

하지만 이 과정에서 기존에 배치 받았던 메모리 주소를 사용하는 것이 아닌 그때 그때 비어있는 메모리 주소로 사용되기 때문에 , 고정 적인 공간을 사용할 수 없다.

이를 해결하기 위해서는 전에 메모리 보호에 대해서 알아봤을때 , cpu가 수행 중인 프로세스의 주소는 Base register과 Limit register 범위를 넘어서는 순간 인터럽트가 발생되어 해당 프로세스를 강제로 종료한다고 했었고 , 이것은 MMU안에 있다고 하였다.

이 MMU가 프로세스가 다른 메모리 주소를 이용하게 되었을 때 cpu가 잘못된 주소를 참조하는 것을 방지해 준다.

MMU내부에 Relocation register라는 것을 별도로 두어 관리해주기 때문이다.

이것의 역할을 말하자면 ,

cpu는 주소를 고정적으로 참조한다.

즉 , 맨 처음 메모리에 올라왔을 때의 주소가 100~200이라고 가정해보자 .

그럼 base와 limit register에는 각기 100과 200이 설정되어 해당 프로세스가 수행되는 동안 cpu에서 벗어나는 범위를 참조하지 못하게 한다.

이 과정에서 오랫동안 사용하지 않을 경우 swapping이라는 과정을 거쳐 잠시 다른 디스크 공간에 프로세스를 내려두었다가 사용할 때 다시 메모리에 올려 사용할 수 있는데 ,

이때 사용했었던 메모리 공간을 해당 프로세스가 내려가 있는 동안 다른 프로세스가 사용할 경우 ,

같은 메모리 공간에 올려 사용할 수 없다.

그래서 500~600번지를 이용해야 하는 경우라 가정해보자.

그때 CPU는 그때 100~200으로 주소를 참조하겠다고 보내지만 , MMU는 Relocation register 을 이용하여 중간에서 100을 참조하면 500으로 바꿔준다.

그 과정에서 MMU가 분기점이 되어 주소가 불리는 명칭이 다른데

CPU에서 사용하는 주소는 논리 주소(logical address) 라고 하고, 메모리가 사용하는 주소는 물리 주소(physical address) 라고 한다.

메모리 낭비 방지

1)Dynamic loading(동적 적재)

프로그램 실행에 반드시 필요한 루틴/데이터만 적재한다.

모든 루틴 및 데이터가 사용되는 것은 아닌데 전부 메모리에 올리면 낭비가 될 수 있다.

(예시 : Java로 치자면 모든 class가 다 사용되는 것이 아닌 것처럼 말이다)

2)Dynamic Linking(동적 연결)

여러 프로그램에서 공통으로 사용되는 라이브러리는 하나만 올리는 것이다.

그리고 이를 사용하는 프로그램들은 이 하나만 올려진 라이브러리에 접근하여 사용하는 것이다.

3)Swapping

잠시 위에서 오랫동안 사용 안하는 프로세스를 잠시 내려둔다고 표현하였는데 그 예시가 바로 이 방법이다.

다시 설명하자면 , 메모리에 적재는 되어 있으나 현재 사용되지 않고 있는 프로세스들을 프로세스 이미지 형태로 만든 뒤에 잠시 디스크에 내려두는 것을 의미한다.

이때 내려두기 위한 장소로 하드디스크의 일부분을 backing store로 만들어 사용한다.

*메모리에서 Backing store로 가는 것을 swap-out , 다시 Backing store에서 메모리로 가는 것을 swap-in 이라고 한다.

왜??? 하드디스크까지 가서 일부를 따로 만들어서 사용할까??

위에서 언급한 프로세스 이미지는 프로그램이 실행되면 여러 연산을 수행하게 되면서 내부의 데이터들이 변경되는데 , 그 변화된 프로세스의 현재 상태를 프로세스 이미지 라고 부른다고 한다.

이때 하드디스크에 존재하는 프로그램과는 전혀 다른 데이터들이므로 같은 공간에서 따로 저장하기 위한 공간이 필요하기에 일부분을 backing store로 사용하는 것이다.

Backing store의 크기는 대략 메인 메모리 크기 정도로 예상할 수 있다고 한다. 메모리의 모든 프로세스가 쫓겨난다고 해도 메인 메모리 크기를 넘지 않기 때문이다. 메인 메모리 크기가 크지 않은 PC나 스마트폰은 하드디스크의 일부를 backing store로 사용하지만, 메모리 크기가 크다면 따로 하드디스크 자체를 backing store로 사용하는 경우도 있다.

이 과정에서 Swap-out된 프로세스는 다시 swap-in을 할 때, 이전의 메모리 주소 공간이 아닌 새로운 주소 공간으로 갈 수도 있다.

현재는 프로세스의 크기가 커지고, 하드디스크는 메인 메모리보다 속도면에서 매우 느리므로 swapping 동작의 오버 헤드는 크다고 볼 수 있다. 하지만 이로 인해 얻는 이득이 더 많으므로 대부분 운영체제는 이를 사용하고 있고, 속도가 중요한 서버 컴퓨터나 슈퍼 컴퓨터는 backing store를 하드디스크가 아닌 좀 더 빠른 저장 장치를 사용하기도 한다

연속 메모리 할당

메인 메모리 중에서 실제로 프로그램이 할당된 부분들을 제외한 빈공간들이 있을 것이다 .

이 공간을 hole 라고 한다.

처음에 부팅 직후에는 당장 os밖에 메모리에 없기 때문에 공간이 많이 있을테고 그 곳에 순서대로 쌓이게 될 것이다.

문제는 프로세스들이 생성되고 종료를 반복하고 , 또한 swapping 과정으로 인해 여러 프로세스들이 내려갔다가 올라왔다를 반복하는 과정 중에 빈 공간이 생길 것이다.

예시를 들자면 , p1이 사용하던 공간이 0~200이었다고 가정해 보자. 그리고 그 뒤로 이어서 필요한 프로세스들이 찰 것이다. 이때 p1의 수행이 완료되어 0~200의 공간이 반환되었는데 p2라는 150만큼의 공간이 필요한 프로세스가 해당 공간에 적재되었다고 가정해보자.

그럼 남게 되는 메모리 주소는 50인데 , 이 공간에 들어오기에는 너무 작아 다른 프로세스들이 사용하지 못하게 되고 낭비하게 될 것이다.

이 상태를 메모리 단편화 라고 한다. (== Memory Fragmentation)

그 중에서도 위와 같은 경우를 외부 단편화 라고 한다.

연속 메모리 할당 방식

1)First - fit(최초 적합)

  • 메모리를 순차적으로 찾다가 들어갈 수 있는 메모리 공간 중에 제일 먼저 발견되는 곳에 할당하는 방식

2)Best-fit(최적 적합)

  • 프로세스의 크기와 가장 유사한 hole에 할당되는 것.

3)Worst-fit(최악 적합)

  • 프로세스의 크기와 hole의 크기가 가장 차이가 많이 나는 hole에 할당.

속도 면에서는 first-fit이 가장 빠르나 , 메모리 이용률은 Best-fit 와First-fit가 비슷하다.

그러나 best로 하더라도 외부단편화를 없앨수는 없었다. 보통 외부단편화로 인한 메모리 낭비는

3분의 1수준이다.

profile
성실하게

0개의 댓글