참조 카운트

Reference counting

컴퓨터 과학에서 참조 카운팅은 객체, 메모리 블록, 디스크 공간 등의 리소스에 대한 참조, 포인터 또는 핸들 수를 저장하는 프로그래밍 기법입니다.

가비지 수집 알고리즘에서는 참조 수를 사용하여 더 이상 필요하지 않은 개체의 할당을 해제할 수 있습니다.

장점과 단점

가비지 수집 추적에 비해 참조 카운트가 더 이상 참조할 수 없는 경우 개체가 수집 주기 동안 길게 일시 중지되지 않고 모든 개체의 수명이 명확하게 정의된 상태에서 증분 방식으로 회수된다는 것이 가장 큰 장점입니다.실시간 애플리케이션이나 메모리가 제한된 시스템에서는 응답성을 유지하기 위해 이 기능이 중요합니다.참조 카운트는 구현하기 가장 간단한 메모리 관리 형태이기도 합니다.또한 운영 체제 개체와 같은 비메모리 리소스를 효율적으로 관리할 수 있습니다(가비지 수집 시스템의 추적은 최종자[citation needed]사용하지만 회수 지연으로 인해 문제가 발생할 수 있습니다).가중 참조 수는 분산 시스템을 가비지 수집하기 위한 좋은 솔루션입니다.

1985년 석사 [1]논문의 순환 목록 예.직사각형은 기준 카운트와 함께 콘스 쌍을 나타냅니다.착신 좌측 상단 포인터가 삭제되어도 모든 카운트는 0보다 큰 채로 있습니다.

활성 개체 집합이 사용 가능한 [citation needed]메모리의 대부분을 채우는 경우 가비지 수집 주기 추적이 너무 자주 트리거되므로 효율적으로 [citation needed]사용하려면 추가 공간이 필요합니다.기준계수 성능은 총 여유공간이 [2]감소하더라도 저하되지 않습니다.

참조 카운트는 다른 런타임 최적화에 대한 입력으로 사용할 수도 있습니다.예를 들어, 많은 기능적 프로그래밍 언어 등 불변의 객체에 크게 의존하는 시스템은 빈번한 [citation needed]복사로 인해 효율 저하를 겪을 수 있습니다.단, 컴파일러(또는 런타임시스템)가 특정 오브젝트에 참조가1개밖에 없는 것을 알고 있는 경우(많은 시스템에서와 마찬가지로), 유사한 새로운 오브젝트가 작성되는 동시에 참조가 손실되는 경우(string append 문과 같이)str ← str + "a")는 원래 객체의 변환으로 작업을 대체할 수 있습니다.

nav 형식의 참조 카운트는 트레이스 가비지 컬렉션에 비해 크게 두 가지 단점이 있습니다.이 두 가지 단점은 모두 개선을 위해 추가 메커니즘이 필요합니다.

  • 빈번한 업데이트는 비효율의 원인이 되고 있습니다.가비지 컬렉터를 추적하는 것은 컨텍스트 스위칭 및 캐시 라인 장애로 효율성에 심각한 영향을 미칠 수 있지만 오브젝트에 대한 액세스는 지속적으로 수행되지만 수집은 비교적 빈도가 낮습니다.또한 참조 카운트를 수행하려면 메모리 관리 대상 모든 개체가 참조 카운트를 위한 공간을 예약해야 합니다.가비지 컬렉터를 추적하는 경우 이 정보는 해당 개체를 참조하는 참조에 암묵적으로 저장되므로 공간을 절약할 수 있습니다.다만, 가비지 컬렉터(특히 증분)를 추적하려면 다른 목적으로 추가 공간이 필요할 수 있습니다.
  • 위에서 설명한 순진한 알고리즘은 자신을 직접 또는 간접적으로 참조하는 개체인 참조 주기를 처리할 수 없습니다.기준 카운트에만 의존하는 메커니즘은 기준 카운트가 0이 아닌 상태로 유지되도록 보장되므로 삭제 대상 개체의 주기적 체인을 고려하지 않습니다(그림 참조).이 문제에 대처하는 방법은 존재하지만 참조 카운트의 오버헤드와 복잡성도 증가할 수 있습니다.반면, 이러한 방법은 사이클을 형성할 가능성이 있는 데이터(종종 모든 데이터의 작은 서브셋)에만 적용하면 됩니다.이러한 방법 중 하나는 약한 참조를 사용하는 것이며, 다른 하나는 청소를 위해 자주 호출되지 않는 마크 스위프 알고리즘을 사용하는 것입니다.

