공부해요/운영체제

메모리 관리

yenas0 2024. 11. 10. 14:57
반응형

지역성의 원칙(principle of Locality)

프로그램은 어떤 특정 시간에는 주소 공간 내의 비교적 작은 부분만을 접근

시간적 지역성(Temporal Locality)

한번 참조된 항목은 곧바로 다시 참조되는 경향

공간적 지역성(Spatial Locality)

어떤 항목이 참조되면 그 근처에 있는 다른 항목들이 곧바로 참조될 가능성 높음

 

컴구 복습 내용은 패스.. 

 

 

메모리 관리

 

메모리의 역할

메모리는 실행하고자 하는 프로그램 코드와 데이터에 적재

CPU는 메모리에 적재된 코드와 데이터를 처리

실행시키려면 반드시 하드디스크에 있는거를 메모리로 가져와야한다.

 

운영체제에 의해 메모리 관리가 필요한 이유

메모리는 공유 자원이기때문에 여러 프로세스 사이에 메모리 공유하고 각 프로세스에게 물리 메모리 할당아니까

메모리는 보호되어야한다. 프로세스의 독립된 메모리 공간 보장, 사용자 코드로부터 커널 공간을 보호해야됨

메모리의 용량 한계 극복할 필요함. 설치된 물리메모리보다 큰 프로세스 지원이 필요한 경우나 여러 프로세스 메모리 합이 설치된 물리 메모리보다 큰 경우 필요함

메모리의 효율성 증대를 위해 필요하다. 가능하면 많은 개수의 프로세스를 실행시키기 위해 프로세스당 최소한의 메모리 할당을 위해,.

 

mov ax [4] 읽는 과정에서 4번지 찾아야됨 그럼 MMU가 물리주소를 알려줌. 그럼 물리 메모리에서 실제 주소를 찾아서 값을 읽어서 ax에 저장한다.

 

C프로그램에서도 역시 상대주소임

 

ASLR(Address Space Layout Randomization)

항상 똑같은 위치다? 거기에 비밀번호를 저장한다고 가정하면 디버거로 따라가다보면 몇번지인지 알수가 있음. 그러면 비밀번호 입력 점프하도록 할수도 있음 그래서 힙영역이랑 조금씩 바꾸도록 해야됨

주고 공간 램덤 배치

프로세스의 주소 공간 내에서 스택이나 힙, 라이브러리 영역의 랜덤 배치

실행할 때마다 논리주소가 바뀜. 실행때마다 함수의 지역 변수와 동적 할당 받는 메모리의 논리 주소 바뀜

코드나 전역 변수가 적재되는 데이터 영역의 논리 주소는 안바뀜.

 

 

 

메모리 할당

운영체제가 새 프로세스를 실행시키거나 실행 중인 프로세스가 메모리를 필요로 할 때, 물리 메모리 할당

프로세스의 실행은 할당된 물리 메모리에서 이루어짐. 프로세스의 코드, 변수, 스택, 동적 할당 공간 접근 등

 

프로세스를 물리 메모리 어디에 넣어야될까.. 고민하는거임

 

 

연속 메모리 할당

프로그램이 들어있을 때 용량은 정해져있음. 정해진 크기만큼 메모리에 잡고 그 다음 프로그램 크기만큼 또 잡고.. 이렇게 하는게 메모리에 연속적으로 할당한다해서 연속 메모리 할당

 

연속 메모리 할당 - 고정 크기

메모리를 고정 크기의 파티션으로 나누고 각 프로세스를 하나의 파티션에 배치하는 방식

단점: 남아있는거..그리고 만약에 4기가짜리 프로그램인데 1기가짜리 파티션 설치하면 4기가 비어있어도 실행이 안됨.

 

연속 메모리 할당 - 가변 크기

각 프로세스에게 자신의 크기만한 파티션 동적 할당

 

 

분할 메모리 할당

떨어져 있어도 변환하니까 ㄱㅊ음 MMU가 변환.. 그니까 분할하자

 

분할 할당 - 세그먼테이션

프로세스를 가변 크기의 세그먼트들로 분할 할당

 

분할 할당 - 페이징(paging)

프로세스를 고정 크기의 페이지들로 분할 할당

 

연속 메모리 할당은 프로세스별로 연속된 한 덩어리의 메모리 할당

고정 크기 할당은 메모리를 고정 크기의 파티션으로 나누고 프로세스 당 하나의 파티션 할당, 파티션의 크기는 모두 같거나 다를 수 있음, 메모리가 파티션들로 미리 나누어져 있어 고정 크기 할당이라한다.

가변 크ㅡ기 할당은 메모리를 가변 크기의 파티션으로 나누고 프로세스당 하나의 파티션을 할당한다.

 

분할 메모리 할당은 프로세스에게 여러 덩어리ㅣ의 메모리를 할당하는 방식

