저장 용량을 늘리면 작업 속도가 빨라지지만 일정 수준 이후에는 그 차이가 작아집니다.
CPU의 메모리는 RAM이므로 메모리 관리는 성능에 큰 영향을 미칩니다.
1. 스토리지 관리 개요
von Neumann 구조에서 메모리는 유일한 작업 공간이며 모든 프로그램은 메모리에 로드된 경우에만 실행될 수 있습니다.
1-1 기억을 이해하다
메모리는 1바이트 크기로 분할되고 분할된 영역은 주소로 분할됩니다.
CPU에서 메모리 액세스 속도는 레지스터 액세스 속도보다 몇 배 더 느립니다.
이 차이를 극복하기 위해 CPU에 캐시를 만들고 메모리의 특정 부분을 미리 만들어서 작동하도록 합니다.
1-2 메모리 관리 이중성
메모리 관리 시스템(MMS)은 복잡한 메모리 관리를 처리합니다.
시분할 시스템에서는 운영 체제를 포함한 모든 응용 프로그램이 메모리에서 로드되고 실행되기 때문에 메모리 관리가 복잡합니다.
프로세스는 메모리를 독점하려고 하고 메모리 관리자는 메모리를 효율적으로 관리하려고 합니다. 메모리 관리 이중성그것은 말한다.
1-3 소스 코드 번역 및 실행
컴퓨터 운영 프로그램은 프로그래밍 언어로 작성되고 작성된 프로그램은 일반적으로 컴파일러를 사용하여 실행 가능한 코드로 변환됩니다.
저수준 언어: 기계어, 어셈블리어
고급 언어: C, JAVA
고급 언어로 작성된 코드를 기계어로 번역하는 방법에는 두 가지가 있습니다.
- 컴파일러: 번역 직후 실행(C, JAVA)
- 인터프리터: 소스 코드를 한 줄씩 번역 및 실행(Python, Javascript)
- 오류 감지: 실행 중에 문제가 없도록 오류를 찾습니다.
- 소스 코드 최적화: 코드를 최적화하여 실행 속도를 높입니다.
소스 코드 -> 컴파일러 -> 개체 코드 -> 링커 -> 실행
1-4 스토리지 관리 작업
크게 get, place, replace로 나뉜다.
- 메모리 가져오기: 실행할 프로세스와 데이터를 메모리로 가져옵니다. 좀 가져와
- 스토리지: 가져온 프로세스와 데이터를 어디에 둘지 결정하는 작업입니다. 배치하기 전에 잘라야 하는 크기가 중요합니다. 같은 크기로 쪼개는 것을 페이징이라고 하고, 프로세스의 크기로 쪼개는 것을 세그먼테이션이라고 합니다.
- 메모리 재할당: 새 프로세스를 가져와야 하는데 메모리가 가득 찬 경우 메모리에 있는 프로세스를 디스크로 옮겨 새 프로세스를 가져와야 합니다.
2. 메모리 주소
메모리 주소는 물리 주소와 논리 주소로 나뉩니다.
2-1 32비트 CPU와 64비트 CPU의 차이점
CPU에서 비트는 한 번에 처리할 수 있는 최대 데이터 크기를 의미합니다.
CPU의 비트 수는 메모리 주소 공간의 크기와도 관련이 있으며 32비트 CPU는 최대 4GB의 메모리를 사용할 수 있습니다.
64비트 CU는 최대 2^64-1의 주소 공간을 제공하므로 거의 무제한의 메모리를 사용할 수 있습니다.
메모리의 주소 공간을 물리 주소 공간이라고 하고, 사용자 입장에서 본 주소 공간을 논리 주소 공간이라고 합니다.
2-2 논리 및 물리 주소
물리적 주소는 메모리에서 본 주소(메모리 주소 레지스터에서 사용하는 주소)입니다.
논리 주소는 시작점이 0으로 설정될 때 사용자 프로세스에 표시되는 주소입니다.
물리적 주소는 프로그램이 실행될 때마다 변경됩니다.
프로세스가 논리 주소로 실행되면 메모리 관리 장치(MMU)는 이를 물리 주소로 변환합니다.
3. 단일 프로그래밍 환경에서의 메모리 매핑
3-1 메모리 오버레이
프로그램의 크기가 실제 메모리보다 크면 전체 프로그램을 메모리로 가져오는 대신 프로그램을 적절한 크기로 잘라내는 기술이 사용됩니다. 메모리 오버레이그것은 말한다.
제한된 메모리에서 메모리보다 큰 프로그램을 실행할 수 있습니다. 이것이 가상 메모리 시스템의 기본 개념입니다.
전체 프로그램이 아닌 프로그램의 일부만 메모리에 로드된 경우에도 실행할 수 있습니다.
3-2 교환
메모리 부족으로 인해 쫓겨난 프로세스는 저장 장치의 특정 영역에 수집됩니다. 교환 지역 그것은 말한다.
영역은 저장 및 검색 프로세스를 통해 관리됩니다.
4. 다중 프로그래밍 환경에서의 메모리 할당
가장 큰 문제는 프로세스의 크기가 다르기 때문에 메모리 할당 및 사용입니다.
4-1 메모리 파티셔닝
- 가변 분할 방법: 프로세스의 크기에 따라 메모리를 분할합니다. 연속된 공간에 프로세스를 배치할 수 있지만 메모리 관리가 복잡하다는 단점이 있습니다.
- 고정 파티셔닝 방식: 프로세스의 크기와 상관없이 메모리를 같은 크기로 분할한다. 메모리 관리가 편리한 장점이 있지만 프로세스가 여러 위치로 분할될 수 있다는 단점이 있습니다.
프로세스가 스왑 공간에 있더라도 실행하는 데 문제가 없으므로 최신 운영 체제의 메모리 관리는 고정 분할 방법을 사용합니다.
4-2 변수 분할의 특성
프로세스 크기에 따른 메모리 할당 방법 분할 메모리 관리 기술 그것은 말한다.
4-3 고정 파티션 스토리지 관리
고정 분할 방법을 사용하여 물리적 메모리를 분할하는 방법입니다. 페이징 메모리 관리 기술 그것은 말한다. 책의 모든 페이지가 같은 크기이기 때문에 그렇게 불립니다.
특정 크기의 메모리보다 작은 프로세스를 프로비저닝하면 내부 조각화로 알려진 메모리 낭비가 발생합니다.
4-4 친구 시스템
가변 파티션 시스템의 외부 조각화를 완화하는 방법으로 버디 시스템이 있습니다.
가변 분할 방식과 고정 분할 방식의 중간 구조입니다.
- 프로세스의 크기와 일치하도록 메모리를 반으로 나누고 프로세스를 메모리에 배치합니다.
- 공유 메모리의 각 영역에는 하나의 프로세스만 포함될 수 있습니다.
- 프로세스가 끝나면 주변의 빈 조각과 병합되어 하나의 큰 덩어리를 형성합니다.
효율면에서는 버디제, 고정피치 방식과 유사하지만 고정피치 방식이 단순하기 때문에 고정피치 방식이 많이 사용된다.
5. 공유 컴파일 및 메모리 관리
5-1 분할 컴파일
여러 소스 코드를 개별적으로 단일 실행 파일로 컴파일하는 것을 분할 컴파일이라고 합니다.
5-2 변수 및 메모리 할당
컴파일 과정에서 가장 중요한 부분은 메모리를 저장하고 정리하는 것입니다.
일반적으로 char – 1B, int – 4B, float – 8B를 사용한다.
변수를 사용할 수 있는 영역을 스코프(scope)라고 하며 시작 주소만 주면 자동으로 크기가 결정됩니다.