티스토리 뷰

학교/운영체제

[12] 운영체제 - Memory-1

군옥수수수 2017. 9. 22. 14:56

안녕하세요. 오늘은 운영체제에서 중요한 역할인 메모리 관리에 대해 알아보도록 하겠습니다.
메모리 관리 부분에서는 숫자가 많이 등장하여 굉장히 힘들었지만 최대한 쉽게 설명해보도록 하겠습니다.
메모리 굉장히 중요한 이슈이므로 제 포스팅뿐만 아니라 여러 서적들을 찾아보며 공부하시는 것을 추천합니다.
그럼 바로 시작해보도록 하겠습니다.
메모리 관리에 대해 들어가기 전 반드시 알아야 할 것이 있습니다. 

첫 번째는 운영체제는 각 프로세스들이 메모리에 올라왔을 때  다른 프로세스의 메모리 공간을 접근하는 것을 막아야 합니다.
이것이 운영체제의 메모리 관리에 있어서 굉장히 중요한 역할인데요.
이를 위해서는 메모리에서 프로세스의 시작 위치를 저장하는 Base register와 프로세스에게 할당된 메모리의 크기인 Limit Register 값을 이용해 프로세스들의 메모리 공간의 경계를 나눕니다.
Base Register <= 프로세스가 접근할 수 있는 공간 <= Base Register + Limit Register의 범위를 갖게 됩니다.  


두 번째는 주소 바인딩 시점입니다.
주소 바인딩이란 프로세스가 접근해야 하는 값과 함수 대한 주소가 정해지는 것을 말하는데요.
여러분이 작성한 프로그램에서 변수나 함수 등은 각자의 실제 메모리 주소를 통해 접근되고,
프로그램은 컴파일 되어 메모리에 올라간 후 CPU에 의해 명령어가 한 문장씩 실행되게 되는데요.
이때 CPU가 명령문을 실행함으로써 발생하는 메모리 주소를 Logical Address 혹은 Virtual Address라고 합니다.
그리고 실제 접근해야 하는 메모리 주소를 Physical Address라고 하는데 Logical Address와 Physical Address는 서로 다를 수 있습니다.
각각의 경우를 주소 바인딩이 되는 시점에 따라 설명해보고 다를 경우에는 어떻게 해결을 해야 할지 알려드리겠습니다. 


각각의 주소 바인딩 시점에 대해 설명해보도록 하겠습니다.

1. 컴파일 시점 주소 바인딩

컴파일 시점 주소 바인딩은 말 그대로 프로그램이 컴파일 될 때 컴파일러에서 명령어들과 변수의 메모리 주소가 정해지는 것을 말합니다.

여기서 정해지는 주소는 실제 메모리 주소이기 때문에 CPU에서 명령어를 실행할 때 이미 주소가 정해져있으므로 따로 주소 계산을 하지 않고 바로 접근해야 하는 주소가 되므로 컴파일 시점 바인딩에서는 Logical Address와 Physical Address는 같게 됩니다.

컴파일 시점에 주소가 결정이 나면 프로그램을 다른 시스템에서 실행하였을 때 해당 시스템의 메모리를 어디서부터 할당해주는지를 나타내는 Starting Point가 다르거나 이미 그 주소에 다른 프로그램이 실행 중이라면 이 프로그램은 실행을 할 수 없게 됩니다.

2. 로드 시점 주소 바인딩
로드 시점 주소 바인딩은 프로그램이 컴파일 되고 메모리에 올라갈 때 CPU에서 주소 계산이 일어난 후 발생하는 주소를 말합니다.

여기서 컴파일 된 프로그램 내의 각 변수나 명령어의 주소는 특정 값을 기준으로 정해집니다. 그리고 메모리에 올라가 CPU에서 주소를 계산할 때 프로그램이 올라간 메모리 주소의 Base Register 값에 이를 더하여 주소를 만들어냅니다. 이렇게 CPU 내에서 계산되고 발생한 Logical 주소는 해당 메모리의 실제 주소인 Physical Address와 같게 됩니다. 

예를 들어 프로그램이 컴파일 될 때 명령어 기준을 0으로 잡았다면 각각의 변수나 함수들의 주소는 0을 기준으로 얼마나 떨어져 있는지를 통해 결정이 됩니다. int a 의 상대적인 위치가 10이고 void function()의 상대적인 위치가 20이라 가정하고 메모리의 주소 10000에 프로그램이 올라간다면 CPU는 int a의 주소를 10000 + 10을 하여 10010을 만들어내고 void function()의 주소는 10000 + 20을 하여  10020을 만들어 냅니다.
이렇게 로드 시점 주소 바인딩으로 주소가 정해진 프로그램은 한번 메모리에 올라가면 종료될 때까지 그 위치에 존재하게 됩니다.

3. 실행 시점 주소 바인딩

