-
[OS] 운영체제와 메모리운영체제 2020. 10. 22. 17:26728x90
메모리
프로세스 수행 중 명령어를 실행시키려면 최소 1회의 메모리 접근이 필요함
-
PC 값을 이용하여 메모리로부터 실행해야할 instruction을 불러옴
-
명령어 해동 후 메모리에서 피연산자를 가져온 뒤
-
명령어 실행 후 필요 시 메모리에 결과값 저장
Base, Limit 레지스터
-
Base 레지스터( = Relocation 레지스터) : 프로세스의 시작 메모리 주소
-
Limit 레지스터 : 프로세스의 메모리 주소공간의 크기
-
Base 레지스터 값 + Limit 레지스터 값 = 프로세스의 메모리 끝 주소
-
유효성 검사 : if ( base < address < base + limit) OK else ERROR
이 범위를 벗어나는 메모리에 접근 시 에러를 발생 시킴
운영체제의 영역을 보호하기 위함과 동시에 하나의 메모리에 여러 프로세스를 동시에 올려놓기 위해 그들간의 구분을 분명히 할 필요가 있기 때문
Address binding
Logical 메모리를 Physical 메모리에 맵핑하는 것
int a -> 컴파일 -> 프로그램 시작 주소에서 14바이트 떨어진 곳에 a 를 할당 -> Linker 또는 Loader 가 절대경로 1014 번지로 할당함
Address binding 시점
-
Compile time : 프로세스가 메모리의 몇번지에 올라가는 미리 알고 있을 때
-
Load time : 컴파일 타임에는 주소공간을 모르지만 로딩 후에는 주소가 변하지 않을 때
-
Execution time
Logical address vs Physical address
-
Logical address
-
CPU 에서 만들어낸 Virtual(가상의) memroy
-
Execution-time 이 되어야 비로소 의미를 가짐
-
Physical address
-
Memory unit 에서 바라보는 실제 주소
MMU (Memory Management Unit)
Runtime 에 가상 메모리 주소를 물리 메모리로 맵핑시켜주는 하드웨어 장치
Dynamic loading : 프로세스의 실행 시점에 프로세스를 메모리에서 필요한 만큼만 가져오는 것 (보통 코드 영역을 분리하여 천천히 가져옴)
Static loading : 프로세스를 실행 시 프로세스 전체를 로딩하는 방법
Dynamic linking : 프로세스 실행 중 필요할 때 라이브러리를 링크하는 방식 : 메모리 절약 가능, 유지보수 용이
Static linking : 라이브러리와 프로그램 코드가 바이너리 이미지로 만들어 질 때 합쳐져서 나오는 것
Continuous Memory allocation
한 프로세스는 연속적인 공간 내에 할당됨
-
고정 분할 기법
-
메모리를 동일한 크기의 파티션으로 분할
-
하나의 프로세스는 하나의 파티션에 할당
-
큰 프로세스를 할당하기 위해서는 파티션을 크게크게 나누어야하니 낭비가 심함
-
가변 분할 기법
-
OS는 가용한 메모리 공간을 테이블로 관리
-
가용한 메모리 공간에 프로세스를 할당
Multiple partition allocation
Memory fragmentation : 메모리 단편화
-
Internal fragmentation : 파티션이 너무 커서 프로세스가 파티션을 다 쓰지 못하는 낭비
-
External fragmentation : 프로세스가 종료되어 메모리상에 구멍(Hole)이 난 경우
Variable partition : 파티션의 크기를 가변적으로 가져가는 것으로, 프로세스가 필요한 만큼만 파티션을 할당해주는 방법임. 이 경우 Internal fragmentation 은 적게 발생하지만 External fragmentation 이 발생
Dynamic storage-allocation problem
-
First fit : 프로세스가 들어갈 수 있는 hole 을 발견하면 바로 할당됨 : 가장 빠름
-
Best fit : 프로세스가 들어갈 수 있는 hole 중 최소의 메모리를 가진 hole 에 할당됨
-
Worst fit : 프로세스가 들어갈 수 있는 hole 중 최대의 메모리를 가진 hole 에 할당됨
Compaction : 할당된 주소를 싹 정리하여 한쪽에 몰아버림으로서 Fragmentation을 해결 : High overhead
Segmentation 기법
프로세스를 내부적으로 몇 가지 세그먼트로 쪼개어 메모리에 할당하는 것
세그먼트 단위 : main program, functiiotn, local variable, global variable, code, stack, heap ...
즉 하나의 프로세스가 여러개의 세그먼트로 나누어져서 관리된다는 것
Segment table
프로세스 별 Base, Limit 레지스터의 값과 Validation bit, read/write/execute privileges(권한)을 관리하는 테이블
Validation bit : 하나의 프로세스가 여러 세그먼트로 나뉘기 때문에 현재 동작중인 프로세스더라도 아직 메모리에 올라오지 않은 세그먼트에 접근할 수 있음. 이를 구분하기 위해 메모리에 올라온 세그먼트는 validation 값이 1이고, 올라오지 않은 부분은 0임
Paging
Logical 메모리에서 모든 메모리를 4KB 단위로 쪼개어 한 조각을 Page 라 부르고, Physical 메모리에서도 마찬가지로 4KB 단위로 쪼개어 Frame 이라 부름. 이 둘을 맵핑, 할당하는 기법을 페이징 기법이라 함
따라서 가변적으로 파티션의 크기를 할당할 때 페이지 단위로 할당하므로 external fragmentation 은 발생하지 않으며, Internal fragmentation 도 조금은 발생하지만 거의 발생하지 않음
프로세스가 N개의 페이지를 요구하게 되면 N개의 가용한 프레임을 OS가 파악하여 할당해줌
주소 변환법
-
Page number : 테이지 테이블 내에서의 인덱스값
-
Page offset : 페이지 내에서 찾고자하는 데이터의 인덱스
페이지 테이블은 페이지의 물리 메모리 주소를 갖고 있음
Frame table 은 가용한 Free frame 을 정리한 테이블로, OS가 관리하고 있다가 프로세스가 Page 를 할당요청하면 Frame table 에서 필요한만큼 꺼내어 할당해줌
페이지 테이블의 구현
-
페이지 테이블을 메인 메모리에 올려놓고 유지
-
Context switch 되면 PTBR(Page Table Base Register)에 해당 프로세스의 PT 값을 넣어줌
-
마찬가지로 PTLR(Page Table Length Register)에 페이지 테이블의 크기 값을 넣어줌
-
따라서 메모리에 한 번 접근하려면 페이지 테이블을 거쳐야하니 두 번의 메모리 액세스 발생
-
이를 위해 TLB(Translation Look-aside Buffer) 라는 페이지 테이블 캐시를 둠
TLB 동작 방식
메모리 접근 요청 발생 시 TLB와 Page table 에 동시에 요청을 날리고, 당연히 TLB가 훨씬 빠르기 때문에 그 결과가 먼저 리턴됨. TLB 에서 캐시 미스가 났으면 Page table 의 요청을 계속 진행시키고, 그렇지 않다면 취소시킴
Effective Memory Access Time(EAT)
-
a = 80% = TLB’s Hit rate
-
e = 20ns = TLB search time
-
m = 100ns = Memory access time
-
EAT = a * m(Segmentation table access) + (1 - a) * 2m(Segmentation table, Page table)
-
EAT = 0.8 * 100 + 0.2 * 200 = 120ns
Shared memory
여러 프로세스가 메모리를 공유하고 싶으면 Page number 를 공유하기만 하면 됨
'운영체제' 카테고리의 다른 글
[OS] 가상메모리 주소공간과 MMU (0) 2020.11.26 [OS] OS 페이징 기법 (0) 2020.10.22 CPU 스케쥴링 (0) 2020.10.19 운영체제의 프로세스 (0) 2020.10.19 운영체제 기본지식과 리눅스 (0) 2020.10.18 -