일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- http발전과정
- appcompatactivity
- AAC
- appcompatacitivity
- 내부 단편화
- GetX
- 안드로이드
- http 역사
- apk 빌드 과정
- 프로세스
- Kotlin
- 디자인 패턴
- 데코레이터 패턴
- 물리 메모리
- 리사이클러뷰
- flutter
- 리사이클러뷰풀
- recyclerview
- 자이고트
- NestedScrollView
- 상태관리
- 절대 주소
- 뷰홀더
- viewModelScope
- DiffUtil
- Android
- Dispatchers
- 플로이드워셜
- 운영체제
- AsyncListDiffer
- Today
- Total
hong's android
[CS] 물리 메모리 관리 본문
개발자가 작성한 프로그램들은 어떻게 메모리에 적재되고, 실행될까?
운영체제 도서를 읽으며 관련 내용들을 정리해보았다. 실제 책 목차와 다른 부분들이 있을수 있다.
메모리의 용량을 늘리면 작업 속도가 빨라지지만 어느 수준 이상이 되면 그 차이가 적어진다. CPU의 작업 공간이 메모리이기 때문에 메모리 관리는 성능에 막대한 영향을 미친다.
1. 메모리 관리의 복잡성
운영체제도 프로그램이므로 메모리에 올라와야 실행할 수 있다. 따라서 메모리에는 사용자 프로세스뿐 아니라 운영체제 프로세스도 공존한다. 컴퓨터 부팅이 이루어지는 과정에서, 하드디스크에 저장된 운영체제가 메모리에 올라간다. 부팅이 끝나면 여러 응용 프로그램이 메모리에서 작업을 할 수 있다.
2. 소스코드의 번역과 실행
2.1 컴파일러와 인터프리터의 동작
컴파일러: 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행한다.
인터프리터: 소스코드를 한 행씩 번역하여 실행한다.
3. 컴파일러의 목적
3.1 오류 발견
컴파일러의 첫 번째 목적은 소스코드에서 오류를 발견하여 실행 시 문제가 없도록 하는 것이다. 컴파일러는 오류를 찾기 위해 심벌 테이블을 사용한다. 심벌 테이블은 변수 선언부에 명시한 각 변수의 이름과 종류를 모아놓는 테이블이다.
3.2 코드 최적화
소스코드에 군더더기와 사용하지 않는 변수를 삭제하여 코드를 간결하게 만들고, 최적화를 진행한다.
3.4 컴파일 과정
컴파일은 사용자가 작성한 소스코드를 목적 코드로 변환한 후 라이브러리를 연결하고 최종 실행 파일을 만들어 실행하는 과정이다.
1) 소스코드 작성 및 컴파일
프로그래머가 C언어나 자바로 소스코드를 작성하여 컴파일하면 목적 코드가 만들어진다.
2) 목적코드와 라이브러리 연결
목적 코드가 만들어지면 라이브러리에 있는 코드를 목적 코드에 삽입하여 최종 실행 파일을 만든다. 링커는 이런 라이브러리를 찾아서 실행 파일에 포함시키는 역할을 한다.
3) 동적 라이브러리를 포함하여 최종 실행
최종 실행할 때 삽입되는 함수를 가진 라이브러리를 동적 라이브러리라고 한다. 동적 라이브러리 방식에서는 함수가 변경되어도 새로 컴파일할 필요가 없다. 그러니까 새로운 기능이나 오류가 발견되어서 수정될 때마다 컴파일하여 새로운 라이브러리를 가져올 필요가 없다.
4. 메모리 관리자의 역할
- 가져오기 작업
프로세스와 데이터를 메모리로 가져오는 작업이다.
- 배치 작업
가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업이다. 메모리를 같은 크기로 자르는 것을 페이징이라고 하며, 프로세스의 크기에 맞게 자르는 것을 세그멘테이션이라고 한다.
- 재배치 작업
새로운 프로세스를 가져와야하는데 메모리가 꽉찼다면 메모리에 있는 프로세스를 하드디스크로 옮겨놓아야 새로운 프로세스를 메모리에 가져올 수 있다. 이처럼 꽉 차 있는 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업이다.
메모리 주소
1. 절대주소와 상대 주소
1.1 메모리 영역의 구분
메모리 관리자는 메모리를 운영체제 영역과 사용자 영역으로 나누어 관리한다. 운영체제는 시스템을 관리하는 중요한 역할을 하기 때문에 사용자가 운영체제를 침범하지 못하도록하여 관리한다.
사용자 영역이 운영체제 영역으로 침범하는 것을 막으려면 하드웨어의 도움이 필요한데, 이는 CPU 내에 있는 경계 레지스터가 담당한다.
1.2 절대 주소와 상대 주소의 개념
절대 주소는 실제 물리 주소를 가리킨다. 또, 메모리 관리자 입장에서 바라본 주소이다.
메모리 관리자는 절대 주소를 사용하지만 사용자 입장에서 절대 주소는 불편하고 위험하다. 절대 주소를 사용하면 매번 운영체제 영역을 확인해야한다. 운영체제 영역의 주소가 사용자에게 노출되면 실수나 고의적인 조작으로 운영체제 영역을 침범할 수도 있다.
사용자 프로세스 입장에선 운영체제 영역은 어차피 사용할 수 없는 공간이다.
상대주소는 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소 지정 방식이다. 상대 주소는 사용자 프로세스 입장에서 바라본 주소이며, 절대 주소와 상관없이 항상 0번지 부터 시작한다.
1.3 상대 주소를 절대 주소로 변환하는 과정
1) 사용자 프로세스가 상대 주소 40번지에 있는 데이터를 요청한다.
2) CPU는 메모리 관리자에게 40번지에 있는 내용을 가져오라고 명령한다.
3) 메모리 관리자는 재배치 레지스터를 사용하여 상대 주소 40번지를 절대 주소 400번지로 변환하고 메모리 400번지에 저장된 데이터를 가져온다.
메모리 관리자는 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근할 때마다 상대 주소값에 재배치 레지스터 값을 더하여 절대 주소를 구한다.
단일 프로그래밍 환경에서의 메모리 할당
1. 메모리 오버레이
메모리 오버레이는 하나의 메모리에 여러 프로그램을 겹겹이 쌓아놓고 실행하는 것을 말한다. 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 실행한다.
2. 스왑
메모리가 모자라서 쫓겨난 프로세스는 저장장치의 특별한 공간에 모아두는데 이를 스왑 영역이라고 한다. 그리고 스왑 영역에서 메모리로 데이터를 가져오는 작업은 스왑인, 메모리에서 스왑 영역으로 데이터를 내보내는 작업은 스왑아웃이라고 한다. 스왑 영역은 메모리 관리자가 관리한다.
다중 프로그래밍 환경에서의 메모리 할당
1. 메모리 분할 방식
- 가변 분할 방식 : 프로세스의 크기에 따라 메모리를 나누는 것이다.
- 고정 분할 방식 : 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것이다.
가변 분할 방식의 장점 및 단점
프로세스를 한 덩어리로 처리하여 하나의 프로세스를 연속된 공간에 배치한다. 하지만 모메리 관리가 복잡해진다. 예를들어, 18KB와 17KB의 프로세스를 실행하고 종료한다면 각각 빈공간이 생긴다. 이때 19KB가 넘는 프로세스가 메모리에 올라오려고 한다면 빈 공간이 떨어져 있기 때문에 올라올 수 없다.
고정 분할 방식의 장점 및 단점
고정 분할 방식은 메모리를 일정한 크기로 나누어 관리하기 때문에 메모리 관리가 수월하다. 하지만 쓸모없는 공간으로 메모리 낭비가 발생할 수 있다. 즉 일정하게 나누어진 공간보다 작은 프로세스가 올라올 경우 메모리 낭비가 발생한다.
2. 외부 단편화
물리 메모리에 프로세스 A, B, C, D, E를 순서대로 배치했을 때 프로세스 B와 D가 종료되면 18KB와 17KB의 빈 공간이 생긴다. 이후 18KB보다 큰 프로세스가 들어오면 적당한 공간이 없어 메모리를 배정하지 못한다. 가변 분할 방식에서 발생하는 이러한 작은 빈 공간을 외부 단편화라고 한다.
가변 분할 방식에서는 외부 단편화로 인한 문제를 해결하기 위해 메모리 배치 방식이나 조각 모음을 사용한다. 메모리 배치 방식은 작은 조각이 발생하지 않도록 프로세스를 배치하는 것이며, 조각 모음은 조각이 발생했을 때 작은 조각들을 모아서 하나의 큰 덩어리로 만드는 작업이다.
3. 내부 단편화
일정하게 나뉜 메모리의 크기보다 작은 프로세스가 배치될 경우 낭비되는 공간이 생기는 것이 내부 단편화이다.
'Develop > Cs' 카테고리의 다른 글
[CS] 프로세스 동기화 (0) | 2025.02.11 |
---|---|
[CS] 프로세스와 스레드 (1) | 2025.01.17 |
[cs] HTTP의 발전 과정 (0) | 2024.10.28 |
[Cs] 컨텍스트 스위칭 (0) | 2023.01.13 |