Windows , IIS

객체구조 – 객체 유지

SungWookKang 2015. 7. 16. 19:10
반응형

객체구조 – 객체 유지

  • Windows Server 2008

 

객체 유형에는 임시 객체와 영구 객체가 있다. 임시객체는 사용중인 동안만 존재하며 더 이상 필요가 없을 때 해제 된다. 영구 객체는 명시적으로 해제 될 때까지 존재한다. 대부분의 객체는 임시 객체이다.

 

객체에 접근하는 모든 유저 모드 프로세스는 먼저 객체에 대한 핸들을 오픈 해야 하므로 객체 관리자는 얼마나 많은 유저모드 프로세스가 객체를 사용하고 있는지 쉽게 추적할 수 있다. 추적에는 2단계가 있다.

첫 단계는 존재하는 객체에 대한 오픈 핸들 수로 제어한다. 오픈 할 때 카운터를 증가하고 닫을 때 카운터를 감소하여 0이되면 객체관리자는 자신의 전역 이름공간에서 해당 객체의 이름을 삭제한다. 두 번째 단계는 객체가 더 이상 사용되지 않을 대 객체를 보유하지 않는 것이다.

 

아래 그림은 사용 중인 두개의 이벤트 객체를 보여준다. 프로세스A는 첫 번째 이벤트를 오픈하고 있으며 프로세스 B는 두 이벤트를 모두 오픈한 상태이다.

 

커널 모드 구조체는 첫 번째 이벤트를 참조하고 있기 때문에 첫 번째 이벤트의 참조카운트는 3이 된다. 프로세스 A와 B가 자신의 핸들을 닫더라도 첫 번째 객체의 참조 카운트는 1이 되기 때문에 계속 존재 한다.

 

 

객체의 오픈 핸들 카운터가 0이 된 이후일지라도 객체의 참조 카운트는 0보다 클 수 있다. 이것은 운영체제에서 여전히 객체를 사용 중임을 나타낸다. 최종적으로 카운트가 0이 될 때 객체 관리자는 메모리에서 삭제 한다.

 

다음의 경우 시스템이 크래시가 발생 할 수 있다. 객체가 페이지드 또는 넌페이지드에 존재할 수 있다. 디퍼렌스가 디스패치 또는 IRQL 레벨에서 일어나서 이 디레퍼런스로 인해 포인터 카운트가 0이 된다면 페이지드 풀 객체의 메모리를 즉시 해제하려는 시도로 인해 시스템이 크래시 된다.

 

커널 트랜잭션 관리자(KTM) 객체를 다룰 때에도 지연된 삭제가 필요하다. 특정 드라이버가 락을 소유할 수 있는 상황에서 객체를 삭제하려고 할 때 드라이버는 락을 소유하지 못해 데드락 상황을 유발할 수 있다.

 

[참고자료]

Windows Internals

 

 

강성욱 / http://sqlmvp.kr

 

 

 

반응형