개발 공부
주기억장치 관리 (Main Memory Management) 본문
메모리 용량 증가 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 |