본문 바로가기

OS

메모리 관리 1 (전공 내용 정리)

Base / Limit Registers

Base Register는 메모리(RAM)에 프로그램이 할당 될 때 프로그램의 시작 register 주소이며, Limit register는 현 프로그램이 사용할 수 있는 register의 마지막 주소이다. 만약 프로그램이 이 register 범위를 넘어 가는 주소를 사용하게 될 경우, OS에 의해서 trap이 발생하고, 프로그램이 강제 종료 된다.

각 프로그램의 Base / Limit Register는 각 프로그램의 고유값이며, 이는 PCB(Process Control Block)에 저장 된다.

따라서 각 CPU당 Base / Limit register는 한 개씩 존재(각 CPU가 제공하는 서비스는 한번에 하나 씩만 가능하기 때문 & 레지스터 용량을 늘리면 비싸기 때문)하며, 이 register는 공유 된다.

프로그램이 실행 될 때, CPU가 switch contexts를 거치게 될때, 이 register를 바꿔가면서 실행 한다.

Address Binding (메모리 할당 과정)

Addresslogical memory addressphysical memory address가 있다.

logical memory address (가상 메모리)

일반적인 user가 사용하는 address이며, binary file을 생성할 때 부여되는 memory address이다. 만약 프로그램이 1MB라면 , 이 프로그램이 가질수 있는 logical memory address는 0x00000 ~ 0xfffff (2^20 = 1M)이다.

physical memory address

logical memory address에서 실제 물리적인 메모리에 접근하기 위해 사용되는 주소이며, 만약 logical memory address가 0x00160이고, 이 프로세스에 할당된 physical memory address가 0x00110이라면 현재 logical memory address에 해당하는 physical memory address는 0x00270이 된다.

logical memory address 장점

logical memory address를 사용하지 않고, physical memory address를 바로 사용하면 같은 physical memory address를 사용하는 프로그램이 존재할 때, 한개의 프로그램은 실행되지 않는다.

반면, logical memory address는 컴파일 할 때 physical memory address가 할당되는 것이 아니라 실제 프로그램을 실행 시킬 때 메모리의 빈 공간에 logical memory address와 physical memory address를 bind 하기 때문에 사용자는 메모리 관리에 있어서 더운 편해진다.

 

실제 프로그래밍에서 메모리 참조는 할당된 simbol인 주소를 가지고 하는 것이다.

이 주소를 할당 받는 걸 바인딩이라고 했었다.

Binding 종류

Binding은 Binding을 하는 시점에 따라 크게 3가지로 구분 된다.

Compile time

instruction 또는 data에 주소를 컴파일 할 때 바인딩 하는 것이다. 컴파일 시 주소가 결정되기 때문에 메모리 구조가 변칙적으로 작용될 수 없으며, 메모리상 이미 그 주소를 사용하고 있으면 프로그램이 돌아가지 못하는 현상이 발생한다. 하지만 embeded system에서는 종종 이 방식을 채택하기도 한다. absolute code라고도 불린다.

Load time

컴파일을 할 때는 instruction, data에 base register를 0이라 상정하고 상대적인 주소 값인 logical address를 부여한뒤, 실제 프로그램이 메모리에 적재 될 때 physical address로 바인딩 된다. Compile time에 바인딩 되는 것 보다 좀더 탄력적이나, OS에 의해 프로세스 메모리가 변칙적으로 바뀌는 상황을 수용하지 못한다. relocatable code라고도 불린다.

Excution time

프로그램이 메모리에 적재 된 뒤 실행되는 동안 바인딩이 되는 것이며, logical address는 linkage editor에 의해 정해진다. 프로세스가 진행되는 동안 OS에 의해 메모리가 바뀌어도 그때 그때 바인딩이 되기 때문에 탄력적으로 수용 가능하다. 따라서 요즘 대부분의 운영체제는 이를 채택했다.

Address

logical address

cpu에 의해 생성되는 주소이며 , 0 ~ 의 주소 값을 가지고 있으며 간단하게는 user가 보는 관점에서의 주소 값이다. 각 프로세스가 가지는 logical address의 범위를 logical address space라고 한다.

physical address

MMU(memory management unit)이 logical address와 pid를 통해 실제 메모리에 주소에 해당하는 값이다. 이를 다시 말하면, MMU는 바인딩을 하기 위해 cpu에게 pid와 logical address를 받는다는 것이다.

Swapping