게다가 메모리가 빈 리스트로부터 할당되어 있는 경우, 참조 카운트는 로컬성이 저하됩니다.참조 개수만으로는 캐시 성능을 향상시키기 위해 개체를 이동할 수 없으므로 고성능 수집기는 추적 가비지 수집기도 구현합니다.대부분의 구현(PHP 및 Objective-C의 구현 등)은 복사 [3]개체를 구현하지 않기 때문에 캐시 성능이 저하됩니다.

그래프 해석

가비지 수집 방식을 다룰 때는 종종 참조 그래프를 떠올리는 것이 도움이 됩니다. 참조 그래프는 정점이 객체이고 A가 B에 대한 참조를 보유하고 있는 경우 객체 A에서 객체 B까지의 가장자리가 있는 방향 그래프입니다.또한 런타임 시스템에 의해 유지되는 로컬 변수와 참조를 나타내는 특별한 정점 또는 정점이 있으며, 에지는 이러한 노드에 도달하지 않습니다. 단, 에지는 이들 노드에서 다른 노드로 이동할 수 있습니다.

이 문맥에서 물체의 단순한 참조 카운트는 그 정점의 도수입니다.정점을 삭제하는 것은 객체를 수집하는 것과 같습니다.이는 정점에 들어오는 가장자리가 없는 경우에만 수행될 수 있으므로 다른 정점의 외부 정도에 영향을 주지 않지만 다른 정점의 내부 정도에 영향을 미칠 수 있으므로 결과적으로 해당 개체도 0이 될 경우 수집됩니다.

특수 정점을 포함하는 연결된 구성 요소에는 수집할 수 없는 개체가 포함되어 있지만 그래프의 다른 연결된 구성 요소에는 가비지만 포함되어 있습니다.참조 카운팅 가비지 수집 알고리즘이 실장되어 있는 경우, 이러한 가비지 컴포넌트 각각에 적어도1개의 사이클이 포함되어 있을 필요가 있습니다.그렇지 않은 경우, 참조 카운트(즉, 착신 에지의 수)가 제로로 떨어지면 곧바로 수집됩니다.

업데이트의 비효율성 처리

기준이 생성되거나 폐기될 때마다 기준 카운트를 증가 또는 감소시키면 성능이 크게 저하될 수 있습니다.작업에 시간이 걸릴 뿐만 아니라 캐시 성능을 저하시키고 파이프라인 버블이 발생할 수 있습니다.리스트 길이 계산과 같은 읽기 전용 작업에서도 참조 카운트를 단순하게 하여 참조 업데이트를 위해 대량의 읽기 및 쓰기가 필요합니다.

하나의 간단한 기술은 컴파일러가 근처의 많은 참조 업데이트를 하나로 결합하는 것입니다.이는 특히 생성 및 빠르게 파괴되는 참조에 효과적입니다.그러나 너무 이른 프리(free)를 피할 수 있도록 결합된 업데이트를 올바른 위치에 배치하는 데 주의를 기울여야 합니다.

Deutsch-Bobrow 참조 카운트 방법은 대부분의 참조 카운트 업데이트가 실제로 로컬 변수에 저장된 참조에 의해 생성된다는 사실을 활용합니다.이러한 참조는 무시되고 데이터 구조 내의 참조만 카운트되지만 참조 카운트가 0인 개체를 삭제하기 전에 시스템은 스택 스캔을 통해 확인해야 하며 이 오브젝트에 대한 다른 참조가 아직 존재하지 않음을 등록해야 합니다.

Henry Baker가 고안한 또 다른 기법은 지연 [4]증분을 수반하며, 여기서 로컬 변수에 저장된 참조는 해당 참조 카운트를 즉시 증가시키지 않고 대신 필요할 때까지 지연시킨다.이러한 참조가 신속하게 파기되면 카운터를 갱신할 필요가 없습니다.이것에 의해, 단기간 참조에 관련하는 대량의 갱신이 불필요하게 됩니다(상기의 리스트 길이 카운트 예 등).그러나 이러한 참조가 데이터 구조에 복사될 경우 지연된 증분 작업을 그 시점에 수행해야 합니다.또한 개체 수가 0으로 떨어지기 전에 지연된 증분 작업을 수행하는 것이 중요합니다.

