졸업작품 이야기

들어가기에 앞서 MFC 프로그래밍이란?

(졸업했을 때 당시에 기억을 되새기며 작성하는 글)

마이크로소프트 파운데이션 클래스 라이브러리(Microsoft Foundation Class Library)는 C++용 프로그램 라이브러리이다. 윈도용 응용 프로그램의 통합 개발 환경인 마이크로소프트 비주얼 C++에 부속되는 클래스 라이브러리이다.

간단하게 생각하면 C++로 GUI가 있는 윈도우 프로그램을 만드는 라이브러리이다.

이 주제를 선택한 이유

네트워크 튜닝 주제를 선택한 이유는 여러 가지 동기를 가지고 있다. 우선, 최근 기술 발전과 함께 네트워크 성능 최적화의 필요성이 더욱 증가하고 있다는 점이 가장 큰 이유이다. 특히, 5G와 클라우드 기술의 발전은 네트워크 튜닝의 중요성을 강조하고 있으며, 이러한 변화에 적응하고 새로운 기술을 활용할 수 있는 능력을 기르는 것이 중요하다고 생각했다. 또한, 제 지도 교수님이 네트워크 분야에서 깊이 있는 전문 지식을 가지고 계신 만큼, 그의 지도를 받으며 네트워크 튜닝에 대한 심화 학습을 할 수 있다는 점도 큰 장점이다. 교수님의 경험과 조언은 저에게 네트워크 기술에 대한 깊은 통찰을 제공해 주었고, 이를 통해 저는 네트워크의 중요성을 더욱 실감하게 되었다. 더불어, 동기들과의 대화에서 프로그래밍에 대한 관심이 높아지고, 기술적 문제를 해결하는 데 있어 흥미를 느낀 것도 큰 요인이다. 이와 같은 맥락에서 비전공자들도 쉽게 네트워크 튜닝을 수행할 수 있도록 도와주는 프로그램을 개발하는 데 매력을 느끼게 되었다. 결국, 네트워크 튜닝은 단순한 기술적 과제가 아니라, 다양한 사람들에게 접근 가능하고 유용한 솔루션을 제공하는 길이 될 수 있다는 점에서 많은 흥미를 끌었다.

image

연구목적

네트워크의 기술적인 발전은 향후에도 계속될 것으로 예상되며, 네트워크 튜닝은 더욱 효율적이고 유연 한 형태로 진화할 것이다. 이러한 튜닝 기술을 사용하려면 네트워크 분석기를 사용할 줄 알아야 하는데 전공자가 아닌 비전공자들은 네트워크 분석기의 사용법을 잘 모르기 때문에 본 논문에서는 비전공자들도 네트워크 튜닝을 쉽게 완료할 수 있도록 도와주는 프 로그램에 대한 연구를 하였다. 본 작품을 구현하기 위해서 아두이노를 사용하였다.

아두이노와 필터 나사 역 할을 대신해주는 가변저항과 6개의 스위치의 가변저항 값을 측정하여 화면에 그 래프 파형으로 나타난다. 스위치를 회전하여 가변저항 값의 변화에 따른 그래프 변화를 보면서 원하는 골든샘플에 도달하면 튜닝이 완료된다. 아두이노 코딩 값 을 변경하며 서로 같은 방향으로만 회전이 아닌 서로 각기 다른 방향으로 회전 하며 튜닝할 수 있도록 설정했다.

튜닝이 왜 필요하지?

