일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 안드로이드 스튜디오
- 안드로이드스튜디오
- Kotlin
- Exposed Drop-Down Menu
- 안드로이드 http
- Callback
- 앱 출시
- 앱개발
- android studio
- 달력 만들기
- 레트로핏
- 플레이 콘솔 프로덕션
- Bottom sheet
- android api
- 플레이스토어 앱 게시 문제
- Dialog
- 안드로이드 api
- 비동기
- Retrofit
- urlconnection
- 공유 기능
- Today
- Total
Strong 감자의 공부
Memory01_메모리 주소 본문
1. 배경지식
- 프로그램이 실행될려면 디스크에서 메모리로 가져와 프로세스내에 배치해야한다.
- 주 메모리는 OS 공간과 사용자 공간의 2개 파티션으로 나뉜다. 인터럽트 벡터와 함께 OS 공간은 낮은 메모리에 상주하고 사용자 페이스는 높은 메모리에 상주.
- CPU의 레지스터와 메모리는 CPU가 직접 접근할 수 있다.
- 레지스터는 일반적으로 CPU클럭으로 1사이클 이내에 접근이 가능하지만, 메인 메모리는 많은 사이클이 소요된다.
- 메인메모리와 CPU레지스터 사이에 캐쉬가 존재(메모리와 CPU의 속도 차이를 해결하기 위해서, CPU 성능이 향상되어도 캐시가 없었다면 메모리 접근 속도에 따라 성능 저하)
- 레지스터 vs CPU
- 공통점 : 둘 다 무언가를 저장하는 장소라는 점
- 차이점 : CPU의 레지스터는 그 크기가 매우 작은 대신에 접근이 빠르고 메모리는 크기가 비교적 큰 대신에 접근이 느리다.
- 이유 : 메모리 버스를 타고 데이터가 오가기 때문이다. 즉, 메모리 버스를 타고 데이터가 오가는 동안 CPU는 아무것도 안한다. 이 상태를 최대한 줄이기 위해 캐시를 CPU와 메모리 사이에 놓는다.
- 레지스터 vs CPU
2. 메모리 주소 종류
- 물리적 메모리주소(=Physical address) : 실제 메모리 상에 존재하는 주소를 의미한다.
- 논리적 메모리주소(=Logical address, virtual address)
- CPU입장에서의 메모리 주소, 프로그램 실행중에 cpu가 생성하는 주소, 가상주소, 논리주소
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지부터 시작
3. 물리적 메모리 시작위치와 논리 주소 공간 지정 (base와 limit register) -> 3. 바인딩 종류_execution-time address 추가해서 다룸
- logical address + base register(relocation)값을 더해서 물리적메모리 시작위치를 얻게 됨.
- 논리주소 공간 지정
- base register(=relocation register) : 각 프로세스가 갖는 물리적 메모리의 최솟값.
- limit register : 현재 수행중인 프로세스의 논리적 주소의 최댓값으로 프로세스의 크기
- 하나의 프로세스가 올라오면 차지하는 공간 (base ~limit)이기 때문에 CPU는 메모리 접근때마다 base와 limit 사이에 존재하는지 체크해야한다. (그림 2)
- 예: 기본 레지스터가 300040을 보유하고 제한 레지스터가 120900인 경우 프로그램은 300040에서 420939(포함)까지의 모든 주소에 합법적으로 액세스할 수 있다.
이제 모든 프로세스는 Base Register로부터 물리적 주소에서의 시작주소를 알 수 있기 때문에 → 각 프로세스들의 논리주소는 항상 0번지 주소부터 시작해도 문제가 없다.
CPU가 논리적 주소 123번지에 있는 메모리를 요청하게 되면 base register에 저장된 23000을 더해 23123 물리적 메모리 주소 내용을 참조하게 됩니다. 논리적 주소 123번지는 기준 레지스터의 값으로부터 얼마나 떨어져 있는지를 나타내는 개념으로도 생각할 수 있습니다. 프로세스는 자신마다 고유한 주소 값(base register값)을 가지고 있고, 각 프로세스마다 서로 다른 내용을 담게 됩니다. 그래서 cpu가 논리적 주소 100번지를 참조할 때, 이 CPU에서 수행하는 프로세스가 다를 경우 가리키는 내용(base register값)은 상이해야 합니다. 물리적 메모리 내에 여러 프로세스가 올라올 경우 base register의 값을 그 프로세스에 해당되는 값으로 재설정만하면 됨.
예) CPU에서 사용하는 논리주소가 5, base register값이 1320, 물리주소 시작은 1325
Memory protection
Memory protection을 위해 base register와 Limit register가 쓰인다.
다중 프로그래밍 환경에서는 물리적 메모리 안에 여러 개의 프로세스가 동시에 올라가 있는 경우가 대부분인데 실수로 다른 프로세스의 주소 공간을 가리키는 경우를 방지하기 위해 위의 두개가 쓰인다.
trap to operating system : 오류일경우(base보다 작은곳에서 실행이된다면, 프로세스가 자신의 주소 공간을 넘어서는 메모리를 참조할려한다면 등) 실행되는 인터럽트 핸들러
3. 주소 바인딩
주소반인딩은 3가지 시점에서 일어날 수 있다.
- Compile- time binding
- 컴파일 시점에 물리적 메모리 주소가 결정
- 컴파일러는 절대코드(absolute code)를 생성
- 즉, 프로그램 내부에서 사용하는 주소와 물리적 메모리 주소가 동일.
- 프로그램의 물리적 주소를 변경하고 싶으면 다시 컴파일해야 한다.
- Load time binding
- 컴파일 시간에 프로세스가 메모리의 어디에 위치될지 모를 때, 컴파일러는 재배치 가능 코드(relocatable code)를 생성해야하고, 최종 바인딩은 로드시간까지 지연.
- Loader(로더란 사용자 프로그램을 메모리에 적재시키는 프로그램)가 물리적 메모리 주소를 부여, 메모리에 올라갈때, 프로그램이 종료될 때까지 물리적 메모리 상의 위치가 고정.
- 결과적으로, 프로그램 내부에서 사용하는 주소와 물리적 메모리 주소는 다른 방식이다.
- Execution-time binding(=Run time binding)
- 실행 중에 한 메모리 세그먼트에서 다른 메모리 세그먼트로 프로세스를 이동할 수 있는 경우 바인딩은 런타임까지 지연돼야 한다.
- 프로그램이 실행한 후에도 물리적 주소가 변경될 수 있는 바인딩 방식이다.
- 하드웨어적인 지원이 필요(기준 레지스터(base register), 한계 레지스터(limit register), MMU(Memory Management Unit)
- CPU가 주소를 참조할 때마다 binding을 점검(address mapping table)
- 런타임 바인딩은 메모리에 프로세스의 주소공간이 연속적으로 적재되어 있음을 가정한다.
- 현대 바인딩 개념이다.
MMU (Memory Management Unit) : CPU core안에 탑재되어 논리주소와 물리주소를 맵핑시켜주는 하드웨어이다.
• 방법 : CPU에 의해 생성된 논리주소 +base 레지스터의 값 = 논리주소에 해당하는 물리 메모리주소
MMU기법에서는 문맥 교환으로 cpu에서 수행 중인 프로세스가 변경될 때, base register의 값을 그 프로세스에 해당되는 값으로 재설정. 이와 같은 방식은 하나의 주소 체계를 가지는 물리적 메모리 내에 여러 프로세스가 올라올 경우 프로세스 별 논리적 주소를 어떻게 물리적 주소로 매핑할 수 있는지 보여줌.
논리와 물리 주소는 1. compile-time 2. loadtime address binding에서는 같은데, 3.execution-time address-binding에서는 다르다.
즉, 로드타임은 한 번만 바꿔 놓게 되면 똑같은 해당 주소로 접근.
그러나 실행 시간 바인딩의 경우 변환 작업을 수행하고 메모리에 접근.
4. Swapping 정의
부족한 메모리에 더 많은 프로세스를 실행하고자할 때, 우선순위를 기준으로 backing store에 옮겨뒀다가(Swap out) 옮겨진 프로세스가 필요하면 다시 메인메모리로 가져온다.(Swap in)
swap time은 대부분 transfer time(swap 되는 양에 비례하는 시간)
프로세스가 실행되려면 반드시 메모리에 올라가야 합니다. 프로세스가 스와핑(swapping) 한다 라는 것은 현재 메모리에서 잠깐 다른 저장공간(HDD나 SSD)으로 옮겨졌다가, 돌아왔다가 이런 식으로 실행에 따라 교체될 수 있다는 걸 의미합니다. 보조기억장치(secondary storage, Backing storage) 간단하게 정리하면 스와핑(Swapping)이란 주기억장치에 적재한 하나의 프로세스를 보조기억장치에 잠시 적재했다가 필요할 때 다시 꺼내서 사용하는 메모리를 교체하는 기법이라고 할 수 있습니다. 하드디스크에 있던것을 다시 메모리에 로딩하는것이라 시간이 걸립니다.
현재프로세스 단위로 스와핑하는 Swapping은 사용하지 않는다. 페이징단위로 스와핑하는 가상메모리를 사용한다.
참고)
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jkfirst&logNo=120175882487
https://silo.tips/download/what-is-the-base-register-and-what-is-the-limit-register#
https://resilient-923.tistory.com/397
https://jhnyang.tistory.com/247?category=815411