메모리 관리

Memory management

메모리 관리시스템 메모리에 적용되는 리소스 관리의 한 형태다.메모리 관리의 필수 요건은 그들의 요청에 따라 메모리의 일부를 프로그램에 동적으로 할당하고 더 이상 필요하지 않을 때 다시 사용할 수 있도록 하는 방법을 제공하는 것이다.이것은 한 개 이상의 프로세스가 언제든지 진행 중인 모든 고급 컴퓨터 시스템에 매우 중요하다.[1]

메모리 관리의 효율성을 높이는 몇 가지 방법이 고안되었다.가상 메모리 시스템은 프로세스에서 사용하는 메모리 주소를 실제 물리적 주소와 분리하여 프로세스 분리를 허용하고 페이징 또는 보조 스토리지로의 스와핑을 사용하여 사용 가능한 RAM의 양 이상으로 가상 주소 공간의 크기를 증가시킨다.가상 메모리 관리자의 품질은 전체 시스템 성능에 광범위한 영향을 미칠 수 있다.

OS/360과 후계자와 같은 일부 운영 체제에서는 메모리가 운영 체제에 의해 관리된다.[2][note 1]유닉스 같은 운영 체제와 같은 다른 운영 체제에서는 메모리를 애플리케이션 수준에서 관리한다.

주소 공간 내의 메모리 관리는 일반적으로 수동 메모리 관리 또는 자동 메모리 관리로 분류된다.

수동 메모리 관리

외부 조각화의 예

할당 요청을 이행하는 작업은 충분한 크기의 미사용 메모리 블록을 찾는 것으로 구성된다.메모리 요청은 힙 또는 프리 스토어라고 하는 대규모 메모리 풀에서[note 2] 일부를 할당함으로써 충족된다.[note 3]주어진 시간에 힙의 일부분은 사용 중이고, 일부는 "무료"(무사용)이므로 향후 할당에 사용할 수 있다.

할당된 메모리 블록 사이에 작은 간격이 많을 때 발생하는 외부 단편화 등 구현을 복잡하게 하는 몇 가지 문제가 있으며, 이는 할당 요청에 대한 사용을 무효화한다.할당자의 메타데이터도 (개별적으로) 작은 할당 크기를 부풀릴 수 있다.이것은 종종 청킹에 의해 관리된다.메모리 관리 시스템은 미결 할당을 추적하여 미결 할당들이 중복되지 않고 메모리가 "잃어버린" 일이 없도록 해야 한다(, "메모리 누출"이 없는 경우).

효율성

구현된 특정 동적 메모리 할당 알고리즘은 성능에 상당한 영향을 미칠 수 있다.디지털 장비 주식회사가 1994년에 실시한 연구는 다양한 할당자에 대한 간접비를 보여준다.단일 메모리 슬롯을 할당하는 데 필요한 최저 평균 명령 경로 길이는 52(다양한 소프트웨어에 대한 명령 수준 프로파일러로 측정됨)이었다.[1]

구현

할당의 정확한 위치를 미리 알 수 없기 때문에 메모리는 주로 포인터 참조를 통해 간접적으로 접근한다.메모리 영역을 구성하고 청크를 할당 및 할당 해제하는 데 사용되는 특정 알고리즘은 커널과 연동되며, 다음 방법 중 하나를 사용할 수 있다.

고정 크기 블록 할당

메모리 풀 할당이라고도 하는 고정 크기 블록 할당은 고정 크기 메모리 블록의 무료 목록(종종 동일한 크기의 모든 목록)을 사용한다.이는 큰 개체를 할당할 필요가 없는 단순한 임베디드 시스템에 잘 작동하지만 특히 메모리 주소가 긴 조각화에 시달린다.그러나 오버헤드가 현저히 감소하기 때문에 이 방법은 빈번한 할당/배분이 필요하며 비디오 게임에서 자주 사용되는 개체의 성능을 실질적으로 개선할 수 있다.

버디 블록

이 시스템에서 메모리는 한 개 대신 여러 개의 메모리 풀에 할당되는데, 각 풀은 크기가 2인 특정 전력의 메모리 블록이나 다른 편리한 크기 진행의 블록을 나타낸다.특정 크기의 모든 블록은 정렬된 링크된 목록이나 트리에 보관되며, 할당 중에 형성된 모든 새로운 블록은 나중에 사용할 수 있도록 각각의 메모리 풀에 추가된다.사용 가능한 크기보다 작은 크기를 요청하면 사용 가능한 가장 작은 크기를 선택하여 분할한다.결과 부품 중 하나를 선택하고 요청이 완료될 때까지 프로세스를 반복한다.블록이 할당되면, 할당자는 불필요하게 블록이 깨지지 않도록 충분히 큰 블록 중 가장 작은 블록부터 시작할 것이다.블록이 풀리면, 그것은 그것의 친구와 비교된다.둘 다 무료일 경우, 그들은 결합되어 그에 상응하여 더 큰 크기의 버디 블록 목록에 배치된다.

슬래브 할당

