프로그램이 실행되기 위해서는 메모리가 필요하다.
실행 파일 자체가 메모리에 로드되어야 실행될 수 있음은 물론이고 프로그램이 작업을 위해 선언하는 변수들도 모두 메모리에 할당된다.
컴파일러는 이 두 변수들이 값을 제대로 보관할 수 있도록 변수의 타입에 맞는 크기만큼
메모리를 할당한다.
프로그램을 작성할 때 미리 메모리 필요량을 알려주는 할당을 정적 할당
(Static Allocation)이라고 한다.
동적 할당은 프로그램을 작성할 때 실행중에 필요한 만큼 메모리를 할당하는 기법이다.
⁉ 즉 미리 메모리 필요량을 알려주면 정적할당.
⁉ 실행중에 필요한만큼 메모리를 할당하는 기법은 동적할당.
+@ 메모리 관리 원칙
- 메모리 관리의 주체는 운영체제이다.
- 운영체제는 메모리가 있는 한은 할당 요청을 거절하지 않는다.
- 한 번 할당된 메모리 공간은 절대로 다른 목적을 위해 재할당되지 않는다.
- 응용 프로그램이 할당된 메모리를 해제하면 운영체제는 이 공간을 빈 영역으로
인식하고 다른 목적을 위해 사용할 수 있도록 한다.
필요할 때 컴퓨터의 주기억장치로 불러들일 수 있는 프로그램의 일부분을 말한다.
컴퓨터의 주기억장치(램) 보다 용량이 큰 프로그램은 주기억장치에 입력될 수 없다.
이것은 곧 프로그램의 수행이 불가능함을 의미한다.
그러나 '오버레이'기법을 이용하면 프로그램의 수행이 가능해진다.
오버레이 기법
◻ 용량이 큰 프로그램을 분할 가능한 몇 개의 부분으로 나눈 뒤, 각 부분의 실행이 필요할 때마다 필요한 부분만 주기억장치로 입력시켜 실행할 수 있게 하는 것이다.
◻ 이 때 분할된 각각의 부분을 '세그먼트' 또는 '모듈'이라고 하며 주 프로그램은 항상 주기억장치에 머물면서 필요한 세그먼트(모듈)를 오버레이 버퍼라는 일종의 기억장치에서 불러낸다.
◻ 램에 특정 프로그램이 상주되면 프로그램 용량 만큼의 주기억 용량을 사용할 수 없게 되므로 다른 프로그램의 사용에 큰 제약을 받게 된다.
◻ 따라서 오버레이 기법을 이용하여 램 상주에 필요한 주프로그램을 상주시키고
나머지 세그먼트를 필요에 따라 주기억장치로 호출함으로써 램 상주 프로그램을 수행할 수 있고 주 메모리의 용량이 줄어드는 것도 방지할 수 있다
부족한 메모리 공간을 좀 더 효율적으로 관리하려는 메모리 관리 기법.
CPU에서 시행되지 않는 프로세스 즉 READY상태이거나 waiting상태에 있는 프로세스들 중 일부를 메모리 안에 보관하지 않고 하드디스크 같은 저장장치에 보관한다는 뜻이다.
다시 메모리에 올려서 실행시키는 작업을 Swap-in이라고 하고, Swap-out, Swap-in 하는 과정을 스와핑(Swapping)이라고 한다.
사용자는 실제 메모리의 크기와 스왑 영역의 크기를 합쳐서 전체 메모리로 인식하고 사용한다.
프로세스를 메모리에 올릴 때 주소 공간을 메모리의 한 곳에 연속적으로 적재하는 방식이다. 연속 할당 방식에서는 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재되도록 한다.
물리적 메모리를 정해진 갯수만큼의 영구적인 분할로 나누어두고 각 분할에 하나의 프로세스를 적재하는 방식이다. 분할의 크기는 모두 동일할 수도 있고 서로 다를 수도 있다.
프로그램의 수가 고정되어 있으며, 수행가능한 프로그램의 최대 크기 또한 제한됨.
💨 가변분할 방식에 비해 융통성이 떨어진다.
🛑외부조각 문제 , 내부조각 문제
메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식이다.
프로세스에 딱 맞게 메모리 공간을 사용하기에 내부조각 문제는 발생하지 않는다. 그러나 사용중인 프로세스가 종료되어 메모리에 새로운 프로세스를 올릴 메모리 공간이 충분하지 않을 경우 외부 조각 문제가 발생한다.
최초적합: 가장 먼저 나오는 가용 가능한 메모리 공간에 프로세스를 올리는 방법이다.
최적적합: 가장 딱 맞는 메모리 공간을 찾아 프로세스를 올리는 방법이다.
최악적합: 가장 큰 메모리 공간에 프로세스를 올리는 방법이다.
+@ 외부조각 문제를 해결하기위한 방법
압축(compaction)
할당된 메모리 공간들을 한쪽으로 모아 연속된 공간을 확보하는 것을 말한다.
but 이러한 방법들은 실행 시간에 주소 바인딩이 일어나는 프로그램들만 가능하다.
그렇지 않다면 압축되었을 때 잘못된 메모리 공간의 주소를 접근할 수 있다.
페이징(Paging)
프로세스에게 메모리를 연속적으로 할당해주지 않는 방법이다.
프로세스의 Logical Memory를 조각으로 나누어 그에 대응하는 Physical Memory 공간 조각이 어디에 위치하는지 Page Table에 저장한다.
Logical Memory의 조각을 Page라 하고, Physical Memory의 조각을 Frame이라고 한다.
여기서 중요한 것은 Page의 크기와 Frame의 크기가 같다는 것이고 Page Table의 인덱스 수는 Page의 수와 같다.
Page table을 사용하기 위해서는 Page table 역시 메모리에 올라가있어야 하는데,
Page Table이 메모리에 올라가 있기 때문에 데이터나 명령문에 접근하기 위해서는 두 번의 메모리 Access가 일어나게 된다
접근을 위해 두번 ACCESS라니 상당히 비효율적이다. 이를 해결하기위한 방법으로
Translation Look-aside Buffers (TLB)가 있다.
+@ TLB
일종의 캐시의 역할을 하는 레지스터
메모리의 여러 번 Access를 막고자 Page table의 내용을 TLB에 저장하여 바로 메모 리에 접근을 할 수 있게 한다.
공통된 코드를 갖는 여러 프로세스들이 Page table을 가질때도 중복의 문제가 발생하는데 이럴 경우에는 공통된 Page table을 한 번만 메모리에 올리고 그것을 서로 다른 프로세스가 공유하면서 중복된 Page table을 공유하며 메모리 공간의 낭비를 막는다.
Buddy System은 Fixed, Dynamic Partitioning 기법의 fragmentation 발생 이슈를 보완하기 위한 방법이다.
사용하지 않는 모든 페이지 프레임을 그룹별로 묶어서 블록 리스트 10개에 넣는다.
1) 메인 메모리는 항상 2^N size로 할당한다.
2) 사용할 수 있는 가장 큰 메모리부터 시작해서 Binary로 절반씩 쪼개나가면서 아래 조건을 만족시키는 공간을 찾는다.
3) 만약 프로세스 메모리 크기가 K라고 하면, 2^(U-1) < K <= 2^U 를 만족시키는 U를 찾고, 2^U 만큼의 공간에 프로세스를 할당한다. 예를 들어, 프로세스 크기가 1000B이면, 512B < 1000B < 1024B이기 때문에 1024B 사이즈의 메모리에 할당하는 것이다.
4) 프로세스가 종료되고, 만약 같은 Parent를 갖는 Buddy 공간이 비어있다면 Merge한다.
버디 메모리 할당 동작방식
https://ko.wikipedia.org/wiki/%EB%B2%84%EB%94%94_%EB%A9%94%EB%AA%A8%EB%A6%AC_%ED%95%A0%EB%8B%B9
https://studyandwrite.tistory.com/18