programing

새로운 기준 자동 계수 메커니즘은 어떻게 작동합니까?

showcode 2023. 4. 10. 22:26
반응형

새로운 기준 자동 계수 메커니즘은 어떻게 작동합니까?

ARC가 어떻게 작동하는지 간략하게 설명해 주실 수 있나요?가비지 컬렉션과 다른 건 알지만, 정확히 어떻게 작동했는지 궁금해서요.

또한 ARC가 퍼포먼스를 저해하지 않고 GC를 실행하는 경우 Java는 왜 GC를 사용합니까?왜 ARC도 안 쓰죠?

Objective-C를 처음 접하는 모든 개발자는 오브젝트의 유지, 릴리스 및 자동 리스에 관한 엄격한 규칙을 익혀야 합니다.이러한 규칙에서는 메서드에서 반환되는 객체의 유지 수를 암시하는 명명 규칙도 지정합니다.Objective-C의 메모리 관리는 이러한 규칙을 마음에 새기고 일관되게 적용하면 제2의 천성이 되지만, 가장 경험이 많은 코코아 개발자도 가끔 실수를 합니다.

Clang Static Analyzer를 사용하여 LLVM 개발자는 이러한 규칙이 충분히 신뢰할 수 있다는 것을 깨달았습니다.이러한 규칙은 코드가 통과하는 경로 내의 메모리 누수와 오버릴을 지적하는 툴을 구축할 수 있습니다.

자동 참조 카운트(ARC)는 다음 논리적 단계입니다.컴파일러가 오브젝트의 보관 장소와 해방 장소를 인식할 수 있는 경우, 그 코드를 삽입하도록 하는 것은 어떻습니까?컴파일러와 그 동료들이 잘하는 것은 경직되고 반복적인 작업입니다.인간은 무언가를 잊고 실수를 하지만 컴퓨터는 훨씬 더 일관성이 있다.

그러나, 이러한 플랫폼에서의 메모리 관리에 대한 염려에서 완전히 해방되는 것은 아닙니다.답변에서는 주의해야 할 주요 문제에 대해 설명합니다(유지 사이클).이 문제는 약한 포인터를 표시하기 위해 약간의 검토가 필요할 수 있습니다.그러나 ARC에서 얻을 수 있는 것에 비하면 이는 미미한 수준입니다.

수동 메모리 관리 및 가비지 수집과 비교하여 ARC는 유지/해제 코드를 쓸 필요가 없어지지만 가비지 수집 환경에서 볼 수 있는 정지 메모리 프로파일 및 톱니 메모리 프로파일이 없기 때문에 두 가지 장점을 모두 누릴 수 있습니다.가비지 컬렉션의 유일한 장점은 보유 사이클을 처리하는 능력과 원자 속성 할당이 저렴하다는 사실이다(여기서 논의한 와 같이).기존 Mac GC 코드를 모두 ARC 구현으로 대체한다는 것을 알고 있습니다.

이것이 다른 언어로 확장될 수 있는지 여부에 대해서는 Objective-C의 참조 계수 시스템을 중심으로 하고 있는 것으로 보인다.Java나 다른 언어에 적용하는 것은 어려울 수 있지만, 저는 낮은 수준의 컴파일러에 대한 자세한 내용은 잘 모릅니다.LLVM에서 이러한 노력을 추진하는 것은 애플이기 때문에 다른 당사자가 상당한 자원을 투입하지 않는 한 Objective-C가 우선입니다.

WWDC의 개발자들은 이 공개에 충격을 받았기 때문에 사람들은 이와 같은 일이 일어날 수 있다는 것을 알지 못했습니다.시간이 지남에 따라 다른 플랫폼에서도 나타날 수 있지만 현재는 LLVM 및 Objective-C에서만 사용할 수 있습니다.

ARC는 오래된 유지/해제(MRC)를 재생하여 컴파일러가 유지/해제 호출 시기를 파악하는 것입니다.GC 시스템보다 높은 성능, 낮은 피크 메모리 사용률 및 예측 가능한 성능을 갖는 경향이 있습니다.

한편, ARC(또는 MRC)에서는 사용할 수 없는 데이터 구조도 있습니다만, GC에서는 처리할 수 있습니다.

예를 들어 node라는 클래스가 있고 node에 NSAray의 하위와 GC에서 "그냥" 작동하는 부모에 대한 단일 참조가 있는 경우.ARC(및 수동 기준 카운트)에서는 문제가 발생합니다.지정된 노드는 모두 하위 노드 및 상위 노드에서 참조됩니다.

예를 들어 다음과 같습니다.

A -> [B1, B2, B3]
B1 -> A, B2 -> A, B3 -> A

A 를 사용하고 있는 동안은, 모두 문제가 없습니다(로컬 변수를 사용해 주세요).

이 작업이 완료되면(및 B1/B2/B3), GC 시스템은 스택 및 CPU 레지스터에서 찾을 수 있는 모든 것을 조사하기로 결정합니다.A, B1, B2, B3는 검출되지 않기 때문에, 최종적으로 메모리를 다른 오브젝트로 재활용합니다.

ARC 또는 MRC를 사용하고, A로 종료하면, 레퍼런스 카운트는 3(B1, B2, 및 B3)이 되고, B1/B2/B3는 모두 레퍼런스 카운트가 1(A의 NSArray는 각 레퍼런스를 보관 유지)이 됩니다.이 모든 물체들은 어떤 것도 사용할 수 없더라도 살아있는 상태로 남아 있습니다.