고정 크기 할당은고정 크기의 덩어리 메모리를 여러 개 분산 할당 하는 방식으로 페이징 기법이라함.

가변 크기 할당은 가변 크기의 덩어리 메모리를 여러 개 분산 할당 하는 방식으로 세그먼테이션 기법이라함 

 

 

 

연속 메모리 할당; 구현

하드웨어랑 OS 같이 해야됨

하드웨어 CPU의 레지스터, MMU(주소 변환 하드웨어)필요함

운영체제에서는 프로세스별로 할당된 물리메모리의 시작 주소와 크기 정보 저장 과리. 비어있는 메모리 영역 관리를 함. 프로세스 스케줄링해서 실행때마다 물리 메모리의 시작 주소 크기 정보를 base 레지스터랑 limit 레지스터에 적재한다.

 

 

연속 메모리 할당 : 가변 크기 할당의 예

처음에는 작업 123이 할당됐다가 2가 종료되면서 빈공 간이 생기면 4가 배치됨. 1끝나면 5배치됨. 작업 종료될 때마다 빈공간 생기고 그 빈공간에 할당되는 방식..

 

동적 메모리 할당/ 홀선택 알고리즘

- 최초적합

처음에 들어갈 수 있는데에 할당함

할당속도 빠르고 오버헤드 적음

근데 단편화 발생가능성이 크고 비효율적으로 메모리 사용함

 

- 최적 적합

가장 크기 비슷한데에다가 넣음

메모리 사용 효율성이 굳 그리고 단편화 줄일 수 있음

근데 탐색하는데 시간도 많이 쓰고 단편화 생기면 조각이 너무너무 작음

 

- 최악 적합

그냥 남은데 중에 젤 큰데에다가 넣어버림

큰 공간을 보존할 수 있고 큰 블록 위지 되니까 작으 ㄴ크기의 요청이 메모리를 자주 쪼개는걸 방지할 수 있음.

근데 탐색 시간은 길고 작은 공간을 넘 큰데에다가 넣으면 큰애들 처리할때 비효율적이게 됨.

 

 

 

단편화

프로세스에게 할당할 수 없는 조각 메모리들이 생기는 형상

 

내부단편화(internal fragmntation)

할당된 메모리 내부에 사용할 수 없는 홀이 생기는 현상, 파티션보다 작은 프로세스를 할당하는 경우 파티션 내에 홀 발생

외부단편화(external fragmentation)

할당된 메모리들 사이에 사용할 수 없는 홀이 생기는 현상

가변 크기의 파티션이 생기고 반환되는 여러 번의 과정에서 여러 개의 작은 홀 생성

홀이 프로세스의 크기보다 작으면 할당할 수 없음

 

메모리 압축(compaction)

그 남는 공간 없애는거

문제점: 압축하는 동안 시스템은 모든일을 중지해야됨. 이때 대화형 사용자는 응답시간이 일정하지 않아서 실시간 시스템은 문제 발생할 수 있음. 메모리에 있는 작업들을 이동해야되니가 프로그램적재할 때 제거되는 대치 관련 정보를 액세스 간으한 형태로 보관해야된다.. 압축 작업을 자주 요구하니까 시스템 자원 소모가 크다.. 

 

세그먼테이션(segmentation)

세그먼트(segment): 프로그램 구성하는 논리적 단위, 세그먼트마다 크기는 다름. 코드, 데이터,스택, 힙 세그먼트가 있음

세그먼트 기법

프로세스를 논리 세그먼트들로 나누고 각 논리 세그먼트를 물리 메모리에 할당하는 메모리 관리 기법

프로세스의 주소 공간

프로세스의 주소 공간으 ㄴ여러 논리 세그먼트로구성되어 있음

각 논리 세그먼트는 물리 세그먼트에 매핑된다. 프로세스를 논리 세그먼트로 나누는 과정은 컴파일러랑 링커로 한다.

논리 세그먼트와 물리 세그먼트의 매핑은 세그머트 테이블에서 함.

근데 외부 단편화 발생할 수 있음..

 

세그먼테이션의 구현

하드웨어, OS, 컴파일러, 링커, 로더가 같이..

하드웨어: 논리 주소 구성, CPU(세그먼트 테이블의 시작 주소 가리키는 레지스터 줌), MMU 장치(논리주소가 세그먼트 범위 맞는지 보고 논리 주소의 물리 주소 변환을 함), 세그먼트 테이블(메모리에 저장함. 세그먼트 벼롤 시작 물리주소랑 세그먼트 크기 정보있음)

운영체제: 세그먼트의 동적 할당/반환 및 세그먼트 테이블 관리 기능 구현

컴파일러, 링커, 로더: 사용자 프로그램을 세그먼트 기반으로 컴파일, 링킹, 로딩함

 

 

 

