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
[8760] Re:계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ?
주경민 [amos] 1884 읽음    2001-07-05 05:29
일단 몇가지 문제가 보이는군요.
물론 이 문제가 실제 치명적인 문제로 연결될지는 모르겠지만,
일단 점검해 봐야 할 것 같습니다.

1. 통신쓰레드에 너무 높은 Priority를 줬습니다.
   Priority 0이면, 메모리 할당/해제시에도 태스킹 포인트를 놓치지 않을 수 있습니다.
   2 정도로 낮추는 것이 나으리라 봅니다.

2. 쓰레드끼리 메모리를 공유함에도 불구하고,
   Thread-safe한 코드가 작성되지 못했습니다.
   세마포어나 크리티컬 섹션 등을 이용해서 메모리 공유시 충돌이 없어야 합니다.

3. 잦은 메모리 할당은 메모리 단편화를 유발시키며,
   윈도우의 메모리 관리자를 혼란시킵니다.
   또한 메모리 관리자로 하여금 잦은 메모리 정리나 스와핑을 시도하게 한다면,
   통신 타이밍을 놓칠 수도 있습니다.
   그러니 미리 충분한 양의 Queue를 고정적으로 할당하여,
   실험적으로 그 크기를 조절하시거나,
   아니면 한번에 한개 크기씩 할당하지 마시고,
   십수개 이상씩 할당/해제 하시는 편이 좋습니다.

4. 검색, 치환이 없는 단순 Log 데이터를 남기는 것이 목적이라면,
   DB보다는 그냥 자체 포맷의 .Log 파일 등을 만드는 편이 낫습니다.
        


mach9 님이 쓰신 글 :
: <<서문>>
: 저는 PLC에서 RS-232로 데이타를 읽어와서
: 1초에 한번꼴로 파라독스DB에 레코드를 생성하는
: 프로그램을 만들고 있습니다. 소위 이야기하는 MMI(Man-Machine-Interface)프로그램의
: 데이타 로깅(Logging)부분입니다.
: 통신모듈에 CPU TIme을 빼앗기면 안되기 때문에
: 통신관련Thread(이하 "■")  와 데이타로깅Thread(이하 "▲") 둘을 이용하고 있습니다. 
: 앞에서 언급한 ■에  CPU TIme을 빼앗기면 안되기 때문에 Priority를 3~4로주고
: ▲에 0을 주었습니다.
:
: <<본론>>
: 문제는 ▲에서 발생합니다.
: - ■에서 TQueue로 TSmallIntArray로 정의된 배열 데이타가 계속 할당생성(New)되어서 Push됩니다.
: - ▲에서 TQueue로부터 TSmallIntArray는 Pop되어  ParaDox DB  에Append 된뒤 delete됩니다.
: 문제점 ===> ▲에서 일정시간이 지나면(1시간 또는 2시간 특히 정한 시간이 없음)
:             PC가 SHotDown 됩니다. 
: - DB에 이상이 있을 수도 있을까봐 Personel Oracle를 쓰봐도 마찬가집니다.
: - 제생각에 TSmallIntArray를 계속 New 하고 Delete하는 과정에서 Error가 나는 것이 아닐런지 ?????
:   원형Queue를 사용하면 메모리 할당을 계속 하지 않으면 괜챤을지..(아직 해보지 않아서)
:   어떻게 해야할지 모르겠습니다.
: - DB상에 문제라면 TExt 파일로 저장해서 하루에 한번씩 batch로 DB에 넣어야 할까요...
:   이러면 문제가 많습니다.
: - 해결해주시면 제가 한잔 사겠습니다. 창원에 내려 오시면...내려 오기전에 메일 주세요 꼭...
:
: ■------------------------------
: ....
: 통신 모듈
: ......
:
: QueueAnalog->Push(AnalogSmallIntArray);
: AnalogSmallIntArray = new TSmallIntArray(0,0);
: if(QueueAnalog->Count() > 10){
:    if(!m_ExistThreadAnalogLogging){
:       ThreadAnalogLogging = new TThreadAnalogLogging(true); //Thread 만들어지지 않았다면 생성
:       m_ExistThreadAnalogLogging = true;
:       ThreadAnalogLogging->FreeOnTerminate =true; // Set FreeOnTerminate to true if you want to explicitly destroy threads after they finish executing.
:       ThreadAnalogLogging->Priority = StrToInt(ComboBoxThreadAnalog->Text);
:    }
:    if(ThreadAnalogLogging->Suspended){
:       ThreadAnalogLogging->Resume();
:       LabelMessage2->Caption = "ThreadAnalogLog Resume !" ;
:    }
: }
:
:
: ▲----------------------------------
: void __fastcall TThreadAnalogLogging::Execute()
: {
:    int i=0;
:    AnsiString strTemp0="";
:    TSmallIntArray *AnalogSmallIntArray;
:    //---Thread 무한 루프----------------------------------------------------------------------------
:    TableAnalogLog->Open();
: while(!Terminated)
: {
:       if(QueueAnalog->Count() == 0)
:       {
:          LabelMessage2->Caption = "ThreadAnalogLog is Terminated!" ;
:          ThreadAnalogLogging->Terminate();//Thread0->Terminated = true로 됨
:          m_ExistThreadAnalogLogging = false;
:          continue;
:       }
:
:       if(QueueAnalog->Count() > 0)
:       {
:             AnalogSmallIntArray = (TSmallIntArray*)QueueAnalog->Pop();
:         //--- Disk Logging ------------------------------------------------------------------------
:          //향후에 PLC System 시간을 전송받아서 사용해야함.
:          TableAnalogLog->Append();
:          TableAnalogLog->FieldValues["AnalogDate"] = FormatDateTime("yyyy-mm-dd", Now());
:          strTemp0.printf("%02d:%02d:%02d:%03d",(int)AnalogSmallIntArray->GetItem(0),
:                                        (int)AnalogSmallIntArray->GetItem(1),
:                                        (int)AnalogSmallIntArray->GetItem(2),
:                                        (int)AnalogSmallIntArray->GetItem(3));
:          TableAnalogLog->FieldValues["AnalogTime"] =  strTemp0;
:          TableAnalogLog->FieldValues["Analog0"] = (int)AnalogSmallIntArray->GetItem(0);
:          TableAnalogLog->FieldValues["Analog1"] = (int)AnalogSmallIntArray->GetItem(1);
:          TableAnalogLog->FieldValues["Analog2"] = (int)AnalogSmallIntArray->GetItem(2);
:          TableAnalogLog->FieldValues["Analog3"] = (int)AnalogSmallIntArray->GetItem(3);
:          TableAnalogLog->FieldValues["Analog4"] = (int)AnalogSmallIntArray->GetItem(4);
:          TableAnalogLog->FieldValues["Analog5"] = (int)AnalogSmallIntArray->GetItem(5);
:          TableAnalogLog->FieldValues["Analog6"] = (int)AnalogSmallIntArray->GetItem(6);
:          TableAnalogLog->FieldValues["Analog7"] = (int)AnalogSmallIntArray->GetItem(7);
:          TableAnalogLog->FieldValues["Analog8"] = (int)AnalogSmallIntArray->GetItem(8);
:          TableAnalogLog->FieldValues["Analog9"] = (int)AnalogSmallIntArray->GetItem(9);
:          try{ TableAnalogLog->Post(); }
:          catch(Exception &E)
:          {
:             LabelErrorMessage->Caption = "TableAnalogLog-->" + E.Message;
:             TableAnalogLog->Cancel();
:          }
:             delete AnalogSmallIntArray;
:       } //if(QueueAnalog->Count() > 0)
:    } //while((!Terminated)
:    TableAnalogLog->Close();
: }
:

+ -

관련 글 리스트
8742 계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ? mach9 1344 2001/07/04
8760     Re:계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ? 주경민 1884 2001/07/05
8761         [새로운 질문]세마포어나 크리티컬 섹션 을 C++ Builder에서 어떻게 구현해야 합니까? mach9 1797 2001/07/05
8762             Re:[새로운 질문]세마포어나 크리티컬 섹션 을 C++ Builder에서 어떻게 구현해야 합니까? 주경민 3631 2001/07/05
8772                 Re:Re:[감사의표시]세마포어나 크리티컬 섹션 을 C++ Builder에서 어떻게 구현해야 합니까? mach9 1408 2001/07/05
8745     Re:계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ? makerjh 1552 2001/07/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.