실행 시점 주소 바인딩은 메모리에 올라가 매번 명령어가 실행될 때마다 주소가 계산되는 것을 말합니다. 이러한 바인딩 방법을 사용하는 프로그램은 프로그램의 메모리 위치가 매번 바뀌기 때문에 이러한 방법을 사용하는데요. 프로세스는 여러 이유로 인해 메모리 공간 안에서 위치가 바뀔 수 있게 됩니다. 그렇게 되면 시작 위치는 계속 바뀌게 되고 프로세스 내의 주소들도 바뀌게 되는데 위의 두 가지 방법으로는 매번 바뀌는 메모리 주소에 접근을 할 수 없게 됩니다. 그리하여 CPU에서 나온 임의의 주소는 MMU라는 곳을 거쳐 실제 주소로 바뀌어 접근하게 됩니다. CPU에서 발생한 주소가 Logical Address이고 MMU를 통해 바뀐 주소가 메모리의 실제 주소인 Physical Address이므로 실행 시점 주소 바인딩에서는 두 주소가 다릅니다.
이렇게 주소 바인딩 시점에 대해 알아보았습니다.
프로그램은 메모리에 올리는 로드 과정과 라이브러리 파일과 연결해주는 링킹 과정을 통해 최종적으로 메모리에 올라가게 되는데요. 올라가서도 지속적으로 메모리 공간을 차지하는 것이 아니라 운영체제의 필요에 의해 Swap-in 되거나 Swap-out 되기도 합니다. 이러한 과정들이 어떤 작업이며 또한 어떻게 변화해 왔는지 알아보도록 하겠습니다.

1). Dynamic Loading

Dynamic Loading은 한정적인 메모리 공간으로 인해 생겨난 방법입니다. 메모리 공간이 한정되어있고 그 공간의 크기가 그렇게 크지 않았을 때 프로세스의 모든 모듈들을 올리기에는 공간이 부족하여 해당 모듈이 필요하면 그때그때 올려주는 방법이 Dynamic Loading입니다. 이 방법을 사용하게 되면 이용되지 않는 모듈은 메모리 공간에 올라가지 않기 때문에 그만큼의 메모리 공간을 절약할 수 있게 됩니다.

히지만 현재는 가상 메모리 기법을 사용하여 메모리 공간이 충분히 많다고 가정을 하고 로드를 하기 때문에 이 방법은 사용되지 않고 있습니다.

2). Dynamic Linking

기존 링크 과정은 라이브러리 파일을 서로 다른 프로그램이 사용할 때 매번 프로세스 메모리 공간에 해당 라이브러리를 확보하여 프로세스에 함께 올렸습니다. 하지만 이는 같은 라이브러리 파일이 메모리 공간에 여러 번 올라감으로 메모리 공간의 낭비로 이어지게 됩니다.

그리하여 나온 방법이 Dynamic Linking인데 실행되기 전까지는 링킹이 되지 않고 실행이 될 때 특정 라이브러리 파일이 최초로 한 번 메모리에 올리고 이 라이브러리를 사용하는 프로세스들은 라이브러리의 위치를 가리키는 stub 포인트를 갖게 되어 라이브러리를 참조하게 됩니다. 그리하여 같은 라이브러리가 메모리에 여러 번 올라가는 것을 방지하여 메모리 낭비를 막습니다.

3). Swapping

Swapping은 우선순위가 높거나 중요한 프로세스가 메모리에 올라가려 할 때 공간이 부족하면 현재 메모리 위에 올라가 있는 프로세스 중 수많은 알고리즘 중 하나를 이용하여 어떤 프로세스를 잠시 디스크에 저장을 하고 우선순위가 높은 프로세스를 수행하게 되는데요. 

이 프로세스가 작업을 마치면 디스크에 있던 프로세스를 다시 메모리에 올리게 됩니다. 이렇게 우선순위가 높거나 중요한 프로세스가 중간에 들어가는 것을 Swap-in이라 하며 자리를 내어주어 디스크로 빠지게 되는 과정을 Swap-out이라고 합니다.

Swap-out 된 프로세스가 다시 메모리에 올라갈 때는 원래 있던 자리로 돌아가지 않을 수 있습니다. 여기서 수많은 알고리즘 중 상황에 맞는 알고리즘을 고르는 것과 디스크와 메모리 간의 속도 차로 인해 발생하는 이슈들이 존재합니다.
오늘은 메모리 관리를 위해 알아야 할 전반적인 배경지식들에 대해 알아보았습니다.
다음 포스팅에서는 본격적으로 메모리를 할당, 관리하는 방법에 대해 알아보도록 하겠습니다.
감사합니다!

'학교 > 운영체제' 카테고리의 다른 글

[14] 운영체제 - Memory-3  (3) 2017.09.22
[13] 운영체제 - Memory-2  (0) 2017.09.22
[11] 운영체제 - Deadlock-3  (0) 2017.09.22
[10] 운영체제 - Deadlock-2  (0) 2017.09.22
[09] 운영체제 - Deadlock-1  (0) 2017.09.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함