네트워크 튜닝은 네트워크의 성능을 최적화하기 위해 수행되는 과정이다.

  1. 트래픽 증가에 대비하여 대역폭을 최대한 활용하고 병목현상을 줄이기 위해 필요하다.
  2. 응답 시간을 최소화하여 사용자 경험을 향상시키기 위한 목적도 있다. 또한 네트워크의 안정성과 신뢰성을 향상시키는 것이 중요하다. 네트워크 튜닝은 주로 패킷 손실, 지연, 대역폭 제한과 같은 문제를 식별하고 해결하는 데 중점을 둔다. 이를 통해 효율적인 데이터 전송과 높은 성능을 달성할 수 있다.
  3. 적절한 네트워크 튜닝은 보안 측면에서도 중요하다. 방화벽 및 암호화 구성, 접근 제어 설정 등을 통해 네트워크 보안을 강화할 수 있다.
  4. 효율적으로 조정된 네트워크는 자원 사용을 최적화하고 비용을 절감할 수 있다. 불필요한 대역폭 소비를 줄이고 최적의 하드웨어 및 소프트웨어 구성을 찾 는 것은 비용 효율성을 향상시킨다.
  5. 클라우드 컴퓨팅 및 가상화 기술의발전으로 인해 네트워크는 더 유연하고 확장 가능한 형태로 조정될 수 있다. 튜닝은 이러한 유연성과 확장성을 최대한 활용할 수 있도록 도와준다.

네트워크 튜닝 조건

  • 네트워크를 튜닝할 때 트래픽의 특성을 고려해야 한다. 예를 들어, 어떤 응용 프로그램이 주로 사용되는지, 피크 시간이 언제인지 등을 고려한다.
  • 네트워크 장비의 성능 및 용량은 튜닝에 영향을 미치는 중요한 요소이다. 라우터, 스위치, 서버 등의 성능을 고려하여 최적의 조건을 찾는다.
  • 네트워크를 사용하는 사용자 수와 그들의 요구사항은 튜닝에 영향을 미친 다. 증가하는 트래픽에 대응하기 위해 조정이 필요할 수 있다.
  • 사용되는 응용 프로그램의 종류와 특성에 따라 다양한 튜닝이 필요할 수 있다. 예를 들어, 음성 통화와 데이터 전송을 처리하는 응용 프로그램은 다른 튜닝이 필요하다.
  • 보안 정책 및 요구사항에 따라 네트워크를 튜닝할 필요가 있다. 암호화 인증, 방화벽 설정 등이 고려되어야 한다.
  • 예산 및 자원 제약은 네트워크 튜닝의 중요한 제약 사항 중 하나이다. 가용 한 자원과 비용을 고려하여 최적의 튜닝 방법을 결정한다. (실제로 네트워크 장비들은 매우 비싸기 때문이다..아두이노를 선택한 이유이기도 하다.)

비동기적인 처리를 Thread로 처리하자

image

비동기 처리를 위해 스플래시 화면을 닫는 과정을 스레드(Thread)로 처리했으면 어땠을까. 하는 아쉬움이 있다. 화면을 닫는 과정이 백그라운드로 실행이 되므로, 스플래시 화면이 표시되는 동안 애플리케이션이 블로킹이 되지 않고 계속 작업을 이어나갈 수 있었을 것이다. 이전 코드에서는 스플래시 화면이 표시된 이후에 시간이 경과함에 따라 창을 닫도록 타이머를 설정하고 있다. 또한 타이머로 시간을 측정하는 방법은 CPU의 사용량이 올라감에 따라 시간측정에서의 오류를 범할 수 있다. 또한 타이머가 동작하고 있는 동안 UI에서의 블로킹이 발생해 튜닝에서의 다른 동작을 이행해 나갈 수 없었다.

비트맵 이미지

기존코드

image

리팩토링

image SelectObject() 함수를 사용하여 새로운 비트맵을 선택하기 전에 이전 비트맵을 되돌리기 위해 pOldBmp에 이전 비트맵을 저장하고 있다. 그러나 이전 비트맵을 다시 선택하지 않은 채 함수가 종료될 경우, pOldBmp에 저장된 비트맵이 메모리 누수를 발생시킬 수 있었다. SelectObject() 함수를 사용한 후에는 이전 비트맵을 다시 선택해야 하는 번거로움이 있었다. BitBlt() 함수를 사용하여 비트맵 이미지를 화면에 출력한다. 이 함수는 비트맵 이미지를 화면으로 복사하는 데 사용됩니다. 그러나 이 함수는 속도가 느릴 수 있지만. 성능을 개선하기 위해 GDI+ 또는 Direct2D와 같은 더 빠른 그래픽 라이브러리를 고려한다. 비트맵 리소스 로딩: 이전 코드와 마찬가지로 비트맵 이미지를 리소스에서 로드합니다. LoadBitmapW()함수를 사용하여 비트맵을 로드한다. 메모리 호환성 DC 생성: CreateCompatibleDC() 함수를 사용하여 화면 DC와 호환되는 메모리 DC를 생성하도록 변경하였다.