Levanoni와 Petrank[5][6]카운터 업데이트에 대한 오버헤드를 극적으로 줄였습니다.또한 중복 참조 수 업데이트의 대부분을 병합하는 업데이트 병합 방법이 도입되었습니다.지정된 실행 간격 동안 여러 번 업데이트되는 포인터를 고려합니다.먼저 물체를 가리킵니다.O1, 그 후 오브젝트로O2인터벌의 마지막에 어떤 오브젝트를 가리킵니다.On참조 카운트 알고리즘은 일반적으로 실행됩니다.rc(O1)--,rc(O2)++,rc(O2)--,rc(O3)++,rc(O3)--, ...,rc(On)++그러나 이러한 업데이트의 대부분은 장황합니다.인터벌의 마지막에 참조 카운트를 적절히 평가하려면 , 다음의 조작을 실시하면 충분합니다.rc(O1)--그리고.rc(On)++나머지 업데이트는 장황합니다.

Levanoni와 Petrank는 2001년에 레퍼런스 카운팅 수집기에서 이러한 업데이트 결합을 사용하는 방법을 보여 주었다.업데이트 병합을 새 개체에 대한 적절한 처리와 함께 사용하면 일반적인 Java 벤치마크에 대한 카운터 업데이트의 99% 이상이 제거됩니다.또한 병렬 프로세서에서 포인터를 업데이트하는 동안 원자적인 작업이 필요하지 않습니다.마지막으로 미세 [7]동기화만 사용하는 멀티스레드 애플리케이션과 동시에 실행할 수 있는 확장 알고리즘을 제시했습니다.

2003년[8] 블랙번과 맥킨리의 숨은 기준 계수법은 포인터 돌연변이의 대부분이 어린 개체에서 발생한다는 것을 관찰하면서 지연 기준 계수와 복사 묘목을 결합했다.이 알고리즘은 참조 카운트의 포즈 시간이 짧은 가장 빠른 세대 복사 수집기에 필적하는 throughput을 실현합니다.

기준 주기 처리

참조 사이클을 처리하는 가장 확실한 방법은 시스템을 설계하여 참조 사이클을 생성하지 않도록 하는 것입니다.시스템에서는 참조 사이클을 명시적으로 금지할 수 있습니다.하드링크가 있는 파일시스템은 이 처리를 하는 경우가 많습니다.를 들어 코코아 프레임워크는 부모-자녀 관계에 대해서는 "강력한" 참조를, 자녀-부모 [9]관계에 대해서는 "약한" 참조를 사용할 것을 권장한다.

또한 시스템은 어떤 방법으로든 사이클을 허용하거나 수정하도록 설계될 수도 있습니다.개발자는 데이터 구조의 참조가 더 이상 필요하지 않을 때 명시적으로 "해체"하도록 코드를 설계할 수 있지만, 이 경우 데이터 구조의 수명을 수동으로 추적해야 합니다.이 기술은 "소유자" 개체를 생성하여 삭제할 수 있습니다. 예를 들어 Graph 개체의 소멸자가 GraphNodes의 가장자리를 삭제하여 그래프의 참조 주기를 끊을 수 있습니다.사이클은 수명이 짧고 순환 가비지가 적은 시스템에서 무시될 수 있으며, 특히 시스템이 가능한 한 순환 데이터 구조를 피하는 방법론을 사용하여 개발된 경우에는 일반적으로 효율성을 희생하여 무시될 수 있다.

또한 컴퓨터 과학자들은 데이터 구조 설계를 변경하지 않고도 참조 주기를 자동으로 감지하고 수집하는 방법을 발견했습니다.간단한 해결책 중 하나는 트레이스 가비지 컬렉터를 정기적으로 사용하여 사이클을 회수하는 것입니다.일반적으로 사이클은 비교적 적은 양의 회수 공간을 구성하기 때문에 일반적인 트레이스 가비지 컬렉터를 사용할 때보다 훨씬 적은 빈도로 실행할 수 있습니다.

