[운영체제 공룡책] 9. Main Memory
주 메모리의 관리
9.1 Background
프로세스는 메인 메모리에 로드되어 실행되고 있는 프로그램이다
메모리
- 바이트 단위로 구성되어 있는 배열
- CPU가 PC 레지스터로 메모리에 있는 명령어(instruction)를 fetch하여 메모리에서 명령어를 load하고 store한다.
Memory Space(메모리 주소 공간) : 어떻게 프로세스들을 로드하고 관리할 지에 대한 관점으로 메모리 공간 설명
- 멀티 프로세싱에서는 각각의 프로세스가 독립적인 메모리 공간을 받는다는 것을 전제로 함
- base register와 limt register는 페어로 주소의 범위가 적합한 지 판단해줌
Protection of memory space (메모리 공간 보호)
- base register와 limt register를 이용하여 CPU가 해당 주소에 접근해도 되는 지 판단
Adress Binding
- 프로그램이 주소를 다루는 방식은 단계마다 다름
- 프로그램은 실행가능한 바이너리 파일로 디스크에 저장되어 있는 상태임
- 프로그램을 실행시키면 메모리에 불러와짐
- 프로세스의 주소는 OS 커널에 의해 시작 위치가 지정됨
- 컴파일러는 소스코드 상에서 symbolic한 주소를 relocatable한 주소로 변경해줌
- linker, loader
Logical vs Physical
- logical address : CPU에 의해 생성되는 주소
- logical address space
- phyical address : 컴퓨터의 메인 메모리에 접근할 때 사용되는 주소이며, memory-adress register에 적재된다. 물리 주소를 이용하여 물리 주소 공간에 접근할 수 있으며 실제 메모리 공간과 같다
- phyical address space
MMU (memory Management Unit)
- 하드웨어로 관리!
- 사용자가 사용하는 논리적 주소를 물리 주소로 변환함
- relocation register : base register의 역할을 함
Dynamic Loading
- 프로그램 전체가 로드될때 모든 데이터가 물리 메모리에 들어가야할까? ㄴㄴ임
- dynamic loading은 메모리 공간을 효율적으로 관리하기 위해 모든 데이터를 불러오는 게 아니라 필요할 때만 루틴들을 로딩함. relocatable linking loader가 필요한 루틴을 호출할 때 프로그램의 주소 테이블을 갱신함
Dynamic Linking and Shared Libraries
- DDLs : Dynamically Linked Libararies - 사용자 프로그램이 실행되는 중에 system libraries가 linking 되는 것
- static linking : 시스템 라이브러리를 다른 오브젝트 모듈처럼 다뤄지며 loader에 의해 바이너이 프로그램 코드와 결합됌
- dynamic linking : dynamic loading과 유사하며, linking을 실행시점까지 연기
- shared library
- 윈도우 : .ddl
- 리눅스 : .so
9.2 Contiguous Memory Allocation
- 메모리 할당 방법
- Contiguous Memory Allocation
- Paging (밑에서 이어서 배움)
- Contiguous Memory Allocation
- 사용자 프로그램을 통째로 메모리에 할당하는 것을 연속 메모리 할당이라고 함
- 가용 가능한 메모리를 어떻게 할당할 것인지가 문제가 됨! single section of memory
- 동적 메모리 할당
- First-Fit : 처음 나오는 가용 메모리 공간에 메모리를 할당한다
- Best-Fit : 가장 최적화된 hole에 메모리를 할당한다
- Worst-Fit : 가작 넓은 메모리 공간에 할당한다
- Fragmentation 단편화
- 짜투리가 되어 남은 메모리 공간은 어떡할까?
- external fragmentation (외부 단편화) : 프로세스 메모리 공간과 메모리 공간 사이의 공백
- internal fragmentation (내부 단편화) : 할당된 메모리 단위(프레임) 내에서 남은 공간
- 페이징을 하면 내부 단편화가 생기고, contiguous 메모리 할당을 하면 외부 단편화가 발생함
- Segmentation (10 챕터를 다룰 정도의 내용인데 개념이라도 배워야하니 퀴즈를 풀어보자)
- Contiguous Memory Allication과 Paging 사이에 있는 기법이 Segmentaion임
- paging이 훌륭한 솔루션이라 더이상 쓰지 않지만 자주 사용되는 용어라 설명하심
페이징과 스와핑
9.3 Paging
Paging
- 프로세스의 물리적 주소 공간을 연속적이지 않도록 메모리 관리함
- 이를 통해 Contiguous Memory Allocation의 두 가지 문제를 극복할 수 있음
- external fragmentaion 완화 (거의 발생하지 않음)
- the associated need for compaction (압축)
가장 기본적인 방법 : 논리적 메모리와 물리적 메모리의 결합을 끊음 (매핑은 운영체제가)
- frames : 고정된 크기로 물리적 메모리를 쪼갠 단위
- pages : 논리적 메모리를 frames와 같은 사이즈로 쪼갠 단위
페이징 기법으로 관리되는 메모리에 접근 시 물리 메모리 주소를 알 필요 없음
- 물리 메모리 ex) 0xFFFF001
- 페이징 기법으로 논리적 메모리 접근 방법
- p : page number (0부터 시작)
- d : page offset
The page number
- 페이지 테이블에서 페이지 번호(p)에 해당하는 페이지를 찾고
- 해당 페이지에서 offset(d)에 해당하는 주소를 찾으면 물리적 주소에 해당하는 frame number(f)를 찾을 수 있음
- 물리적 주소를 가지고 실제 메모리 공간에 액세스
The page size (like the frame size)
- 적절하게 정하는 것도 중요함
- 하드웨어에 의해 설정하면 됨 (OS가 알잘딱하게 설정하니까 우리가 개념적으로 알아야할 것에 집중해보자)
- page 사이즈는 2의 배수여야함
- 그리고 4KB와 1GB 사이여야 함
- 만약 논리주소공간의 2^m, page size가2^n일 때
- high-order 2^(m-n) bits은 page number
- low-order 2^n bits는 page offset == page size
- logical address space와 page size를 주면 page number와 page offset을 구할 줄 알야아함
- n = 2 == 2^2 == 4 → 페이지 하나의 크기가 4 bits
- m = 4 == 2^4 == 16 → 논리적 주소 공간의 크기가 16 bits
하드웨어 지원
- CPU 스케쥴러에 의해 컨텍스트 스위칭이 발생했을 때 page table도 reload 되야겠지!
- 그래서 page table를 가르키는 포인터는 각 프로세스의 PCB 내에서 관리되야함!
- 근데 이게 일이다! 하드웨어로 관리하기 어렵다! 그러면 새로운 아이디어가 나오겠지!
PTBR (page-table base register)
- points to the page table
- page table 자체는 메인 메모리에서 관리
- 컨텍스트 스위칭시 빠르지만, 메모리 접근 시 상대적으로 느리다
- 두 번의 메모리 접근이 필요함
- page-table 접근을 위해
- actual data
- 근데 이것도 좀 비효율적인 면이 있어! 메모리를 두 번 접근하니까 느린거지! 그래서 중간에 캐시 개념의 버퍼를 둠! 그게 바로 TLB
Transaltion Look-aside Buffer (TLB)
- 빨간 동그라미 친 TLB가 캐싱용이고, 굉장히 빠른 하드웨어의 도움을 받음!
- 만약 TLB에 값이 존재한다면 바로 물리 메모리에 접근 가능하니까 빠르고, 만약 TLB에 없으면 페이지 테이블에 접근ㄲ!
Effective Memory Access Time
TLB hit : 우리가 찾는 페이지 번호가 TLB에 있을 경우
TLB miss : TLB에 없음
hit ratio : 히트레이트로 얼마나 효율적인지 판단하는 기준이 된당
만약 메모리 접근하는 데 10ns 시간이 소요된다고 할때, TLB hit 할 경우에는 메모리 액세스가 한번이니까 hit ratio * 10 ns + miss ratio * 20 ns 곱해서 소요시간 계산하면 됨!
Memory Proection with Paging
- Contiguous Memory Allocation에서는 유효한 주소 범위에 있는지 아닌지 base와 limit으로 검증 가능했었지. 하지만 Paging이 도입될 경우 여러 덩어리로 쪼개있으니까 이 방법 대신
prodction bits
를 사용해야함 - valid-invalid bit
- Contiguous Memory Allocation에서는 유효한 주소 범위에 있는지 아닌지 base와 limit으로 검증 가능했었지. 하지만 Paging이 도입될 경우 여러 덩어리로 쪼개있으니까 이 방법 대신
Shared Pages
- 페이징을 통해 공통의 코드를 동시에 공유할 수 있음
- 예를 들어, c 언어의 printf() 메서드를 여러 코드에서 공유할 수 있는거즹
Structuring the Page Table
- 논리적 메모리 공간이 너무 커지니까 고민이 되더라! 아래처럼 방법이 나옴
- Hierarchical Page Tabe(계층적, rwo level page table이라고도 함)
- Hashed Page Table
- Inverted Page Table (제일 유용)
- 어떤 PID가 어떤 페이지를 가지고 있는지를 갖고 있게 해성!! ㅇㅇ!
Swapping
- 실제 물리적 메모리보다 용량이 큰 프로그램이 있을 수 있지 않을까? 이걸 어떻게 사용 가능하게 할 수 있을까?
- 필요한 부분만 로딩해서 사용할 수 있음!
- 어떤 프로그램이든 지금 당장 필요한 부분만 스왑했다가 아웃했다가 함!
Swapping with Paging
오늘날의 Paging은 Swapping과 함께 적용된 페이징을 의미한다! 가상 메모리에서 큰 위력을 발휘함! 스와핑을 페이지 단위로 함!
- page out
- page in
'엔지니어링 > 개발배움터' 카테고리의 다른 글
[운영체제 공룡책] 11-15. Storage management (0) | 2022.09.12 |
---|---|
[운영체제 공룡책] 10. Virtual Memory (0) | 2022.09.05 |
[운영체제 공룡책] 8. Deadlock (0) | 2022.08.24 |
[운영체제 공룡책] 7. Synchronization Examples (0) | 2022.08.15 |
[운영체제 공룡책] 6. Synchronization Tools (0) | 2022.07.30 |
댓글
이 글 공유하기
다른 글
-
[운영체제 공룡책] 11-15. Storage management
[운영체제 공룡책] 11-15. Storage management
2022.09.12 -
[운영체제 공룡책] 10. Virtual Memory
[운영체제 공룡책] 10. Virtual Memory
2022.09.05 -
[운영체제 공룡책] 8. Deadlock
[운영체제 공룡책] 8. Deadlock
2022.08.24 -
[운영체제 공룡책] 7. Synchronization Examples
[운영체제 공룡책] 7. Synchronization Examples
2022.08.15