우봉수
2023. 5. 2. 01:07
2023. 5. 2. 01:07
배경지식
- 프로그램이 실행되기 위해서는 메모리로 반입되어 프로세스 내에 배치되어야 한다.
- 메인 메모리와 레지스터는 cpu가 직접 접근할 수 있는 유일한 저장장치이다.
- 메모리 하드웨어는 주소, 읽기 요청, 쓰기 요청이 가능해야 한다.
- 메인 메모리와 CPU레지스터 사이에 캐시가 존재한다.
메모리 주소 바인딩 시점 3가지
- 컴파일 시간 바인딩: 컴파일시 메모리 주소를 정하고 생성 되는 이진코드
- 이는 절대 코드라고 한다
- 만약 해당 위치가 변경되어야 한다면 다시 컴파일 되어야 한다.
- 적재 시간 바인딩: 프로세스가 메모리 내 어디로 올라오게 될지 컴파일 시점에서 알 수 없을 때 컴파일러가 만드는 이진 코드
- 재배치 가능 주소
- 메인 메모리로 실제 적재되는 순간에 바인딩이 이루어짐
- 실행 시간 바인딩: 실행 중에 메모리 위치 변경(메모리 참조가 일어 날때)
사용자 프로그램 처리의 여러 단계
논리 대 물리 주소 공간
- 논리 주소: CPU에 의해 생성되는 가상 주소 (논리 주소는 연속적으로 할당)
- 물리 주소: 메모리 장치에서 인식되는 주소 (물리 주소는 연속적으로 할당 되지 않음 그때 그때 빈 공간 할당)
- 프로그램 실행 중에는 가상 주소를 물리 주소로 바꾸어주어야 한다.
- 하드웨어 장비 메모리 관리기(MMU) 를 통해 작업
- 재배치 레지스터를 사용하여 CPU와 메모리 사이에서 주소를 변환
- 논리적인 주소를 매우 빠른 속도로 물리적인 주소로 바꿔주는 장치
- 컴파일 시간과 적재 시간 바인딩 기법에서는 동일하지만 실행 시간 바인딩 에서는 서로 다르다.
- 사용자 프로그램은 논리 주소만을 다루고 절대로 실제 물리 주소를 다룰 수 없다.
동적 링킹, 정적 링킹
- 정적 링킹: 로더가 시스템 라이브러리와 프로그램 코드를 결합하여 이진 프로그램 이미지 생성 정적 라이브러리를 이용할 때 사용
- 동적 링킹: 실행 시간까지 링킹이 연기됨 공유되는 라이브러리를 이용할때 사용
- 루틴이 필요한 경우에만 적재되기 때문에 선호되는 방식
기본 스와핑
- 프로세스가 메모리에서 보조 저장장치로 스왑(아웃, 인) 되는 것
- 스왑 아웃(롤 아웃): 메모리 → 보조 저장장치
- 스왑 인(롤 인): 보조 저장장치 → 메모리
- 총 전송 시간은 스왑 되는 메모리의 양의 비례한다.
- 스왑 아웃된 프로세스는 다시 스왑 인 될 때 같은 물리 주소에 적재되지 않을 수도 있다.
- 현대 운영체제는 기본 스와핑을 사용하지 않는다.
- 초기 운영체제는 메모리가 부족하는 문제가 잦고 이를 해결할 고급 기법이 존재하지 않았기에 메인 메모리를 보조 저장 장치로 옮길 필요가 있었다.
스와핑의 메모리 효율
- 메모리 사용 효율이 좋지 않아 이를 해결 하기 위해 페이징 기법이 생겼다.
스와핑을 포함한 문맥 교환 시간
- 프로세스의 크기에 비례하여 문맥 교환 시간이 길어진다.
- 함부로 Swap out을 한다면 데이터 일관성을 해칠 수 있기 때문에
- 이중 버퍼링 기법(작업을 따로 버퍼에 저장하고 끝나면 반영하는 방식)을 사용하게 되어 (오버 헤드)문맥 교환 시간이 늘어나게 된다.
- 다음에 실행시킬 프로세스가 메모리에 없다면 프로세스 하나를 스왑 아웃 시키고 목표 프로세스를 스왑인 해야 한다.
- 추가 제약
- 기존 프로세스의 I/O 작업이 끝나지 않았다면 스와핑이 불가능 하다.
모바일 시스템에서의 스와핑
- 보통은 지원되지 않음
- 플래시 메모리 기반으로 적은 공간을 가지고 쓰기 사이클의 횟수가 제한적
- 메모리 확보를 위해 다른 방법 사용
- IOS에서는 앱이 자발적으로 메모리를 반환할 것을 요구한다.
- Android에서는 IOS와 마찬가지로 가용 메모리가 적을 경우 앱을 종료시키지만 추가로 빠르게 재시작 시킬 수 있도록 앱 상태를 플래시에 기록한다.
연속 메모리 할당
- 메인 메모리는 운영체제와 사용자 프로세스 모두 지원해야 한다.
- 메인 메모리를 2개로 분할
- 상주하는 운영체제, 보통 인터럽트 벡터와 함께 메모리 앞쪽에 위치
- 사용자 프로세스는 그 이후 영역에 배치한다
다중 분할 할당
- 분할의 개수가 다중 프로그래밍의 정도를 제한
- 가변분할: 효율을 위하여 크기를 조절
- Hole: 가용 메모리 블록에서 빈 부분
- 프로세스가 도착할 때 프로세스를 포함할 만큼 큰 Hole에서 메모리를 할당 받는다.
동적 메모리 할당 문제
- 최초 적합(First-fit): 충분히 큰 최초의 hole을 할당
- 최적 적합(Best-fit): 충분히 큰 가장 작은 hole을 할당
- 시간은 오래 걸리지만 메모리를 효율적으로 관리 가능
- 최악 접합(Worst-fit): 가장 큰 hole을 할당
- 최초 적합과 최적 접힙이 최악 적합 보다 속도와 공간 이용률 측면에서 더 좋다.
단편화
- 외부 단편화: 프로세스들이 메모리에 적재되고 제거되면서 생성된 작은 자유 공간(hole)들
- 밀집(compaction)작업으로 줄이는 것이 가능: 주 기억 장치에서 사용 되지 않은 공간을 한 곳으로 모으는 것
- 내부 단편화: 홀에서 다른 프로세스에게 공간을 할당 하고 남은 공간
- 최초 적합에 대해 N 블록이 할당된다면 0.5N개의 블럭이 단편화로 사용할 수 없게 된다. (50% 규칙)
세그먼테이션
- 가변적인 메모리 공간(세그먼트)를 관리하는 기법
- 세그먼트 구조
- <segment-number, offset> 2tuple 구조
- 세그먼트 테이블 (메인메모리에 존재하는 세그먼트 정보가 새겨진 테이블)
- 물리적 주소와 논리적 주소가 둘다 연속적이지 않기 때문에 대응시켜주는 표가 필요하기 때문에 존재.
- 세그먼트가 메인메모리에 존재한다면 유효 세그먼트 그렇지 않다면 불법 세그먼트
- read/write/execute 특권 정보
페이징
- 크기가 고정적인 메모리 공간을 관리하는 기법
- 페이지 테이블을 통해 논리적 주소에서 물리적 주소를 찾아간다.
- 평균적으로 n/2의 크기가 낭비가 된다.
- 주소변환 기법: (비트 구성(32) = 페이지 크기(n) + 페이지 갯수(32-n))
- Page offset: 페이지 크기가 커진다면
- 페이지 크기가 클수록 입출력의 속도가 빨라진다.
- 가용 공간이 늘어난다.
- 남는 공간이 많이 생기게 된다. (내부 단편화가 심해진다)
- Page number: 페이지 갯수