페이징

 

Address Translation(address Mapping)

하나의 블록(page)가 4kb = 4096byte 이거의 특정 바이트를 가르키려면 12비트가 필요함 그래서 page offset은 12비트 page size는 2^12B=4kb

 

page tables: 가상 메모리를 물리메모리로..

Page table은 Page table entries 배열: 가상 페이지 번호에서 물리 페이지 번호로 변환, 프로세스별로 메모리에 저장되는 커널 데이터 구조이다

Placement information 저장: PTE 배열은 가상 페이지 번호에 의해 인덱스가 지정되고 CPU의 page register에 physical memory의 page table 위치에 저장됨

page가 메모리에 있으면 1이고 없으면 0이다.. 없으면 page fault발생함

 

페이지와 프레임

프로세스의 주소공간을 0번지부터 동일한크기의 페이지로 나눈다.

물리 메모리 역시 0번지 부터 페이지 크기로 나누고 이걸 프레임이라 부름

페이지와 프레임에 번호 붙임

페이지 크기는 주로 4kb

 

페이징 기법

프ㅡ로세스의 주소 공간과 물리 메모리를 페이지 단위로 분할하고 프로세스의 각 페이지를 물리 메모리의 프레임에 분산할당해 관리하는 기법

프로세스의 주소 공간은 0에서 시작하여 연속적인 주소 공간이다.  

논리 주소의 물리 주소 변환은 MMU에 의해 됨

물리 메모리의 빈 프레임 리스트는 관리가 필요함

페이징하면 내부 단편화 생길수 있다..

 

 

페이지와 페이지 테이블

프로세스가 시스템 호출할 때

커널 공간 페이지 k에담긴 커널 코드를 실행함

커널코드도 논리주소로 되어있음 그래서 실행 시 현재 프로세스의 페이지 테이블 써서 물리 주소로 바꿈

 

 

페이징의 논리 주소

논리 주소ㅗ 구성은 페이지 번호랑 옵셋으로 함. 페이지 크기 4KB면 각 바이트 주소는 12비트, 옵셋 크기도 12비트

32비트 논리 주소 체계에서 상위 20비트는 페이지 번호, 하위 12비트는 옵셋

 

페이징 구현

하드웨어랑 OS 같이..

하드웨어: CPU(레지스터 줘..), MMU(변환.. CPU 패키지에 내장됨..)

OS: 물리 프레임의 동적할당/반환, 페이지 테이블 관리 기능 구현, 프로세스 실행 시 페이지 테이블의 물리 메모리 주소를 CPU의 PTBR에 적재함.

 

TLB를 이용한 문제 해결

논리주소를 물리 주소로 바꾸는 과정에서 페이지 테이블 읽는데 걸리는 시간 아깝자나.. 이거 절약을 위해 TLB 사용

주소변환 캐시라고 불림. 최근에 접근한 페이지번호, 프레임 번호의 쌍을 항목으로 저장하는캐시 메모리임

MMU에 존재하고 페이지 번호랑 프레임 번호를 항목에 저장. 페이지 번호로 전체 캐시를 동시에 고속으로 검색해서 프레임번호 출력함. 근데 비싸.. 그리고 크기도 작음

 

TLB를 활용한 메모리 액세스 과정

CPU로부터 논리 주소 발생

논리 주소의 페이지 번호가 TLB로 전달

페이지 번호화 TLB내 모든 항목 동시에 비교함 있으면 hit. 없으면 miss..

 

TLB를 고려한 컨텍스트 스위칭 과정

동일한 프로세스 내에서 다른 스레드로 스위칭 되는 경우는 TLB 항목 교체 ㅍ필요없고 다른 프로세스의 스레드로 스위칭되면 CPU의 모든 레지스터를 TCB에 저장하고 새 프로세스를 PCB에 저장된 페이지 테이블 주소를 CPU의 PAge Tabel Base REgister에 적재함. TLB 항목 다 지우고 새로 스케줄된 스레드의 TCB에서의 레지스터 값을 CPU에 적재함.

 

Fast translation Using a TLB

주소 변환은 추가 메모리 참조가 필요함 페이지 테이블은 지역성이 존재함. -> Translation Look-aside Buffer로 가속함. PTE 일부를 CPU 내의 특별한 캐시로 관리..

 

페이지화된 세그먼테이션

페이징이랑 세그먼테이션 장단점 합친거

페이징은 내부 단편화 될 수 있지만 메모리 효율적 사용, 작업 크기 동일해 다양한 알고리즘 개발

세그먼테이션은 외부 단편화 있지만 가변적인 데이터 구조와 모듈 처리, 공유와 보호 지원이 편리하다.

외부 단편화 문제 제거하면서 할당 과정을 쉽게 해결하는게 페이지화된 세그먼테이션

반응형