블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2024/5 »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

 

'소프트웨어 공학'에 해당되는 글 30

  1. 2011.10.06 표준 Dispose 패턴을 구현하라.
  2. 2011.10.01 [패턴] Layer Architecture Pattern
  3. 2011.09.21 Bada App - FrameWork Concept
  4. 2011.08.24 c++ 고급
  5. 2011.08.17 linux의 mocha는 뭘까?
  6. 2011.07.19 [이클립스] C/C++ 쓰레드 컴파일 문제 해결
  7. 2011.07.12 xDepend
  8. 2011.07.12 Understand ( your code )
  9. 2011.07.08 Coverity Prevent
  10. 2011.06.21 Spring 문서 정보
 


포스트를 만든 목적

  • 이렇게 하지 않으면, 책을 건성으로 본다.

내용

Dispose 는 무엇인가?

관리되지 않는(unmanaged) 자원을 해제하기 위해서 사용 하는 함수이다.

그러면 unmanaged 자원은 무엇인가?

쉽게 생각해서 "메모리가 아닌 자원" 즉, 윈도우 핸들, 파일 핸들, 소켓 핸들 등 시스템 자원을 뜻한다. 반대로 managed 는.. new List<int>() 등, 메모리 처럼 쓰는 자원들이다.

그러면 표준 Dispose 패턴은 무엇인가?

  1. Dispose를 IDisposable Interface로 구현한다.
  2. Dispose 내부에선 unmanaged 자원을 해제한다.
  3. 사용자가 Dispose를 사용하지 않았을 경우를 대비하여, finalizer를 구현한다.
  4. finalizer 에서 unmanaged 자원을 해제한다.
이 1 ~ 4 을 구현한 Dispose 를 표준 Dispose 패턴이라고 한다.

finalizer 를 구현하면, 성능상에 나쁜 영향을 주는데, 왜 finalizer를 구현해야 하나?

무제한 unmanaged 자원이 늘어나는게 더 나쁜 영향을 준다. 그래도 finalizer를 구현하지 않겠는가?

왜 finalizer를 구현하면 성능에 나쁘나?

  1. finalizer를 구현하면, GC가 자신이 관리하는 finalizer 큐에 저장한다.
  2. GC에서 사용하는 특정 쓰레드가 finalizer 큐를 읽고, 해제해도 되는지 검사한다.
  3. 검사 후 해제되도 된다면, 그때서야 해제한다.

3번이 될때까지 아직도 해제하지 않고 있는 것과, 검사하는 것에 에너지를 사용하기 때문에 성능에 나쁘다.(얼마나 나쁠지는 모르겠다.)

finalizer에선 어떤 일을 해야 하는가?

사용자가 Dispose()를 사용하지 않았을 경우, unmanaged 자원을 해야 해야 한다.

그러면, 어떻게 Dispose를 구현해야 하는가?

반드시 다음과 같은 기능을 수행해야만 한다.

  1. unmanaged 자원 해제
  2. managed 자원의 해제
  3. Dispose() 한 후 다시 Dispose() 호출 후 이상이 없어야 한다.
  4. Dispose() 한 후 unmanaged 자원 사용 시, ObjectDisposed 예외를 발생 시켜야 한다.
  5. finalization 동작을 막아야 한다.

다 좋은데, 상속 기반에서는 어떻게 하나? IDisposable Interface는 비가상 함수지 않는가?

그렇다. 그래서 가상함수로 Dispose() 기능을 수행하는 함수를 만들어야 한다. 기왕 제 3의 함수 만드니까, finalizer 에서 사용 되는 부분도 줄이면 좋겠다.

.. 그런데 managed 자원은 GC(가비지 켈렉터)가 해제해주는데 굳이 해제해 줄 필요가 있는가?

맞는 말이다. 하지만 어차피 사용되지 않을꺼니까, 가비지 켈렉터가 잘 일할 수 있도록, 해제해 주는게 좋다.

어떻게 managed 자원을 해제 하는가?

.. null 로 만들면 된다. 예를 들어 _list.Clear(); _list = null; 이렇게 하면 된다.

자, 이제 코드로 보여 줄 수 있는가?