Bacon은 동일한 이론적 시간 범위를 포함하여 추적 수집기와 유사한 참조 카운트를 위한 주기 수집 알고리즘을 설명합니다.이는 기준 카운트가 0이 아닌 값으로 감소하는 경우에만 사이클을 분리할 수 있다는 관찰을 기반으로 합니다.이 문제가 발생한 모든 오브젝트는 루트목록에 배치되며 프로그램은 정기적으로 루트에서 도달 가능한 오브젝트를 검색하여 사이클을 수행합니다.또한 기준 사이클의 모든 기준 카운트를 감소시키면 모든 기준 카운트가 [10]0이 될 때 수집할 수 있는 사이클이 발견되었음을 알고 있습니다.Paz [11]등에 의한 이 알고리즘의 강화 버전은 Levanoni와 Petrank의 [5][6]업데이트 병합 방법을 사용하여 다른 작업과 동시에 실행하고 효율성을 향상시킬 수 있습니다.

변형형식

다양한 방법으로 단순 기준 카운트를 증가시킬 수 있지만, 종종 근본적으로 다른 방법으로 기준 카운트를 수행함으로써 더 나은 솔루션을 찾을 수 있습니다.여기에서는 참조 카운트에 관한 몇 가지 변형과 그 장점과 단점을 설명한다.

가중 기준 계수

가중치 기준계수에서는 각 기준에는 가중치가 할당되며, 각 오브젝트는 그것을 참조하는 기준의 수가 아니라 그것을 참조하는 기준의 총 가중치를 추적한다.새로 생성된 개체에 대한 초기 참조는 2와 같이16 큰 무게를 가집니다.이 참조가 복사될 때마다 무게의 절반은 새 참조로 이동하고 무게의 절반은 이전 참조로 유지됩니다.총 가중치는 변경되지 않으므로 개체의 참조 수를 업데이트할 필요가 없습니다.

참조를 파기하면 해당 참조의 무게만큼 총 무게가 감소합니다.총 무게가 0이 되면 모든 참조가 파기됩니다.가중치가 1인 참조를 복사하려고 할 경우, 참조는 총 가중치를 더하고 이 새 가중치를 참조에 추가한 후 분할하여 "더 많은 가중치를 얻어야" 합니다.이 경우 다른 방법으로 indirection 참조 오브젝트를 만듭니다.이 오브젝트는 큰 무게로 작성된 후 분할할 수 있습니다.

참조를 복사할 때 참조 수에 액세스할 필요가 없는 속성은 개체의 참조 수가 다른 프로세스, 디스크 또는 네트워크를 통해 액세스 중이므로 액세스 비용이 많이 드는 경우에 특히 유용합니다.또한 참조 카운트를 늘리기 위해 많은 스레드가 참조 카운트를 잠그는 것을 방지하여 동시성을 높일 수 있습니다.따라서 가중 기준 카운트는 병렬, 다중 프로세스, 데이터베이스 또는 분산 애플리케이션에서 가장 유용합니다.

단순 가중치 기준 카운트의 주요 문제는 기준 파괴 시에도 기준 카운트에 액세스해야 하며, 많은 참조가 파괴되면 우리가 방지하고자 하는 것과 동일한 병목 현상이 발생할 수 있다는 것입니다.가중 기준 계수의 일부 적응은 사망 기준에서 활성 기준으로 체중을 이동시킴으로써 이를 회피하려고 한다.

가중 기준 계수는 1987년 베반과 왓슨 & 왓슨에[13] 의해[12] 독립적으로 고안되었다.

간접참조계수

간접 기준 계수의 경우 기준의 출처를 추적할 필요가 있다.이는 객체에 대한 두 가지 참조가 유지된다는 것을 의미합니다. 하나는 호출에 사용되는 직접 참조이고 다른 하나는 확산 트리의 일부를 구성하는 간접 참조입니다. 예를 들어 Dijkstra-Scholten 알고리즘에서는 가비지 컬렉터가 죽은 객체를 식별할 수 있습니다.이 방법을 사용하면 개체가 조기에 폐기되는 것을 방지할 수 있습니다.

사용 예

가비지 컬렉션

