Operating System - Address Space[Memory Virtualzation](4)

2022. 12. 22. 10:08수업/운영체제

기존 OS

--> 메모리에 프로세스만 로드할 밖에 없었다

--> 추상화 과정 없음, 프로세스는 모든 메모리를 한번에 차지

--> 낮은 cpu utilization 효율성

--> Expensive Machines, But low utilization

 

Multiprogramming and Time sharing

--> 여러 개의 프로세스를 메모리에 로드가능

--> 프로세스를 잠깐씩 수행

--> 메모리 프로세스를 전환

--> utilization efficiency 향상

--> 하지만 protection issue 중요해졌다

--> 프로세스가 메모리 다른 공간에 엑세스하는 문제생길

--> 프로세스가 어디에 있고, 어떻게 수행?? --> 관리의 필요성 생김

 

Virtual Memory

--> 메모리는 충분치 않다

--> 메모리가 얼마나 필요? --> 어플리케이션 구동을 위한 최소의 메모리가 얼마나 되나?

--> "많이 같은 " 올려야지 라는 생각 --> Locality

 

메모리에 엑세스 하는 것을 utilizing

--> 메모리 엑세스는 순차적으로(sequentially)

--> 메모리 엑세스는 locality라는 property가짐

 --> Temporal Locality Spatial Locality

 

Locality

--> Locality : 프로그램은 최근에 사용한 주소나, 최근 사용한 주소의 주변에 있는 데이터나 명령어들을 재사용하는 경향이 있다

--> Temporal Locality : 최근에 참조된 명령 또는 데이터는 재사용될 확률이 높다

--> Spatial Locality : address x 메모리 주소를 참조하였다면 이후 address x 주변의 주소를 참조할 가능성이 높다

 

Temporal Locality, Spatial Locality
자주 update하는 값 i는 temporal, 배열 a[i]는 spatial locality

Data : Temporal하게 sum 접근 / Spatial하게 a[i] 배열에 접근(a[i] 참조하면 주변 a[i+1] 이후 참조가능성이 높은)

Instructions : Temporal하게 루프를 돈다 / Spatial하게 명령을 참조

 

Virtual Memory

--> 주소공간은 abstraction하다 --> , 무한대라고 생각하고 있다는

Hide all physical aspects of memory from users

--> 메모리는 논리적으로 제한이 없다

 

Address Space : OS 의해 제공되는 물리적 메모리의 추상적 표현

--> 주소공간은 모든 실행중인 프로세스를 보유하고 있음

--> 프로그램 코드, , 스택 등등

--> code data 있는 영역은 fix, heap stack dynamic 영역

--> dynamic? 효율적 사용위함

하지만 실제로는 프로세스가 전체 메모리에 포함되진 않는다

--> 그렇기에 추상화는 메모리 가상화를 필요로

Logical address - CPU 의해 생성된 주소

Physical address - 메모리 유닛이 주소

Address Space

- code / heap / stack

코드 : 명령어들을 포함하는

: 메모리를 Dynamically하게 분배 - C언어에서 malloc 해당 / 객체지향언어에선 new

스택 : 주소나 값을 저장한다, 지역변수를 저장함

Memory Virtualization 장점

 - 프로그래밍에서의 사용 용이성

 

 - Transparency

 --> 프로그램은 메모리가 virtualized 것을 알지 못한다

 

 - Utilization : 시간과 공간의 사용에 있어 메모리 효율성

 --> Time : 성능에 부정적인 영향 미치지 않음

 --> Space : 가상화로 최소화된 공간만 차지

 --> 이러한 효율성을 위해 OS 하드웨어의 도움 필요 ex. 시간 효율성을 위한 TLB

 

 - Protection : 프로세스 OS 대한 격리 보장

 --> 다른 프로세스 또는 OS 부터 프로세스 보호

 --> 결과적으로 프로세스간 격리

 --> 메모리 공유에도 적합

 

Memory Virtualization --> 프로그램에 무한의 메모리 크기를 주는 일루젼을 제공하는 --> 어떻게?

--> Address Translation 통해서 --> hardware 물리적 주소 변환 / 하드웨어에 의해 가상주소를 물리주소로 변경, OS 정확한 주소 번역으로 관리

--> 하드웨어의 도움이 있어야만 Memory Virtualization에서의 효율성과 관리가 달성된다

--> ex. registers, TLBs, page-table등을 통해서

 

Address Translation --> 하드웨어는 Virtual address physical address 변환한다

OS 하드웨어 셋업을 위해 도움

 

Memory Hierarchy? 서로 다른 성능, 속도, 용량을 체계화 해서 사용자에게 좋은 성능에 용량의 메모리를 제공하는 것과 같은 illusion 제공하기 위해 분리해둔 메모리 계층

 

코드들 --> Instruction 영역(text영역이라고도 )

변수들 --> 데이터 영역

, 스택 --> 다이나믹하게 할당(ex. malloc()) - Dinamically Managed Memory라는 영역

 

만약 N bit 아키텍쳐에서,

주소 : 2^N bit - 1 / 용량 : 2^N Byte

Virtual Memory --> 각각 주소를 가진 배열과 같은

 

ex. 32bit 아키텍쳐

--> 명령어도 32bit, 4Byte --> 메모리 주소도 32bit, 4Byte 되어있다

--> 32bit 주소 개수? --> 2^32 --> 하나의 주소가 1byte가질 있기에 virtual memory size 2^32 Byte!

--> 4기가바이트

--> 이러한 32비트 아키텍쳐에서 Address Space? 프로세스 하나씩 32비트 이므로 4GB Address Space가진다(물론 virtual memory)

--> Physical memory 4GB 차지되는 아니다 --> 부분부분 올라와 있을 , 하지만 어느 부분인지는 알고 있어야 물리적 메모리에 접근해 데이터를 가져와 연산 가능 --> , Address Space 주소는 Logical Address, 그것을 Physical Address 전환하는 것이 OS 역할

 

Address Translation --> 논리적 주소에서 물리적 주소로의 변환

--> Logical Address CPU 생성시키는 것이고 Physical Address Dram 있는 메모리 --> OS 개입해 최적화 한다

 

Address Translation 하기 위한 가정

--> 1. Address Space 물리적 메모리에 연속적으로 할당된다

--> 2. Address Space(논리적 메모리) 크기는 물리적 메모리 크기보다 적어야한다

--> 3. Address Space( 프로세스 ) 같은 크기

Address Space Relocation

--> 프로그램의 측면에서, 주소공간은 0부터 시작

--> memory virtualization 위해서 OS 프로세스를 physical memory 어딘가에 저장하고자 --> transparent하게 relocate하는 방법? / virtual address 공간이 0부터 시작한다는 illusion 제공하는 방법?

Dynamic(Hardware-based) Relocation

--> 프로그램이 시작 , OS 물리적 메모리에 프로세스가 어디에 위치할 결정한다

--> base register 설정하고, 모든 virtual address bound보다 크지 않고, 음수가 없다

물리적 공간 어느 곳에나 배치가능 --> 프로세스가 자체 주소에만 접근가능하게

전제조건? OS의해서만 base/bounds 레지스터는 액세스 권한 있음

 

OS 해야하는 --> 논리적 메모리 0 사용했을 물리적 메모리 32KB 있다는 것을 알고있어야 하는 , 시행하는

--> 이를 위해 프로세스마다 base register, bound register가지고

--> 작은 용량의 레지스터를 두고 base - 시작주소 / bound - 사이즈 관리

--> 만약 논리적 메모리 주소가 100번이면 물리적 주소는 32KB + 100

--> 논리적 주소는 당연히 크그인 바운드를 넘어서지 않아야

 

힙과 스택사이의 영역

--> 힙과 스택이 다이나믹 영역이기에 공간이 바뀔 있다

--> , 스택이 증가하는 방향은 안쪽으로, 힙은 아래로, 스택은 위로 이동할 있는 가용적 영역

 

하드웨어 지원

--> 하드웨어는 다른 프로세스가 생성될 OS 변경할 있도록 base/bound 레지스터를 수정하기 위한 special previleged 제공해야 한다

--> CPU 사용자 프로그램이 불법적으로 메모리에 접근하려 exception 생성해야

 

Memory Management Unit - MMU

--> 전기하드웨어 회로로 구성된 CPU 일부

메모리 계층(memory hierarchy)

: 속도가 빠르면서, 용량의 메모리는 현재 없다 - 계층에 맞게 - 서로 다른 특성의 메모리를 계층화 시켜서, 사용자가 성능도 좋고 용량도 메모리를 가지고 있는 같은 환상을 누리게

--> 메모리 만드는 기술, locality 활용해 구현

 

 Memory Virtualization 관련된 OS이슈 가지 --> OS base/bound 접근방식 구현을 위해서 조치를 취해야

--> 1. 프로세스 실행 : 물리적 메모리의 주소공간을 찾아야

--> 2. 프로세스 종료 : 사용을 위한 메모리 회수

--> 3. context switch 발생 : base/bound 짝을 저장해야

프로세스가 만약 bound 넘어서 접근하려 한다

--> 4. bound 외부에 접근 exception

 

OS 이슈 : 프로세스 시작 실행

--> OS 새로운 address space 찾아야

--> free list? 사용되지 않은 물리적 메모리의 리스트

--> 프로세스 종료 시엔 메모리를 freelist 반환

OS 이슈 : Context Switch 발생

--> OS base and bounds pair 저장해야

--> process structure 저장 --> PCB(Process Control Block) 내부에 있음