Dispose Sample Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace console
{
    class ConsoleClass
    {       
        public static void Main()
        {
            using (DerivedDisposeSample t =  new DerivedDisposeSample())
            {               
            }
 
        }
    }
 
    public class BaseDisposeSampleClass : IDisposable
    {
        // -- Dispose 두번 이상
        // -- 호출을 막기 위한것
        private bool _isBaseDisposeSmapleClass = false;
 
        // -- managed resource
        private List<int> _ManagedResource = new List<int>();
 
        // -- unmanaged resource
        // -- 사실 FileStream은 finalizer 가 구현 되어 있으므로, unmanaged 라고 보긴 힘들다.
        // -- 예제를 위해 한것이므로 그러려니 하자
        private FileStream _UnManagedResource = new FileStream("hehe.txt", FileMode.OpenOrCreate);
         
        ~BaseDisposeSampleClass()
        {
            // finalizer 가 호출된 시점에선 이미 Dispose()가 호출 되지 않았으므로
            // managed resource 는 지우지 않는다.
            Dispose(false);
        }
 
        // Dispose 호출
        public void Dispose()
        {
            // managed 까지 제거
            Dispose(true);
 
            // managed 까지 지웠으므로,
            // 이 객체는 finalizer 호출하지 말라고 등록한다.
            GC.SuppressFinalize(this);          
        }
 
        protected virtual void Dispose(bool isDisposing)
        {
            Console.WriteLine("BaseDisposeSampleClass::Dispose(bool isDisposing) is called");
 
            // is called?
            if (true == _isBaseDisposeSmapleClass)
                return;
 
            // managed resource release
            if (true == isDisposing)
            {
                _ManagedResource.Clear();
                _ManagedResource = null;
            }
 
            // unmanaged resource release
            _UnManagedResource.Dispose();
 
            // flag on
            _isBaseDisposeSmapleClass = true;           
        }
    }
 
    public class DerivedDisposeSample : BaseDisposeSampleClass
    {
        private bool _isDerivedDisposeSample = false;
 
        protected override void Dispose(bool isDisposing)
        {
            Console.WriteLine("DerivedDisposeSample::Dispose(bool isDisposing) is called");
 
            if (true == isDisposing)
            {
                // managed resource release...
            }
 
            // unmanaged resource release...
            // ...
            // ..
            // .           
            base.Dispose(isDisposing);
 
            // flag on
            _isDerivedDisposeSample = true;           
        }
    }
}

주의 해야 할 점이 있는가?

  • finalizer 와 Dispose 에서, 객체 생명주기를 바꾸는 행동을 하지 말아야 한다. 만약 객체 생명주기를 건들게 되면, 객체는 더 이상 사용하지 않는데도, managed 자원까지 사라지지 않는 일이 발생 한다. .... 어렵다면, 해제하는 작업만 해야 한다고 알아도 된다.

결론

  • 남이 만든거 갔다가 쓰자. :P
  • 남이 만든게 없을 경우, unmanaged 자원이 있을 경우, 표준 Dispose 패턴으로 구현하자.



출처 : http://ikpil.com/1190 


:

[패턴] Layer Architecture Pattern

소프트웨어 공학/개발 | 2011. 10. 1. 23:57 | Posted by youGom

:

Bada App - FrameWork Concept

소프트웨어 공학/설계 | 2011. 9. 21. 13:20 | Posted by youGom

장점.
1. FrameWork의 일관성이 유지되어, 개발 시 상호간 인터페이스에 대해 오해의 소지가 사라진다.
 - 다른 모듈에 대해서 Request만 하면 된다. 다른 모듈에 대한 이해가 필요 없다.
2. Framework의 일관성에 대한 개념을 이해하면, 모든 Framework에 대해 이해가 가능해진다.
3. 최소한의 단위로 테스트가 가능하다. ( 모든 코드는 테스트 되어 진다. )
4. 검증팀에서 검증하기 전에, 버그에 대한 진단이 자동화 테스트에 의해 자동으로 감지 된다.
5. 컴파일 시간이 줄어든다. ( 기능 추가가 될수록 파일 추가 및 수정이 잦아지는데, h파일을 수정하더라도, 전체 컴파일을 하지 않는다. 즉, 코드 결합도가 굉장히 낮다. )

단점.
1. Framework에 맞추어 개발하기 위한 대한 기본 이해가 필요하다. ( 구현하기 위한 진입 장벽이 높으나, 타 모듈 개발자가 사용하기엔 편하다. )




현황.
아래 코드는 테스트완료된 코드이며, 실질적으로 사용가능하다.
이 Framework 코드는 Bada SDK 코드에 종속적이며, 다른 플랫폼에서는 사용이 불가하다.