수집 알고리즘으로서 참조 트랙으로서 각 객체에 대해 다른 객체가 보유한 참조 수 카운트입니다.개체의 참조 수가 0에 도달하면 개체에 액세스할 수 없게 되어 삭제될 수 있습니다.

개체가 삭제되면 해당 개체에서 참조하는 개체도 참조 수가 줄어듭니다.따라서 하나의 참조를 제거하면 많은 개체가 해방될 수 있습니다.공통적인 변경을 통해 참조 카운트를 증분할 수 있습니다.즉, 참조 카운트가 0이 되는 즉시 오브젝트를 파기하는 대신 참조되지 않은 오브젝트 목록에 추가되어 이 리스트에서1개 또는 여러 항목이 정기적으로 파기됩니다.

단순한 참조 카운트를 사용하려면 빈번한 업데이트가 필요합니다.참조가 파기 또는 덮어쓸 때마다 참조하는 객체의 참조 카운트가 감소하고 참조 카운트가 생성 또는 복사될 때마다 참조하는 객체의 참조 카운트가 증가합니다.

참조 카운트는 개체 그래프의 크기와 느린 액세스 [14]속도 때문에 전체 비증분 추적 가비지 수집에 시간이 너무 많이 걸리는 파일 시스템 및 분산 시스템에서도 사용됩니다.

컴포넌트 객체 모델

Microsoft의 컴포넌트 오브젝트 모델(COM)과 WinRT에서는 참조 카운트를 폭넓게 사용하고 있습니다.실제로 (IUnknown 인터페이스에서) 모든 COM 오브젝트가 제공해야 하는3가지 방식 중 2가지가 참조 카운트를 증가 또는 감소시킵니다.Windows Shell 및 많은 Windows 애플리케이션(MS Internet Explorer, MS Office 및 수많은 서드파티 제품 포함)은 COM을 기반으로 구축되어 있어 대규모 시스템에서 참조 카운트의 실행 가능성을 보여줍니다.

COM에서 참조 카운트를 실시하는 주된 동기 중 하나는 다른 프로그래밍 언어 및 런타임 시스템 간의 상호 운용성을 가능하게 하는 것입니다.클라이언트는 오브젝트의 라이프 사이클을 관리하기 위해 오브젝트 메서드를 호출하는 방법만 알면 됩니다.따라서 클라이언트는 COM 오브젝트의 구현이 사용하는 메모리 할당자에서 완전히 추상화됩니다.전형적인 예로서 COM 개체를 사용하는 Visual Basic 프로그램은 해당 개체가 C++ 할당자 또는 다른 Visual Basic 컴포넌트에 의해 할당되었는지(나중에 할당 해제되어야 하는지)에 관계없이 사용할 수 있습니다.

C++

C++는 기본적으로 참조 카운트를 수행하지 않으므로 사용자가 명시적으로 요청하지 않은 경우 오버헤드가 발생할 수 있는 기능을 추가하지 않는다는 원칙을 충족합니다.공유되지만 소유되지 않은 개체는 참조, 원시 포인터 또는 반복기(포인터의 개념적 일반화)를 통해 액세스할 수 있습니다.

다만, 같은 토큰으로 C++는, 유저가 이러한 기능을 선택할 수 있는 네이티브한 방법을 제공합니다.C++11은 클래스를 통해 참조 카운트의 스마트 포인터를 제공하여 동적으로 할당된 객체의 자동 공유 메모리 관리를 가능하게 합니다.프로그래머는 이것을 ( 통해) 약한 포인터와 함께 사용하여 주기적 의존 관계를 끊을 수 있습니다.동적으로 할당되었지만 공유가 의도되지 않은 오브젝트는 를 사용하여 자동으로 라이프타임을 관리할 수 있습니다.

또한, C++11의 이동 시멘틱스는 함수가 객체를 반환할 때 일반적으로 사용되는 딥 카피를 제거함으로써 참조 카운트를 수정해야 하는 정도를 더욱 줄여주며, 이는 해당 객체의 포인터의 단순한 복사를 허용한다.

코코아(객체-C)