이 메모리 할당 메커니즘은 특정 유형 또는 크기의 개체에 적합한 메모리 청크를 사전 할당한다.[3]이러한 청크를 캐시라고 하며 할당자는 사용 가능한 캐시 슬롯의 목록만 추적하면 된다.개체를 구성하면 사용 가능한 캐시 슬롯 중 하나가 사용되며 개체를 해체하면 사용 가능한 캐시 슬롯 목록에 다시 슬롯이 추가된다.이 기법은 메모리 단편화를 완화하고, 어떤 오픈 슬롯으로도 충분하기 때문에 메모리의 적절한 부분을 검색할 필요가 없기 때문에 효율적이다.

스택 할당

Microsoft Windows뿐만 아니라 많은 Unix와 유사한 시스템들이라는 기능을 구현한다.alloca힙 기반과 유사한 방식으로 스택 메모리를 동적으로 할당하는 경우malloc컴파일러는 일반적으로 스택 포인터를 조작하는 삽입된 명령으로 변환한다.[4]이렇게 할당된 메모리를 수동으로 해제할 필요는 없지만, 호출한 기능이 해제되면 자동으로 해제되기 때문이다.alloca반품, 오버플로 위험이 있다.그리고 alloca는 많은 시스템에서 볼 수 있지만 POSIX나 C 표준에서는 결코 볼 수 없는 임시 확장이기 때문에 스택 오버플로우 시 동작은 정의되지 않는다.

안전한 버전의 할당은_malloca오류를 보고하는 것은 Microsoft Windows에 존재한다.의 사용을 요한다._freea .[5]gnulib는 오버플로우 시 SEH 예외를 발생시키는 대신, 비록 너무 큰 크기가 감지될 때 malloc을 위임한다.[6]유사한 기능은 의 사용과 같이 수동 회계 및 크기 검사를 사용하여 에뮬레이션할 수 있다.alloca_accountglibc에[7]

자동 메모리 관리

많은 프로그래밍 언어 구현에서 프로그램을 위한 런타임 환경은 서브루틴이 호출될 때 자동 변수라고 불리는 서브루틴의 정전기적이지 않은 로컬 변수에 대해 호출 스택에 메모리를 자동으로 할당하고 서브루틴이 종료될 때 자동으로 그 메모리를 해제한다.특별 선언은 지역 변수가 절차의 호출 사이에 값을 유지하거나 다른 서브루틴에 의해 지역 변수에 접근할 수 있도록 허용할 수 있다.로컬 변수를 자동으로 할당하면 사용 가능한 메모리에 의해 제한된 깊이까지 재귀가 가능하다.

쓰레기 수거

가비지 수집은 프로그램에서 더 이상 사용할 수 없는 개체에 할당된 메모리를 자동으로 감지하고, 할당된 메모리를 사용 가능한 메모리 위치 풀에 반환하는 전략이다.이 방법은 프로그래머가 프로그램에서 메모리 요청과 메모리 릴리즈를 명시적으로 코드화하는 "수동" 메모리 관리와는 대조적이다.자동 가비지 수집은 프로그래머 작업량을 줄이고 특정 종류의 메모리 할당 버그를 방지하는 장점이 있지만, 가비지 수집은 자체 메모리 자원이 필요하며, 프로세서 시간을 위해 응용 프로그램과 경쟁할 수 있다.

가상 메모리가 있는 시스템

가상 메모리는 물리적 하드웨어에서 메모리 조직을 분리하는 방법이다.애플리케이션은 가상 주소를 통해 메모리에서 작동한다.애플리케이션이 특정 가상 메모리 주소에 액세스하려고 시도할 때마다 가상 메모리 주소가 실제 물리적 주소로 변환된다.[8]이러한 방식으로 가상 메모리의 추가는 메모리 시스템과 액세스 방법에 대한 세밀한 제어를 가능하게 한다.

가상 메모리 시스템에서 운영 체제는 프로세스가 메모리에 액세스할 수 있는 방법을 제한한다.메모리 보호라고 불리는 이 기능은 한 프로그램에서 악성 코드나 오작동 코드가 다른 프로그램의 작동을 방해하지 않도록 하기 위해 할당되지 않은 메모리에 읽기 또는 쓰기를 허용하지 않는 데 사용될 수 있다.

특정 프로세스에 할당된 메모리는 일반적으로 격리되어 있더라도 프로세스에서 정보를 공유할 필요가 있다.공유 메모리프로세스통신을 위한 가장 빠른 기법 중 하나이다.

메모리는 일반적으로 액세스 속도에 따라 Primary 스토리지Secondary 스토리지로 분류된다.메모리 관리 시스템은 다른 작업 중에서도 이 두 가지 메모리 수준 간의 정보 이동도 처리한다.

OS/360 및 후속 제품에서의 메모리 관리

IBM System/360은 가상 메모리를 지원하지 않는다.[note 4]작업의 메모리 격리는 선택적으로 보호 키를 사용하여 수행되며, 각 작업에 다른 키(감독자 0 또는 1-15)를 할당한다.OS/360의 메모리 관리는 감독 기능이다.를 사용하여 저장 요청GETMAIN을 사용하여 매크로 및 해방됨FREEMAIN매크로, 이로 인해 감독자(SVC)에게 작업을 수행하도록 요청하게 된다.