메모리를 더 효율적효율적으로 사용하기 위해 사용하는 방법이다. 디스크를 메모리의 확장된 영역이라 생각하고, 메모리상에서 사용량이 threshold를 넘지 못했을 경우 디스크로 옮기고 넘을 경우 메모리에 적재한다. 이는 메모리를 좀 더 넓게 사용할 수 있다는 장점이 있지만 context switch시간이 많이 걸린다는 단점이 존재한다. 또한 기존 메모리에 존재 했던 프로세스가 I/O신호를 요청하고 디스크로 swapping 되었을 경우, I/O신호는 적절한 physical address를 찾아갈 수 없다. 이러한 문제를 해결 하기 위해 현 모든 운영체제는 I/O신호를 kernel이 가지고 있다가 적절한 physical address를 찾아 넘겨준다.

memory utility가 높은 상태에서 Swapping을 하게 될 경우 cpu가 operate하는 시간 보다 memory I/O에 시간을 더 많이 사용하기 때문에 process가 보기엔 성릉이 더 떨어진다.

Mobile system에서의 Swapping

mobile system에서는 Swapping을 잘 지원하지 않는다. 그 이유는 다음과 같다.

Flash memory (ex. sd card)의 용량이 작음

 - flash memory자체의 용량이 작기 때문에 memory로 취급할 공간이 부족하다.

Write cycles 제한

 - flash memory에 write cycles의 존재와 횟수 때문에 제한한다.

Throughput의 저하

 - 사람과 interInteraction이 많은 mobile system에서는 Throughput이 저하 되고, user가 불편함을 느낄 수 있다.

Contiguous Allocation

logical address를 Physical address에 매칭 시킬 때, address를 0 번 부터 차례대로 할당하는 걸 의미한다.

0 ~ low memory address : interupt vector routine & OS
high memory address : user process

* interrupt : hardware에서 일어나는 interrupt 
* trap : software에서 OS가 생성하는 interrupt 

Hole

process memory를 사용하고 나면 process가 사용하고 남은 공간이 사용 가능한 공간이 되며, 이를 hole이라고 한다.

process가 실행되기 위해선 적달한 hole을 찾아 메모리를 할당 해야 한다.

logical address - physical address (변환) : MMU (memory management unit , hard ware)
logical address - physical address (매칭 , 할당) : OS (software)

Hole 할당 알고리즘

First - fit : low address부터 탐색해서 가장 먼저 찾은 충분한 크기의 hole에 process를 할당.
Best - fit : 충분한 크기의 hole을 모두 찾은 후 가장 작은 크기의 hole에 할당.
Worst - fit : 충분한 크기의 hole을 모두 찾은 후 가장 큰 크기의 hole에 할당.

속도 : First - fit > Best - fit ~ Worst -fit

효율 : Worst - fit ~ First - fit < Best -fit

Fragmentation

memory가 contiguous allocation 될 때 발생하는 문제이다.

External Fragmentation : 작은 hole들이 scatter되어 있으며, 이를 다 모으면 process를 할당하기에 충분한 memory가 되는 상황 
Internal Fragmentation : hole 크기 자체가 작은 상태로, 딱히 해결책이 없다.

Segmentation

기본적으로 Fragmentation이 발생하는 이유가 하나의 process가 연속된 physical address를 가지려 하기 때문에 발생 - 불연속적으로 만들어 해결 하고자 하는 것.

program 영역을 크게 나눠 보면 다음과 같다.

- main program (code / instruction)
- 초기화 된 data
- 초기화 되지 않은 data
- stack
- heap
-library routine
-symbol tabl
-...

이러한 program을 Segmentation해서 user space의 logical address는 contiguous하지만 physical address에서는 나눠지게 만들 수 있다.

Segmentation을 사용 할 시 logical address는 tuple로 이뤄지며 구조는 <segment number , offset> 이다.
* segmentation error는 이러한 Segmentation address(limit)를 넘어가기 때문에 trap되어 발생하는 것이다.

Segment Table

Segment Table은 segmentation에 대한 정보들을 가지고 있는 two tuple map이며, 각 tuple의 구조는 <limit , base>이다.

limit : segment의 길이
base : segment의 starting physical address

 * 각 process마다 segment table이 다르기 때문에 PCB( Program Control Block )에 저장된다.

Paging

physical address를 동일한 크기의 chunck로 분할 한 뒤 사용한다. 각 chunck의 크기는 2^n (n > 1) byte이다.

logical memory를 나눔 : frame
physical memory를 나눔 : page

paging을 통해 external fragmentation을 해결한다.

'OS' 카테고리의 다른 글

[Ubuntu] PXE + UEFI autoinstall 설정  (0) 2023.04.03
[Device] Device이름 설정  (0) 2021.02.18