Background
프로세스란 실행 중인 프로그램이며, main memory에 올라간 상태이다.
메모리 구성
- 바이트(비트 8개) 단위로 Array가 쭉 나열되있는 상태이며, 각 주소가 할당되어있다.
- CPU는 memory에서 instructions을 fecth해온다 → program counter에서 가져옴
- 가져온 메모리 역시 load 또는 store한다
메모리 구성
- 프로세스는 메모리 공간을 분할해서 사용한다
- base register && limit register을 가지고 합법적인 주소를 할당한다
- 잘못짜면 segmentation fault 발생
Address Binding
- 우리는 상징적으로 메모리 번지(ex int n = 3)를 저장한다
- 해당 메모리를 컴파일러가 relocatable 주소라고 불리는 논리적인 주소를 만든다
- linker가 연결을 해주고 logical 주소가 생성된다
- 실제 프로그램에 로딩되면 physical 주소를 가진다

Logical vs Physical Address Space
- user process가 사용하고 있는 주소는 Logical에 불과하다, 이를 하드웨어 메모리에 있는 physical 주소에 맵핑을 해야된다.
- 두 개는 서로 연관이 없어야 하므로, 각 주소의 공간은 분리되어야한다
MMU(Memory Management Unit)
- 메모리 엑세스는 수 없이 많이 일어나기에 하드웨어 영역에서 처리해준다.
- logical 주소를 physical주소로 변환 해주는 일을 한다
- relocation register - base register 역할을 한다
- cpu가 0x346이라는 logical address를 엑세스 하고 싶다면,
- relocation register에 14000번지가 있다면, 현재 메모리는 0x14000에 엑세스 되어있다.
- MMU가 14346에 메모리를 쓰게 만든다 (예시)

Dynamic Loading
- 모든 것을 로딩하지 않고, 필요할때만 루틴을 로딩하자
Dynamic Linking and Shared Libraries
- DLLs(Dynamic Linking Libraries)
- 시스템 라이브러리는 항상 유저프로그램과 연결되어 있다.
- static linking
- 시스템 라이브러리를 일반 라이브러리를 불러오듯이 로더가 로딩한다
- dynamic linking
- 링킹도 실행 시 까지 연기를 하고, 실행 시만 엑세스에서 링킹한다
- shared library
- DLL이 shared library라고 알려짐 (ex) .dll ,.so))
Contiguous Memory Allocation
메모리를 어떻게 할당할 것인가?
- 메모리는 os 혹은 user process가 사용한다
- 다양한 유저 프로세스가 메모리에 동시 상주 한다.
- continuous memory allocation은 프로세스를 통째로 올리기에 구조가 연속적이다(=MMU가 간단해진다)
memory Protection
- relocation, limit register를 주면 CMA를 썼기에 쉽다.
Memory Allocation
- 메모리 크기가 다르기에 어떻게 할당할지에 대한 문제
- 큰 공간의 프로세스가 빠지고, 그곳을 작은 프로세스가 어떻게 채울지
- 이러한 hole을 어떻게 다룰것인가에 대한 문제
Dynamic Storage Allocation
- 구멍을 어떻게 채울까?
- First-Fit : 앞 주소 빈 공간부터 채우기
- Best-Fit : 가장 작은 구멍부터 차근차근 채우기
- Worst-Fit : 가장 큰 구멍부터 채우기
Fragmentation(단편화문제)
- external fragmentation - 공간이 남지만, 연속적인 공간이 없어서 나타나는 문제
- internal fragmentation - 프로세스 공간을 똑같이 나누었을 경우, 작은 크기를 넣을 경우 공간이 남는다.
segmentation
프로세스 역할마다 메모리 영역을 분리해놓자
Paging
Paging의 정의
- CMA의 contiguous한 구조를 non-contiguous하게 바꾼다.
- external fragmentation을 피한다
- 하드웨어의 도움을 받아서 작동한다
Paging의 Method
- physical memory를 고정된 크기로 나눈다 - frame
- logical memory는 같은 사이즈로 해당 블럭으로 들어간다 - page
- logical memory를 1,2로 나눠줬다면 둘이 연속된 공간으로 할당될 필요가 없다
- logical address space와 physical address space는 완벽하게 분리가 된다.
- logical주소와 연결된 물리적인 주소는 운영체제가 알아서 해준다
Page number
- 모든 주소는 CPU의해 2개의 파츠로 나누어진다
- (p, d) = (page number, page offset)
- page table이 존재하고 p라는 페이지를 찾아가면, physical address를 알게된다
- 알게된 frame이라는 physical memory space로 들어가서 d라는 offset만큼 읽어준다
Page size
- one page size = 2**2
- all page size = 2**10
- page number를 표현할 때는 10bit필요하다
- page offset을 표현할 때는 2bit필요하다
Hardware Support
- 페이지 사이즈가 너무 크게되면 하드웨어가 관리하기 힘들다
- PTBR(page-table base register)
- page의 시작번지를 가르키자
- page table은 메인 메모리에 둔다
- PTBR만 PCB에저장하기에 Context switch가 빠르다(전체 페이지를 저장 안함)
- 대신, 메모리 엑세스는 느리다
- 메모리를 2번 엑세스해야한다
TLB(Translation Look-aside Buffer)
- page table이 크기에, 캐시메모리를 사용하여 physical memory에 빠르게 엑세스한다
- TLB hit - TLB안에 page number가 포함되서 빠르게 엑세스 하는 경우
- TLB miss - TLB안에 page number가 없어서 메인 메모리에 있는 page number를 가지고 오는 경우
- hit ratio - hit와 miss의 비율
Memory Protection with Paging
- 기존 contiguous는 base와 limit로 쉽게 valid를 판단했다
- valid-invalid bit: 하드웨어적으로 one bit를 추가해서 해당 문제를 체크한다
Shared Pages
- paging을 통해 해당 기능을 쓰면 공통의 코드를 공유하기 좋다, 멀티프로그래밍의 환경에서
- Reentrant code
- 실행 중 바뀔 일이 없고 전부 공유해서 쓸 수 있는코드(print함수)
Page Table의 구조
- Hierarchical Paging
- Hashed Page Table
- Inverted Page Table -
Swapping
- real physical memory보다 logical memory가 더 클 경우, 현재 쓰는 페이지만 physical에 두자.
- 프로세스 당 당장 쓸 페이지만 올리니까 동시에 더 많은 것을 돌릴 수 있다.
- 엑세스할 경우만 메모리에 두는 기법
- Page 단위로 이루어지며, 오늘 날의 Paging 기법은 Swapping을 일컫는다.

'CS > OS' 카테고리의 다른 글
[OS] Storage Management (0) | 2022.01.09 |
---|---|
[OS] Virtual Memory (0) | 2021.12.23 |
[OS] Deadlocks (0) | 2021.12.16 |
[OS] Synchronization Examples (0) | 2021.12.16 |
[OS] Synchronization Tools - part2 (0) | 2021.12.16 |