Apple의 Cocoa 및 Coco Touch 프레임워크(및 Core Foundation과 같은 관련 프레임워크)는 COM과 마찬가지로 수동 참조 카운트를 사용합니다.전통적으로 이것은 프로그래머가 수동으로 송신함으로써 실현되었습니다.retain그리고.release 객체에 메시지를 전달하지만 필요에 따라 이러한 메시지를 자동으로 삽입하는 Clang 컴파일러 기능인 Automatic Reference Counting이 iOS 5[15]Mac OS X 10.[16]7에 추가되었습니다.Mac OS X 10.5에서는 참조 카운트의 대체 수단으로 트레이스 가비지 컬렉터가 도입되었지만 OS X 10.8에서는 폐지되어 MacOS [17][18]Sierra.i의 Objective-C 런타임 라이브러리에서 삭제되었습니다.OS는 추적 가비지 컬렉터를 지원하지 않습니다.

델파이

Dellphi는 가비지 수집 언어가 아닙니다.사용자 정의 타입은 수동으로 할당 및 할당 해제해야 하지만 문자열, 다이내믹 어레이, 인터페이스 등 일부 빌트인 타입에 대한 참조 카운트를 사용하여 자동 수집을 제공하여 사용하기 쉽고 범용 데이터베이스 기능을 단순화합니다.내장 타입의 사용 여부는 프로그래머에게 달려 있습니다.Delphi 프로그래머는 C/C++와 같이 낮은 수준의 메모리 관리에 완전히 액세스할 수 있습니다.따라서 델파이의 참조 카운트에 드는 모든 잠재적인 비용은, 필요에 따라서 간단하게 회피할 수 있습니다.

델파이의 다른 형태의 쓰레기 수집보다 참조 카운트가 선호되는 이유 중 일부는 다음과 같다.

  • 신속한 수집과 같은 참조 카운트의 일반적인 이점.
  • 가비지 수집 기본 제공 유형이 모두 재귀적이지 않으므로 실제로 주기가 발생할 수 없거나 발생하지 않습니다.(인터페이스를 사용하면 그러한 시나리오를 작성할 수 있지만, 일반적인 사용법은 아닙니다.)
  • 참조 카운트에 필요한 코드 사이즈의 오버헤드는 매우 작습니다(일반적으로 단일 LOCK INC, LOCK DEC 또는 LOCK XADD 명령에서는 모든 환경에서 원자성을 보증합니다).또한 추적 가비지 컬렉터에 필요한 별도의 제어 스레드는 필요하지 않습니다.
  • 가장 일반적으로 사용되는 가비지 수집 유형인 문자열의 인스턴스는 일반적으로 문자열 조작의 중간 값이기 때문에 수명이 짧습니다.많은 로컬 문자열 사용을 최적화할 수 있지만, 현재 컴파일러는 그렇게 하지 않습니다.
  • 문자열의 참조 카운트는 문자열을 변환하기 전에 확인합니다.이를 통해 변환 전에 참조 카운트1 문자열을 직접 변환하고 더 높은 참조 카운트 문자열을 복사할 수 있습니다.이를 통해 이전 스타일의 파스칼 문자열의 일반적인 동작을 유지하면서 모든 할당에서 문자열을 복사하는 비용을 절감할 수 있습니다.
  • 가비지 수집은 내장된 유형에서만 수행되므로 참조 카운트를 각 데이터 유형을 조작하는 데 사용되는 라이브러리 루틴에 효율적으로 통합할 수 있으므로 참조 카운트의 업데이트에 필요한 오버헤드를 낮게 유지할 수 있습니다.게다가 런타임 라이브러리의 대부분은 수작업으로 최적화된 어셈블러에 있습니다.
  • 문자열 유형은 char 포인터에 캐스트할 수 있으며 이러한 방법으로 고성능 작업을 수행할 수 있습니다.Delphi와 FPC 모두 Pascal에서 RTL을 구현하기 때문에 이는 중요합니다.다양한 다른 자동화된 유형에는 이러한 주조 옵션이 있습니다.

GOBject

GObject 객체 지향 프로그래밍 프레임워크는 취약한 참조를 포함한 기본 유형에 대한 참조 카운트를 구현합니다.기준 증가 및 감소는 스레드 안전을 위해 원자 연산을 사용합니다.높은 수준의 언어에서 GObject에 대한 쓰기 바인딩 작업의 상당 부분은 GObject 참조 카운트를 언어 자체의 메모리 관리 시스템과 함께 작동하도록 조정하는 데 있습니다.

