관리 메뉴

caLAB

[운영체제 6주차] 하루 30분 컴퓨터 과학 공부하기 본문

개발 공부/컴퓨터 과학

[운영체제 6주차] 하루 30분 컴퓨터 과학 공부하기

도이(doi) 2021. 9. 27. 23:01
728x90

주기억장치 관리(Main Memory Management) : 메모리

 

메모리의 역사는 1970년대부터 시작한다. 초기의 메모리는 64kb였다. 최근에는 수 GB의 메모리를 사용하는 것에 비교해보자면 메모리의 발전 역사는 눈부시다. 

하지만, 메모리는 오늘날 과거에 비해서 혁신적으로 증가했음에도 불구하고 여전히 부족 현상을 겪는다. 그 이유는 프로그램이 변화했기 때문이다. 과거 우리는 기계어나 어셈블리어로 일명 외계어로 프로그래밍을 작성하였다. 하지만, 오늘날에 와서는 고수준 언어를 사용하게 되면서 이에 따라서 프로그램의 크기도 증가하게 되었다. 그렇기 때문에 우리는 메모리를 어떻게 하면 효율적으로 사용할 수 있을지에 대해서 고민해야 된다.

 

우선, 메모리는 무엇일까? 메모리의 구조는 주소(address)와 데이터(data)로 이루어져 있다. 메모리는 CPU로부터 주소를 받아서 데이터를 기록하기도 하고 전달하기도 합니다.

메모리의 구조(address, data)

프로그램을 메모리에 올리는 것을 이해하기 위해서 우선, 프로그램이 어떻게 개발되는지에 대한 이해가 필요하다. 아래 이미지는 프로그램이 개발하는 과정에 대해서 설명한 모식도이다. 우선, 우리에게 익숙한 고수준 언어로 프로그램을 작성한다. 아래 그림에서는 C언어로 작성하였다. 이 언어를 Compile하여서 기계어로 변환해준다. 우리가 고수준 언어에서 사용하는 printf나 scanf같은 함수들은 사실 자동적으로 뿅 실행되는 것이 아니라 미리 누군가 기계어로 작성한 것을 우리는 쓰기 편한 형태로 쓰는 것이다. 이러한 함수들의 모임을 Library라고 부르고 이것들은 Hard Disk에 저장되어 있어 링크(link)를 통해서 코드와 결합하여 사용하게 된다. 이러한 일련의 과정이 진행되고 프로그램은 실행 파일을 빌드하게 된다. 이것이 우리가 프로그램을 개발하는 과정이다. 

프로그램 개발 모식도

그렇다면 프로그램을 메모리에 어떻게 올릴까? 프로그램은 MMU(memory management unit)를 거쳐서 메모리에 올라가게 된다. 예전에 MMU를 문지기라고 비유하여 표현하였었다. 이는 메모리 보호를 하는 역할로 사용자가 본인이 지정된 address에만 접근할 수 있도록 하는 역할을 한다고 공부했었다. (참고. 운영체제 2주차)

프로그램을 메모리에 올릴 때도 MMU를 사용하게 된다. 이는 재배치 레지스터(relocation register)로 사용되며, O/S가 실제 메모리에 어떤 주소를 받는지와 상고나없이 프로그램이 메모리에 올라가서 실행될 수 있도록, CPU에서 메모리의 주소를 추가해주는 역할을 한다. 예를들어서 메인 메모리 주소가 50부터 시작한다고 생각했을 때, CPU에서 주소 0을 메인 메모리에 올리려고 할 때, MMU는 자동으로 +50만큼 주소를 더해주어서 프로그램이 메인 메모리에 잘 올라갈 수 있도록 해준다. 


메모리 낭비 방지

 

동적 적재(Dynamic Loading)

프로그램을 실행할 때 반드시 모든 루틴(코드 / 데이터)이 필요한 것은 아니다. 예를들어서, 오류 처리에 관련된 코드는 오류가 났을 때만 사용하면 된다. '동적 적재'는 프로그램을 실행할 때 반디스 필요한 루틴이나 데이터를 메모리에 올리는 것을 말한다. 

 

동적 연결(Dynamic Linking)

여러 프로그램이 공통적으로 사용하는 라이브러리를 메모리에 중복적으로 올리는 것을 방지한다. 오직 하나의 라이브러리 루틴만 메모리에 적재시킨다. 다른 애플리케이션 실행 시 이 루틴과 연결 되도록 한다. 우리가 프로그램을 build하게 되면 .dll이라는 파일이 보이는데 이 파일이 바로 윈도우에서 사용하는 동적 연결 라이브러리(dynamic linking library) 파일이다. 

 

스와핑(Swapping)

메모리에 적재되어 있지만 현재 사용되지 않는 프로세스를 메모리의 활용도를 높이기 위해서 Backing Store(=Swap Device)로 몰아내는 것(swap-out)을 말한다. 다시 메모리에서 사용하게 될 때 이를 가져온다(swap-in).


연속 메모리 할당

 

프로세스가 생겼다가 사라지면 메모리가 사라진 자리에 홀(hole)이 생기게 된다. 결국, 메모리는 생겼다 사라졌다를 반복하면서 중간 중간 홀이 생긴다. 이를 '메모리 단편화'(memory fragmentation)이라고 한다. 홀들이 하나로 합쳐져 있고 따로따로 떨어져 있으면 홀들의 크기를 합했을 경우에는 들어갈 수 있는 파일이 홀이 떨어져 있어서 못 들어가는 현상이 발생한다. 이를 '외부 단편화'라고 한다. 

 

최초 적합(first-fit) : 처음 만나는 곳에 메모리를 넣는 것. 

최적 적합(best-fit) : 사이즈가 제일 비슷한 곳에 메모리를 넣는 것.

최악 적합(worst-fit) : 사이즈가 제일 안 맞는 곳에 메모리를 넣는 것.

 

컴팩션(Compaction) : 흩어져있는 메모리의 홀들을 한 곳으로 모으는 것. 

*컴팩션은 홀들을 옮기는데 부담이 크다. 

 

메모리를 효율적으로 사용하기 위해서 생각해낸 것 '페이징'(Paging)

프로세스를 잘라서 넣으면 홀들에 넣을 수 있다. 프로세스를 잘라도 실행 될 수 있도록 하기 위해서는 운영체제를 속여야 한다. 프로세스를 잘라서 홀에 넣으면 프로세스의 크기가 크더라도 서로 떨어진 홀들에 분할에서 넣어둘 수 있다. 

프로세스를 일정 크기로 자른 것을 페이지라고 한다. 메모리를 자르는 것은 프레임이라고 부른다. 

 

페이징 : 프로세스를 일정 크기로 잘라서 메모리에 올리는 것. 

 

페이지를 프레임에 할당해주어서 cpu가 보기에 프로세스가 연속되게 보이도록 한다. 페이징을 목적으로 사용하는 MMU는 페이지 테이블이라고 부른다. 

 

728x90
반응형
Comments