참조 횟수 계산 방식
이 문서의 내용은 출처가 분명하지 않습니다. (2009년 12월) |
참조 횟수 계산 방식(reference counting)은 메모리를 제어하는 방법 중 하나로, 쓰레기 수집의 한 방식이다. 구성 방식은 단순하다. 어떤 한 동적 단위(객체, Object)가 참조값을 가지고 이 단위 객체가 참조(참조 복사)되면 참조값을 늘리고 참조한 다음 더이상 사용하지 않게 되면 참조값을 줄이면 된다. 보통 참조값이 0이 되면 더이상 유효한 단위 객체로 보지 않아 메모리에서 제거한다.
이 방식은 단위 객체에 대한 유/무효 처리가 사용하는 자리에서 확실하게 정해지며 참조값을 늘리고 줄이는 방법을 사용하기 때문에 빠르다. 또한 동적 쓰레기 수집을 하지 않는 프로그래밍 언어에서도 간단하게 구현할 수 있다.
문제점[편집]
약점으로는 매번 참조할 때마다 참조값을 검사해야 하므로 많은 수의 단위 객체를 사용하게 되면 그 검사에 대한 부하가 커진다. 또한 참조하는 단위 객체 사이에 서로 참조하게 되면 순환 참조 오류로 인해 잘못된 참조 파괴가 생기거나 또는 단위 객체가 고아(orphaned)가 될 수 있다.
방식[편집]
참조 횟수 계산 방식에는 강한 참조(strong reference)와 약한 참조(weak reference)가 있는데 보통 참조 횟수 계산 방식을 이야기 할때는 강한 참조를 말하며, 약점으로 지적된 순환 참조 오류를 해소하기 위해 약한 참조를 사용하기도 한다.
구현[편집]
- C로 작성된 코드
struct object
{
int ref;
};
struct object* object_new(void)
{
struct object* p=malloc(sizeof(struct object));
p->ref=1;
return p;
}
int object_ref(struct object* p)
{
return (p->ref++);
}
int object_unref(struct object* p)
{
if ((p->ref--)!=0)
return p->ref;
else
{
free(p);
return 0;
}
}
대표적으로 사용하는 곳[편집]
- 구성요소 개체 방식(Component Object Model(COM))
- 마이크로소프트의 IUnknown, ATL
- 스크립트 언어: 펄, 파이썬, 스퀴럴
- C++ TR1, 부스트 라이브러리의 shared_ptr
- GLib의 GObject, 아파치의 APR 라이브러리
파일 시스템[편집]
참조 횟수 계산 방식은 여러 파일 시스템에서도 사용된다. 파일 시스템에서는 파일 또는 할당된 디스크 블록에 참조 횟수를 저장하고, 참조 횟수가 0이 되면 안전하게 블록을 해제할 수 있다. 일부 유닉스 계열 운영체제에서는 디렉토리뿐만 아니라 실행 중인 프로세스 또한 파일에 대한 참조 횟수를 가질 수 있다. 만약 파일 시스템에서 파일이 삭제되었더라도, 프로세스가 해당 파일을 열고 있다면 참조 횟수가 0이 아니므로 파일이 해제되지 않으며, 해당 파일을 열고 있는 모든 프로세스가 파일을 닫으면 디스크에서 해제된다.