일반적인 해결책은 이러한 기준 중 하나가 (기준 카운트에 기여하지 않음) 약해야 한다고 결정하는 것입니다.예를 들어 A를 통해서만 B1/B2/B3를 참조하는 경우 등 일부 사용 패턴에 대해 사용할 수 있습니다.그러나 다른 패턴에서는 실패합니다.예를 들어 B1을 붙잡고 부모 포인터를 통해 다시 올라가 A를 찾을 수 있을 것으로 예상하는 경우가 있습니다.B1만 잡고 있으면 A가 증발하고 B2와 B3를 함께 섭취할 수 있습니다.

때로는 이것이 문제가 되지 않을 수도 있지만, ARC/MRC에서는 복잡한 데이터 구조를 다루는 매우 유용하고 자연스러운 방법이 매우 어렵습니다.

따라서 ARC는 GC 타깃과 같은 종류의 문제를 대상으로 합니다.그러나 ARC는 GC보다 더 제한된 사용 패턴 집합에서 작동하기 때문에 GC 언어(Java 등)를 사용하여 ARC와 같은 것을 접목하면 일부 프로그램이 더 이상 작동하지 않습니다(또는 적어도 수 톤의 버려진 메모리가 생성되어 심각한 스왑 문제가 발생하거나 메모리 또는 스왑 공간이 부족해질 수 있습니다).

또, ARC는 퍼포먼스(또는 예측 가능성)를 중시하는 한편, GC는 범용 솔루션이 되는 것을 중시하는 경우도 있습니다.그 결과, GC는 예측 가능한 CPU/메모리의 수요는 적고, 퍼포먼스(통상은)는 ARC보다 낮지만, 어떠한 사용 패턴도 처리할 수 있습니다.ARC는 많은 일반적인 사용 패턴에 대해 훨씬 더 잘 작동하지만, 일부 사용 패턴(유효한!)에 대해서는 쓰러져 사망합니다.

마술

그러나 좀 더 구체적으로 말하면 ARC는 코드와 동일하게 동작합니다(일부 사소한 차이만 있음).ARC는 실행 시 성능에 부정적인 영향을 미치는 GC와 달리 컴파일 시간 기술입니다.ARC는 객체에 대한 참조를 추적하고 일반 규칙에 따라 유지/해제/자동 리스 메서드를 통합합니다.이 때문에 ARC는 단순히 관례상 자동 리리스 풀에 버리는 것이 아니라 더 이상 필요하지 않게 되면 즉시 출시할 수 있습니다.

기타 개선 사항으로는 취약한 참조를 0으로 설정, 블록의 힙 자동 복사, 전면적인 속도 향상(자동 리스 풀의 경우 6배!) 등이 있습니다.

이 모든 기능의 상세한 것에 대하여는, ARC의 LLVM Docs 를 참조해 주세요.

레릅릅릅릅릅릅키 릅릅키 릅키다른 선으로 물체가 새고 있을 수 있다는 경고문을 본 적이 있습니까?이러한 문장은 오브젝트를 할당한 회선에 대해서도 알려줍니다.한 더 나아가서, 는 삽입할 수 되었습니다.retain/release대부분의 프로그래머보다 더 나은 적절한 위치에 있는 스테이트먼트를 거의 100% 사용할 수 있습니다.경우에 따라서는 보관된 객체의 이상한 인스턴스가 몇 가지 있어 이를 도와야 합니다.

Apple 개발자 설명서에서 매우 잘 설명되어 있습니다."ARC 구조" 확인.

인스턴스가 필요한 동안 인스턴스가 사라지지 않도록 ARC는 현재 각 클래스 인스턴스를 참조하고 있는 속성, 상수 및 변수의 수를 추적합니다.ARC는 인스턴스에 대한 적어도1개의 활성 참조가 존재하는 한 인스턴스의 할당을 해제하지 않습니다.

인스턴스가 필요한 동안 인스턴스가 사라지지 않도록 ARC는 현재 각 클래스 인스턴스를 참조하고 있는 속성, 상수 및 변수의 수를 추적합니다.ARC는 인스턴스에 대한 적어도1개의 활성 참조가 존재하는 한 인스턴스의 할당을 해제하지 않습니다.

가비지 컬렉션과 ARC 사이의 차이를 확인하려면: 읽어 보십시오.

ARC는 오브젝트의 자동 메모리 관리를 제공하는 컴파일러 기능입니다.

언제 사용할지 기억할 필요가 없습니다.retain, release,그리고.autoreleaseARC는 오브젝트의 라이프 타임 요건을 평가하고 컴파일 시에 적절한 메모리 관리 콜을 자동으로 삽입합니다.컴파일러는 적절한 할당 해제 메서드도 생성합니다.

컴파일러는 필요한 것을 삽입합니다.retain/release이러한 콜은 다른 코드와 마찬가지로 런타임에 실행됩니다.

다음 그림은 ARC의 구조를 보다 잘 이해할 수 있도록 합니다.

여기에 이미지 설명 입력

iOS 개발 경험이 없고 Objective C에서 일한 경험이 없는 사람.메모리 관리에 대한 자세한 내용은 Apple의 Advanced Memory Management Programming Guide 문서를 참조하십시오.

언급URL : https://stackoverflow.com/questions/6385212/how-does-the-new-automatic-reference-counting-mechanism-work

반응형