Vala 프로그래밍 언어는 복사량이 많은 문자열 [19]처리와 함께 GObject 참조 카운트를 기본 가비지 수집 시스템으로 사용합니다.

Perl은 또한 순환 참조를 특별히 취급하지 않고 참조 카운트를 사용합니다.단, Perl은 (위의 Cocoa와 C++에서와 같이) 약한 참조를 지원하므로 프로그래머가 사이클 생성을 피할 수 있습니다.

PHP

PHP는 내부 변수 [20]관리에 참조 카운트 메커니즘을 사용합니다.PHP 5.3 이후, Bacon의 상기의 논문으로부터 알고리즘을 실장하고 있습니다.PHP를 사용하면 사용자 수준의 기능을 사용하여 사이클 컬렉션을 켜고 끌 수 있습니다.또한 수동으로 삭제 메커니즘을 실행할 수도 있습니다.

파이썬

Python은 참조 카운트를 사용하고 주기 검출도 제공합니다(또한 [21]회수할 수 있습니다).

Rust는 코드에서 선언된 수명을 사용하여 메모리를 해방합니다.녹이 슬다Rc그리고.Arc구조화.

종류Rc<T>유형의 가치에 대한 공유 소유권을 제공합니다.T,[22] 히프에 할당됩니다.

std::rc:Rc; 구조 Cat { color:문자열, } fn main() {let cat = Cat { color: "black".to_string() }, let cat = Rc:new(cat);}

다람쥐

다람쥐는 사이클 검출과 함께 기준 카운트를 사용합니다.이 작은 언어는 비디오 게임 업계에서는 비교적 잘 알려져 있지 않지만, 참조 카운팅이 실용적이고 효율적일 수 있음을 보여주는 구체적인 예입니다(특히 실시간 환경에서).[citation needed]

TCL

TCL 8은 값(Tcl Obj 구조)의 메모리 관리에 참조 카운트를 사용합니다.TCL의 값은 불변하기 때문에 기준 사이클을 형성할 수 없으며 사이클 검출 방식이 필요하지 않습니다.값을 수정된 복사본으로 대체하는 작업은 일반적으로 참조 수가 공유되지 않음을 나타낼 때 원본이 수정되도록 최적화됩니다.참조는 데이터 구조 수준에서 계산되므로 위에서 설명한 매우 빈번한 업데이트에 관한 문제는 발생하지 않습니다.

조조

Xojo는 (위의 Cocoa와 C++에서와 같이) 약한 참조를 지원하지만, Xojo는 순환을 만드는 것을 피할 수 있습니다.

파일 시스템

많은 파일 시스템은 특정 블록 또는 파일에 대한 참조 수를 유지합니다. 예를 들어, 일반적으로 하드 링크로 알려진 Unix 스타일 파일 시스템의 inode 링크 수.카운트가 0이 되면 파일을 안전하게 할당 해제할 수 있습니다.디렉토리에서 참조를 작성할 수 있지만 일부 Unix에서는 라이브 프로세스로부터의 참조만 허용하며 파일 시스템 계층 외부에 존재하는 파일이 있을 수 있습니다.

