Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 공부

주기억장치 관리 (Main Memory Management) 본문

대학교 공부/운영체제

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

방구석개발입문 2021. 6. 3. 23:18

메모리 용량 증가 vs 프로그램 크기 증가

1960~1970년대는 프로그램을 기계어로 작성했는데 C,C++,자바... 객체지형적인 언어가 개발되고 작성해서 메모리양이 엄청 커지게 되었습니다.

>>늘 언제나 부족한 메모리

 

 

 

메모리를 효과적으로 사용하기 위한 방법

1. 메모리 낭비 없애기

2. 가상 메모리 (virtual memory)

 

 

 

 

프로그램을 메모리에 올리기

메모리의 구조

주소(address) + 데이터(Data)

CPU가 메모리의 어디를 읽겠다고 Address를 메모리에 보냄 (메모리 입력은 주소)

메모리는 해당위치의 저장 데이터를 cpu에 보냄 (메모리 출력은 데이터)   >> 메모리 주소= 주소+데이터

 

프로그램 개발

소스파일 - (컴파일러, 어셈블러) >> 목적파일 - (링크) >> 실행파일  >>  (로더)   >>메모리에 적재됨

*링크는 하드디스크에 들어가 있는 다양한 내장함수(Library)들을 실행하기 위해 연결해주는 과정

 

- Source file (소스파일) : 고수준 언어 또는 어셈블리 언어

- Object file (목적파일) : 컴파일 또는 어셈블 결과 ..기계어로 나타남       //이 파일을 모아놓은 것이 library

- Executable file (실행파일) : 링크 결과   

    실행파일 = code + data + stack (메인 메모리에 올림>> loader)

 ex) a와 b중 큰것을 구하라라는 프로그램 작성시
        - a, b >> data
        - 큰것을 구하라 >> code(함수, 부등호 등)
        - 프로그램이 메인 메모리에 올라갈 때 주소 등이 필요 >> stack
           (함수호출시 돌아오는 주소, 지역변수 저장등을 위해 stack이 필요함)

프로그램 실행 : code + data + stack


위의 과정을 통해 실행파일이 만들어지면 로더에 의해 메모리에 올라감

운영체제는 이 실행파일을 메모리의 어느 부분에 올릴지를 결정한다.

고수준 언어에서는 주소라는 개념이 없지만

어셈블리어는 주소의 개념이 있다. 이 주소의 값을 통해 코드를 이동하고 작동을 하게 됨

>>따라서 메모리를 적재할 때 적절한 메모리 위치에 프로그램을 넣지 않으면 문제가 발생할 수 있음

>>>>>이 문제를 해결하는 것이 MMU(재배치 레지스터존재.. [주소의 영여을 정해주는 역할])이다.

ex)
코드에서 0번지에 들어가야하는 프로그램이 작성되어 있음
그런데 메모리에서 빈 공간이 주소가 5000번지
(다중프로그래밍시스템에서는 매일 프로그램이 도는 곳이 다름 코드는 변하지 않음)

>>> CPU는 0번지로 배치하나 실제로는 MMU의 재배치 레지스터가 메모리 상태에 따라서 0+5000번지로 할당해 배치함

이뿐 아니라 실행파일이 실행하다가 다른영역을 침범하려고 해도 MMU가 일을 하여 메모리를 보호한다.
프로그램이 설계한 번지와 다르게 놓이더라도 메모리내 어디에나 배치되도 돌 수 있도록 하는역할을 하는 것이 MMU 
-CPU가 보는 주소 : Logical Address, 메인 메모리가 보는 주소 Phygical Address

 

 

 

 

 

메모리 낭비 방지

●동적 적재

: 프로그램 실행에 반드시 필요한 루틴/데이터만 적재(프로그램을 메인 메모리에 올리는 동작)

- 모든 루틴이 다 사용되는 것은 아님 (예. 오류처리)

- 모든 데이터가 다 사용되는 것은 아님 (예..배열)

- 자바 : 모든 클래스가 다 사용되는 것은 아님

- 실행 시 필요하면 그 때 해당 부분을 메모리에 올림

●동적 연결

: 여러 프로그램에 공통 사용되는 라이브러리

- 공통 라이브러리 루틴을 메모리에 중복으로 올리는 것은 낭비

- 라이브러리 루틴 연결을 실핼 시까지 미룬다.

- 오직 하나의 라이브러리 루틴만 메모리에 적재됨

- 다른 애플리케이션 실행시 이 루틴과 연결(link)

- 공유 라이브러리-Linux, 동적 연결 라이브러리-Windows

●Swapping

: 메모리에 적재되어 있으나 현재 사용되지 않고 있는 프로세스 이미지

- 메모리 활용도 높이기 위해 Backing store(=swap device)[==하드디스크의 일부분임]로 몰아내기

- 위의 과정을 swap-out이라 하고 반대로 필요부분이 생기면 메모리에 적재하는 것을 swap-in이라 함

- MMU의 재배치 레지스터를 사용하므로 적재위치는 메모리 빈공간 어디에도 적재 가능

- But! 프로세스의 크기가 크면 backing store입출력에 따른 부담이 크게 됩니다.

 

 

 

 

 

 

연속 메모리 할당

부팅직후에는 운영체제만 적재되어 있어 운영체제 제외한 공간이 모두 비어 있음

>> big single hole이 생성

 

이후 프로세스가 생성되고 종료되는 작업이 반복 이 때 프로세스들은 여러 위치의 메모리에 적재

>> scattered hole이 생성

(프로세스가 순서대로 쌓여도 작업이 끝나는 순서 정해지지않음>> 메모리 빈 공간이 중간에 계속 생성 )

● 메모리 단편화

scattered hole이 계속 발생하면 hole들이 불연속하게 흩어져 있어 

메모리의 빈 공간은 많은데 사이즈가 작은 빈 공간이 많아 다른 프로세스를 적재할 수 없는 외부단편화 현상이 발생

(hole들의 크기를 모두 합치면 프로세스를 충분히 적재 가능하지만 떨어져있어 프로세스가 못들어가는 현상)

 

이러한 외부 단편화를 최소화하기 위한 방법....

>>연속 메모리 할당방식

● 연속메모리 할당

1. First-fit (최초 적합)

: 메모리를 순차적으로 찾아 크기가 적합한 제일 먼저 발견되는 위치에 넣는 방식

 

2. Best-fit (최적 적합)

: 메모리에 올린 프로그램과 사이즈가 제일 밀접한, 가까운 공간에 넣는 방식

 

3. Worst-fit (최악 적합)

: Best-fit의 반대개념으로 사이즈의 크기가 제일 최악, 배치하고 남은 사이즈가 너무 많은 방식

 

성능비교

-속도 : first-fit

-이용률 : first-fit, best-fit >> 많은 실험으로 둘 다 비슷

 

BUT,, 이래도 외부단편화로 인한 메모리 낭비 : 1/3 수준

>>해결방법 : Compaction : 최적 알고리즘 없음, 고부담

 

Compaction

- OS가 hole들을 한 곳으로 모아 사용율을 높임

- 그런데 잔여 메모리를 모으려면 계산 등 부담이 있음

>>다른 방법 : 페이징메모리를 효율적으로 사용하는 방법

 

페이징은 다음장부터..

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

가상 메모리  (0) 2021.06.08
세그멘테이션 (Segmentation)  (0) 2021.06.04
페이징 Paging  (0) 2021.06.04