OS/360에서는 PCP, MFT, MVT 등의 시스템 생성 방법에 따라 세부 정보가 달라진다.

OS/360 MVT에서, 작업 영역 또는 공유 시스템 대기열 영역(SQA) 내의 하위 할당은 2KB 크기의 배수 영역인 보호 키로 보호되는 영역의 크기인 하위 풀에 기반한다.서브풀의 번호는 0~255번이다.[9]지역 내 하위 풀에는 작업 저장소 보호 또는 감독자 키, 키 0이 할당된다. 하위 풀 0–127은 작업 키를 받는다.처음에는 하위 풀 0만 생성되며, 메모리 요청에 다른 요청이 지정되지 않는 한 모든 사용자 스토리지 요청은 하위 풀 0에서 충족된다.250–255 서브풀은 감독자가 작업을 대신하여 메모리 요청에 의해 생성된다.이들 중 대부분은 키 0을 할당받지만 일부는 작업 키를 얻는다.세부 정보가 훨씬 간단하지만 서브풀 번호는 또한 MFT와 관련이 있다.[10]MFT는 동적 영역 대신 운영자가 다시 정의할 수 있는 고정 파티션을 사용하고 PCP는 단일 파티션만 가지고 있다.

각 하위 풀은 하위 풀 내에서 할당된 메모리 블록과 사용 가능한 메모리 블록을 식별하는 제어 블록 목록에 의해 매핑된다.메모리는 충분한 크기의 여유 영역을 찾거나 하위 풀에 추가 블록을 할당하여 작업의 영역 크기까지 할당한다.할당된 메모리 영역의 전부 또는 일부를 해제할 수 있다.[11]

OS/VS1에 대한 세부사항은 MFT 및 MVT와 유사하며[12], 페이지 크기가 4KiB인 것을 제외하고 OS/VS2에 대한 세부사항은 MVT와 유사하다.OS/VS1 및 OS/VS2의 경우 공유 시스템 대기열 영역(SQA)은 페이지할 수 없다.

MVS에서 주소 공간에는 추가 페이지 가능 공유 영역, 공통 저장 영역(CSA) 및 추가 개인 영역인 시스템 작업 영역(SWA)이 포함된다.또한, 저장 키 0-7은 모두 특권 코드에 의해 사용되도록 예약되어 있다.

참고 항목

메모들

  1. ^ 그러나 언어 프로세서의 런타임 환경은 예를 들어 스택을 구현하기 위해 운영 체제에서 동적으로 획득한 메모리를 세분화할 수 있다.
  2. ^ OS/360과 같은 일부 운영 체제에서는 무료 스토리지를 다양한 방식으로 세분화할 수 있다. 예를 들어 OS/360의 서브풀, 라인 아래, 라인 위, z/OS의 막대 위.
  3. ^ 관련 없는 힙 데이터 구조와 혼동하지 마십시오.
  4. ^ 모델 67을 제외하고

참조

  1. ^ a b Detlefs, D.; Dosser, A.; Zorn, B. (June 1994). "Memory allocation costs in large C and C++ programs" (PDF). Software: Practice and Experience. 24 (6): 527–542. CiteSeerX 10.1.1.30.3073. doi:10.1002/spe.4380240602. S2CID 14214110.
  2. ^ "Main Storage Allocation" (PDF). IBM Operating System/360 Concepts and Facilities (PDF). Systems Reference Library (First ed.). IBM Corporation. 1965. p. 74. Retrieved Apr 3, 2019.
  3. ^ Silberschatz, Abraham; Galvin, Peter B. (2004). Operating system concepts. Wiley. ISBN 0-471-69466-5.
  4. ^ alloca(3)Linux Programmer's Manual – Library Functions
  5. ^ "_malloca". Microsoft CRT Documentation.
  6. ^ "gnulib/malloca.h". GitHub. Retrieved 24 November 2019.
  7. ^ "glibc/include/alloca.h". Beren Minor's Mirrors. 23 November 2019.
  8. ^ Tanenbaum, Andrew S. (1992). Modern Operating Systems. Englewood Cliffs, N.J.: Prentice-Hall. p. 90. ISBN 0-13-588187-0.
  9. ^ OS360Sup, 페이지 82-85.
  10. ^ OS360Sup, 페이지 82.
  11. ^ IBM Corporation (May 1973). Program Logic: IBM System/360 Operating System MVT Supervisor (PDF). pp. 107–137. Retrieved Apr 3, 2019.
  12. ^ OSVS1Dig, 페이지 2.37-2.39, VS1 스토리지 하위 풀.
OS360Sup
OS Release 21 IBM System/360 Operating System Supervisor Services and Macro Instructions (PDF). Systems Reference Library (Eighth ed.). IBM. September 1974. GC28-6646-7.
OSVS1Dig
OS/VS1 Programmer's Reference Digest Release 6 (PDF). Systems (Sixth ed.). IBM. November 1975. GC24-5091-5.

추가 읽기

외부 링크