[ 앱의 시작 ]
way 1. GetManager( _C( "ManageForms" ) )->Request( _C( "FormStartDevMode" );
way 2. GetFormMgr()->Request( _C( "FormStartDevMode" );

[ 데이터 요청 ]
way 1. GetManager( _C( "ManageDB" ) )->Request( _C( "CreateDB" ), 0, pCompleteListener );
way 2. GetDBMgr()->Request( _C( "CreateDB" ), 0, pCompleteListener );

[ 데이터 처리 ]
way 1.  GetManager( _C( "ManageFilter" ) )->Request( _C( "FilterMessage" ), FILTER_MESSAGE_NORLMAL, pCompleteListener );
way 2. GetFilterMgr()->Request( _C( "FilterMessage" ), FILTER_MESSAGE_NORLMAL, pCompleteListener );


'소프트웨어 공학 > 설계' 카테고리의 다른 글

[수강후기] CBD, Component Based SW Design  (0) 2012.09.02
[POSA1] Broker Architecture Pattern  (0) 2011.10.07
:

c++ 고급

소프트웨어 공학/개발 | 2011. 8. 24. 17:47 | Posted by youGom
1. define
#define 문으로 선언된 상수는 컴파일시 Symbol 정보가 남지 않는다.
그래서, 디버깅할때 간혹, 심볼 추적 안되는 것 같다.


2. constexpr
int getCount( int c ) { return c + 1; }
int arr[ getCount( 1 ) ];

 위 내용은 일반적으로 컴파일되지않는다.
 
constexpr int getCount( int c ) { return c + 1; }
int arr[ getCount( 1 ) ];
 위와 같이 constexpr 키워드를 사용하면 컴파일시 정해진다.





 
:

linux의 mocha는 뭘까?

소프트웨어 공학/분석 | 2011. 8. 17. 16:05 | Posted by youGom


Mocha Mocha is a tool that monitors your network activity and keeps a record of Ip / Mac address pairings and firewall logs. It will give a warning when it notices any suspicious activity, like any changes in Mac address or any connection attempt to the firewall.




출처 : http://nakkaya.com/mocha.html


 

'소프트웨어 공학 > 분석' 카테고리의 다른 글

xDepend  (0) 2011.07.12
Understand ( your code )  (0) 2011.07.12
Coverity Prevent  (0) 2011.07.08
:
이클립스에서 쓰레드 컴파일할 때 설정방법

makefile을 손보는 건데.. 이클립스는 makefile을 설정한 내용을 가지고 자동 생성해준다.
다음과 같이 설정 해주면 된다.


아래와 같이 했는데, 속도차이가 없었다;; ㅋㅋㅋ
1. 프로젝트 properties 진입
  a. C/C++ Build
    i. Settings
    ii. C++ / C 의 Miscellaneous ( 둘 다 )
      -> Flags에 [ -lpthread ] 추가
  b. Run/Debug Settings
    i. 프로젝트 선택 후 [ Edit ] 클릭
    ii. Arguments 탭 선택
      -> Program arguments 에 [ -lpthread ] 추가
 
 

아래와 같이 했더니, 엄청난 속도와 CPU 점유율 100%를 경험할 수 있었다.
1. 프로젝트 properties 진입
  a. C/C++ Build
   -> use default 체크 해제
   -> cs-make -j8 ( cs-make -j[N] )
: N개 만큼 쓰레드가 생성된다. 








 

'소프트웨어 공학 > 개발' 카테고리의 다른 글

Subversion 설치 및 Eclipse와의 연동  (0) 2011.11.04
[ELF] OpenSource Enlightenment DeskTop  (0) 2011.10.14
표준 Dispose 패턴을 구현하라.  (0) 2011.10.06
[패턴] Layer Architecture Pattern  (0) 2011.10.01
c++ 고급  (0) 2011.08.24
:

xDepend

소프트웨어 공학/분석 | 2011. 7. 12. 11:22 | Posted by youGom
site : http://www.xdepend.com/


Extract, Visualize, Seek, Control the project





'소프트웨어 공학 > 분석' 카테고리의 다른 글

linux의 mocha는 뭘까?  (0) 2011.08.17
Understand ( your code )  (0) 2011.07.12
Coverity Prevent  (0) 2011.07.08
:

Understand ( your code )

소프트웨어 공학/분석 | 2011. 7. 12. 11:16 | Posted by youGom

site : http://www.scitools.com/



아래와 같은 기능을 제공해준다.

Metrics, Standard Testing, Editor, Dependencies, Language( C, C++, C#, Ada, Java, ... ), Searching, Graphs, Code Knowledge, Reports

위 기능중 개인적으로 Graph 사용이 가장 좋았었다.
Graph로 Depend와 Structure에 대해 잘 그려주고, 그 그래프에 나타난 클래스와 파일에 관한 정보 출력의 자유도가 높으며, 그 정보추적이 용이하다.


[ UML 그래프 ]





[ Dependency 그래프 ]







'소프트웨어 공학 > 분석' 카테고리의 다른 글

linux의 mocha는 뭘까?  (0) 2011.08.17
xDepend  (0) 2011.07.12
Coverity Prevent  (0) 2011.07.08
:

Coverity Prevent

소프트웨어 공학/분석 | 2011. 7. 8. 09:17 | Posted by youGom
 
 

핵심기능

Coverity Static Analysis Technology는 최고의 정밀성과 확장성을 약속합니다.

- 전체적이고 심도 깊은 분석을 통해 소프트웨어 오류와 보안 취약점을 검출해 냅니다.
- 소프트웨어가 실행되는 경로를 100% 탐색, 분석하여 사용자가 테스트 하기 힘든 경로를 완벽히 분석합니다.
- 소스코드 또는 빌드 과정의 변경 없이 자동화된 실행을 지원합니다.
- 수천만 라인까지의 대규모 코드도 빠르게 분석이 가능합니다.
- 테스트케이스 작성 혹은 프로그램 실행을 필요로 하지 않습니다.
- 소프트웨어 문제의 근본원인을 정확하게 찾아내어 위치를 파악합니다.




참고 자료 : 
http://www.ewaypartners.com/product01.php




 

'소프트웨어 공학 > 분석' 카테고리의 다른 글

linux의 mocha는 뭘까?  (0) 2011.08.17
xDepend  (0) 2011.07.12
Understand ( your code )  (0) 2011.07.12
:

Spring 문서 정보

소프트웨어 공학 | 2011. 6. 21. 17:33 | Posted by youGom
: