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 주변의 주소를 참조할 가능성이 높다
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) 내부에 있음
'수업 > 운영체제' 카테고리의 다른 글
Operating System - Segmentation[Memory Virtualzation](5) (0) | 2022.12.22 |
---|---|
Operating System - CPU Virtualization & Scheduling(3) (1) | 2022.11.23 |
Operating System - CPU Virtualization(2) (0) | 2022.11.23 |
Operating System - OS기초와 CPU Virtualization(1) (0) | 2022.11.23 |