C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[10492] Re:[질문]ISAPI 프로그램에서의 메모리 관리는?
박지훈.임프 [cbuilder] 1035 읽음    2001-08-31 13:41
임프랍니다.

글쎄.. 정리를 해놓고 사는 체질이 아닌지라 갑자기 생각하려니 별로 떠오르는 게 없구요.
기본적으로 전역변수를 만들어 써도 상관없습니다. 볼랜드의 링크방식 때문에 모든 ISAPI dll의 인스턴스는
별도의 전역변수 영역을 가집니다.

그담에.. 쩝... 다른 ISAPI 쓰레드들과 동기화할 일도 거의 없으니 크리티컬 섹션 같은 걸 쓸 일도 없고..
아참, 메모리 관리와 직접 관련되는 건 아니지만, 두가지 주의점을 말씀드려야겠군요.

아시겠지만, IIS에서 ISAPI 캐시 옵션을 빼면, ISAPI dll이 마치 CGI처럼 요청되었을 때만 로드되고 요청이
끝나면 바로 내려가게 됩니다. 그러면 매번 웹모듈 인스턴스도 요청이 끝나면 자동 파괴되지요.
그리고 또 캐시 옵션을 설정해놓은 경우(디폴트지요)라도, Application객체 (TWebApplication 타입)의
CacheConnections를 false로 세팅하면 웹모듈이 매번 파괴됩니다. (헬프엔 없지만, 디폴트는 true입니다.)

이 경우라면 메모리 관리의 중요성은 상대적으로 적다고 볼 수 있습니다. 하지만, ISAPI 캐시가 올라가있고
또 CacheConnections가 true라면 ISAPI 인스턴스도 내려가지 않고, 그 안의 웹모듈 인스턴스도 내려가지
않아 결과적으로 웹모듈 인스턴스가 파괴되지 않고 계속 재활용됩니다. 그리고 성능을 최고로 올리기
위해서라면 당연 이렇게 설정해야 합니다.

웹브로커 프로그래밍을 하려면 이런 특성을 충분히 이해하셔야 합니다. 먼저, 웹모듈이 파괴되지 않고
재활용되므로, 웹모듈 위의 컴퍼넌트들도 요청의 처리 중에 한번 변경한 프로퍼티의 값들이 원래 값으로
돌아가지 않고 변경된 값이 유지됩니다. 물론 배열변수나 전역변수와 같은 변수들의 값들도 첫번째 실행을
제외하면 원래대로 초기화되지 않습니다. 그러므로 특별한 값으로 초기화하기 위해서는, 매번 잊지 않고
다시 초기화 코딩을 넣어주어야 하구요.

이런 특성을 재미있게 활용할 수도 있습니다. ISAPI가 시작될 때 호출되는 이벤트는 웹모듈의 OnCreate와
BeforeDispatch입니다. 이중 OnCreate는 이름 그대로 웹모듈이 생성될 때 호출되고, BeforeDispatch는
요청을 받은 직후에 발생합니다. 그러므로 위에 말씀드린 것처럼 ISAPI 캐시와 CacheConnections가 다
설정된 경우에는 이 두개의 이벤트가 같은 시점에서 발생하지 않습니다. OnCreate는 웹모듈이 최초로 생성된
직후에만 호출되며, BeforeDispatch는 웹모듈을 이용하여 매번 요청을 받을 때마다 호출됩니다.

다른 재미있는 ISAPI의 특성을 말씀드리면.. ISAPI는 기본적으로는 인터넷 게스트 계정으로 실행됩니다.
그러므로, 일반 유저 권한 이상의 권한이 필요한 동작은 할 수 없습니다. 예를 들면, 레지스트리의
HKEY_CURRENT_USER 외의 다른 모든 값들은 write할 수 없습니다. (일반적으로 읽을 수는 있습니다.)
또 어드민이나 일반유저 정도의 권한으로 제한된 파일을 읽는다든지 할 수도 없고, 메시지를 보낼 수도
없습니다.

얘기가 엉뚱한 데로 흘렀군요. 원론으로 돌아가서.. ISAPI에서 메모리를 관리하기 위해 일반 어플리케이션과
달리 특별한 것은 없습니다. 단지, 매번 별도의 프로세스를 만드는 CGI와는 달리, 하나의 프로세스에 dll로
들어가서 실행되는 것이므로, 아무리 작은 양이라도 메모리나 리소스 리크가 발생하기 시작하면 계속 쌓이게
되고 그러다보면.. 언젠가는 웹서버가 죽게 되거나 중대한 문제가 발생할 수 있습니다.
이런 측면은.. 성능 최적화를 위해 코딩 실수에 대한 위험을 감수해야 하는 셈이죠.

그럼 이만...


mossmin 님이 쓰신 글 :
: ISAPI 프로그램에서의 메모리 관리는요?
:
: 전역변수를 쓰면 안된다거나 하는 ISAPI프로그램을
: 할때 주의할 사항을 알려 주세요
: 주의 사항과 함께 해결 방안을 알려주시면 더욱 좋구요

+ -

관련 글 리스트
10488 [질문]ISAPI 프로그램에서의 메모리 관리는? mossmin 982 2001/08/31
10492     Re:[질문]ISAPI 프로그램에서의 메모리 관리는? 박지훈.임프 1035 2001/08/31
10493         Re:Re:[질문]ISAPI 프로그램에서의 메모리 관리는? PWS에서는요?(내용무) mossmin 869 2001/08/31
10494             Re:Re:Re:[질문]ISAPI 프로그램에서의 메모리 관리는? PWS에서는요?(내용무) 박지훈.임프 954 2001/08/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.