레퍼런스

  1. ^ Kevin G. Cassidy (December 1985). The Feasibility of Automatic Storage Reclamation with Concurrent Program Execution in a LISP Environment (PDF) (Master's thesis). Naval Postgraduate School, Monterey/CA. 여기: 페이지 25
  2. ^ Wilson, Paul R. (1992). "Uniprocessor Garbage Collection Techniques". Proceedings of the International Workshop on Memory Management. London, UK: Springer-Verlag. pp. 1–42. ISBN 3-540-55940-X. 섹션 2.1.
  3. ^ Rifat Shahriyar, Stephen M. Blackburn, Xi Yang and Kathryn S. McKinley (2013). "Taking Off the Gloves with Reference Counting Immix" (PDF). 24th ACM SIGPLAN conference on Object Oriented Programming Systems, Languages and Applications. OOPSLA 2013. doi:10.1145/2509136.2509527.{{cite conference}}: CS1 maint: 여러 이름: 작성자 목록(링크)
  4. ^ Henry Baker (September 1994). "Minimizing Reference Count Updating with Deferred and Anchored Pointers for Functional Data Structures". ACM SIGPLAN Notices. 29 (9): 38–43. CiteSeerX 10.1.1.25.955. doi:10.1145/185009.185016. S2CID 14448488.
  5. ^ a b Yossi Levanoni, Erez Petrank (2001). "An on-the-fly reference-counting garbage collector for java". Proceedings of the 16th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. OOPSLA 2001. pp. 367–380. doi:10.1145/504282.504309.
  6. ^ a b Yossi Levanoni, Erez Petrank (2006). "An on-the-fly reference-counting garbage collector for java". ACM Trans. Program. Lang. Syst. 28: 31–69. CiteSeerX 10.1.1.15.9106. doi:10.1145/1111596.1111597. S2CID 14777709.
  7. ^ "An On-the-Fly Reference-Counting Garbage Collector for Java" (PDF). Cs.technion.ac.il. Retrieved 24 June 2017.
  8. ^ Stephen Blackburn; Kathryn McKinley (2003). "Ulterior Reference Counting: Fast Garbage Collection without a Long Wait" (PDF). Proceedings of the 18th annual ACM SIGPLAN conference on Object-oriented programing, systems, languages, and applications. OOPSLA 2003. pp. 344–358. doi:10.1145/949305.949336. ISBN 1-58113-712-5.
  9. ^ "Mac Developer Library". Developer.apple.com. Retrieved 17 December 2015.
  10. ^ Bacon, David F.; Rajan, V. T. (2001). "Concurrent Cycle Collection in Reference Counted Systems" (PDF). ECOOP 2001 — Object-Oriented Programming. Lecture Notes in Computer Science. Vol. 2072. pp. 207–235. doi:10.1007/3-540-45337-7_12. ISBN 978-3-540-42206-8. Archived from the original (PDF) on 23 July 2004.
  11. ^ Harel Paz, David F. Bacon, Elliot K. Kolodner, Erez Petrank, V. T. Rajan (2007). "An efficient on-the-fly cycle collection". ACM Transactions on Programming Languages and Systems. 29 (4): 20–es. CiteSeerX 10.1.1.10.2777. doi:10.1145/1255450.1255453. S2CID 4550008.{{cite journal}}: CS1 maint: 여러 이름: 작성자 목록(링크)
  12. ^ Bevan, D. I. (1987). "Distributed garbage collection using reference counting". Volume II: Parallel Languages on PARLE: Parallel Architectures and Languages Europe. Eindhoven, The Netherlands: Springer-Verlag. pp. 176–187. ISBN 0-387-17945-3.
  13. ^ Watson, Paul; Watson, Ian (1987). "An efficient garbage collection scheme for parallel computer architectures". Volume II: Parallel Languages on PARLE: Parallel Architectures and Languages Europe. Eindhoven, The Netherlands: Springer-Verlag. pp. 432–443. ISBN 0-387-17945-3.
  14. ^ Bruno, Rodrigo; Ferreira, Paulo (2018). "A Study on Garbage Collection Algorithms for Big Data Environments". ACM Computing Surveys. 51: 1–35. doi:10.1145/3156818. S2CID 21388487.
  15. ^ [1] 2011년 6월 9일 Wayback Machine에서 아카이브 완료
  16. ^ "Mac Developer Library". Developer.apple.com. Retrieved 17 December 2015.
  17. ^ Siracusa, John (25 July 2012). "OS X 10.8 Mountain Lion: the Ars Technica review". Ars Technica. At section "Objective-C enhancements". Retrieved 17 November 2016.
  18. ^ "Xcode 8 Release Notes". Apple Developer. 27 October 2016. Archived from the original on 19 March 2017. Retrieved 19 March 2017.
  19. ^ "Projects/Vala/ReferenceHandling - GNOME Wiki!". GNOME. 25 May 2015. Retrieved 17 December 2015.
  20. ^ "PHP: Reference Counting Basics - Manual". www.php.net. Retrieved 1 October 2020.
  21. ^ "1. Extending Python with C or C++ — Python 2.7.11 documentation". Docs.python.org. 5 December 2015. Retrieved 17 December 2015.
  22. ^ "std::rc - Rust". doc.rust-lang.org. Retrieved 2 November 2020.

외부 링크