error 처리 및 누수 메모리

기존코드

image

리팩토링

image

CPP에는 객체를 생성한 이후에는 항상 메모리 누수를 방지하기 위해서 개발자가 직접 리소스를 해제 해야한다. MemDC와 bmp객체를 생성한 이후에 해제되지 않고 남아있어서 메모리 누수가 발생하고 있었다. 또한 비트맵 이미지를 로드할 때 이미지가 정상적으로 로드되는지 확인할 수가 없었는데 개선된 코드에서는 Window API인 LoadBitMap()함수를 이용하여 리소스 식별자를 인식하도록 개선하였다. IDB_BITMAP_SCH_MARK는 리소스 식별자로 사용되고 있으며, 이는 리소스 파일에서 비트맵 이미지를 찾을 때 사용된다. 이 함수를 통해서 로드된 비트맵 이미지는 bmp객체에 저장되도록 변경하였다.

스마트 포인터를 사용한 메모리 관리

기존코드

image

리팩토링

image

pChunk 포인터가 동적으로 할당되었지만, SetChunkValue() 함수를 호출하기 전에 해제되지 않았다. 이는 메모리 누수를 발생시킬 수 있으며, 함수가 실행을 마치면 해당 메모리를 해제하는 코드가 필요하다. ATLTRY 매크로를 사용하여 new 연산자로 할당된 메모리에 대한 예외 처리를 수행하고 있다. 하지만 예외가 발생하면 할당된 메모리가 해제되지 않았다. 예외가 발생할 경우에도 메모리를 제대로 관리하기 위해 delete연산자를 사용하여 메모리를 해제해야 한다. CMFCFilterChunkValueImpl 클래스의 객체인 pChunk가 생성되었지만, 함수가 반환될 때 이 객체를 어떻게 처리할지 명시되어 있지 않았다. 이 객체는 어떻게 해제되는지 명확하게 해야 한다. std::unique_ptr를 사용하여 스마트 포인터를 생성하고 new 연산자를 통해 할당된 메모리를 관리한다. std::unique_ptr은 자동으로 메모리를 해제하기 때문에 별도의 delete 연산자 호출이 필요하지 않는다.

결과

image image

리팩토링 이후에도 기능에 변화가 없이 동일한 출력값을 얻을 수 있었다. 글을 적으면서 동기들 생각이 났는데 대학원 가서도 잘 지내는지 궁금하다. 연락한번 해봐야겠다. 아래에는 직접 코드를 작성하고 논문을 작성하는데 참고했던 문헌들이다.

Reference

곽종욱, “Ad-hoc 네트워크 환경에서 DSDV 라우팅 알고리즘을 이용한 위치 정보 시스템 및 사용자 맵핑 시스템의 설계 및 구현”, 영남대학교, 2014년 3월.

노민기, 길준민, 최장원, 안성진, “차세대 그리드 네트워크 성능향상을 위한 동적 TCP 튜닝에 대한 연구”, 한국정보기술학회지, p. 2, 2005년 12월.

IBM, “네트워크 튜닝”, 2022년 11월.

최남대, “네트워크 시스템의 성능 파라미터 조정”, 석사학위논문, 숭실대학교 정보과학대학원, p. 5, 1995년 2월.

기형서, “네트워크 감시 도구를 이용한 성능 분석 및 개선”, 석사학위논문, 숭실대학교 정보과학대학원, p. 7, 1994년 2월.

손준우, “지능 제어 기법에 의한 공장 자동화용 네트워크의 성능 관리에 관한 연구”, 석사학위논문, 부산대학교 대학원, pp. 8-10, 1996년 2월.

권우창, “안전한 대용량 과학 데이터 전송을 위한 네트워크 전송 구조”, 박사학위논문, 한남대학교 대학원, pp. 12-17, 2021년 8월.



© 2022. by taewoo

Powered by taewoo