기본 콘텐츠로 건너뛰기

[ ChatGPT ] mmap() 사용 빈도에 대한 질문

질문 내용

장시간동안 일정 영역의 주소를 랜덤하게 접근해서 사용하는데, 이때 큰 주소를 한번에 mmap()으로 잡는게 효과적이야, 아니면 사용할 때마다 mmap()을 이용하는게 더 효과적이야?


답변 내용

장시간 동안 일정 영역의 주소를 랜덤하게 접근하는 작업에서는 다음 두 가지 접근 방식 중 어느 것이 더 효과적인지 고려해야 합니다.

  1. 큰 주소 영역을 한 번에 mmap()으로 잡는 방법
  2. 사용할 때마다 필요한 만큼 mmap()을 이용하는 방법

1. 큰 주소 영역을 한 번에 mmap()으로 잡는 방법

이 방식에서는 한 번의 mmap() 호출로 큰 메모리 영역을 매핑하고, 이후 이 매핑된 영역을 필요할 때마다 사용합니다.

장점

  • 성능 이점: mmap() 호출은 시스템 호출이기 때문에, 매번 호출하는 것은 오버헤드가 있습니다. 큰 영역을 한 번에 매핑하면, 매번 매핑을 요청하는 오버헤드를 피할 수 있습니다.
  • 페이지 폴트 최소화: 큰 영역을 매핑하면 메모리 접근 시 더 많은 페이지가 이미 메모리에 로드되어 있을 가능성이 높아, 페이지 폴트가 줄어들 수 있습니다.
  • 연속된 메모리 사용: 연속된 메모리 영역을 사용하면, 캐시 효율성도 높아질 수 있습니다.

단점

  • 메모리 낭비: 필요하지 않은 메모리 영역까지 미리 매핑하기 때문에, 메모리가 낭비될 수 있습니다.
  • 주소 공간 부족: 특히 32비트 시스템에서 큰 영역을 매핑하면 가용한 주소 공간이 빠르게 소진될 수 있습니다.

2. 사용할 때마다 mmap()을 이용하는 방법

이 방식에서는 매번 필요한 만큼만 메모리를 매핑하고, 필요하지 않으면 매핑을 해제합니다.

장점

  • 메모리 효율성: 필요할 때만 메모리를 매핑하므로, 메모리 낭비가 줄어듭니다.
  • 유연성: 필요한 만큼만 메모리를 매핑하고 해제할 수 있어, 메모리 관리가 보다 유연합니다.

단점

  • 성능 오버헤드: 매번 mmap() 및 munmap()을 호출하는 오버헤드가 발생하며, 이는 성능에 악영향을 미칠 수 있습니다.
  • 페이지 폴트 빈도 증가: 매번 새로운 영역을 매핑할 때마다 페이지 폴트가 발생할 가능성이 높아집니다.

결론

랜덤하게 메모리를 접근하는 작업에서는 일반적으로 큰 주소 영역을 한 번에 mmap()으로 잡는 방법이 더 효율적일 가능성이 높습니다. 특히, 자주 메모리에 접근해야 하는 경우, 매번 mmap()을 호출하는 오버헤드와 페이지 폴트 빈도 증가로 인해 성능이 저하될 수 있기 때문입니다.

그러나, 시스템 메모리가 제한적이거나, 메모리를 매우 효율적으로 사용해야 하는 경우에는 사용할 때마다 mmap()을 이용하는 방법이 더 나을 수도 있습니다. 이러한 결정은 메모리 사용 패턴, 시스템 리소스, 성능 요구 사항 등을 종합적으로 고려하여 선택하는 것이 좋습니다.


------------------------------------------------------------------------------------------------

* 오버 헤드의 원인은?

mmap()을 매번 호출할 때 발생하는 "오버헤드"란, 각 호출 시 시스템에 추가적인 부담이 생기는 것을 의미합니다. 구체적으로는 다음과 같은 측면에서의 비용을 포함합니다.

1. 시스템 호출 오버헤드

mmap()은 시스템 호출(syscall)입니다. 사용자 모드(user mode)에서 커널 모드(kernel mode)로 전환하는 과정이 필요하며, 이 과정은 CPU 사이클을 소모합니다. 시스템 호출을 할 때마다 다음과 같은 단계가 포함됩니다:

  • 컨텍스트 스위칭: mmap()을 호출하면, 프로세스는 사용자 모드에서 커널 모드로 전환됩니다. 이 과정에서 컨텍스트 스위칭(Context Switching)이 발생하며, 이는 시간과 리소스를 필요로 합니다.
  • 권한 검사 및 매핑 처리: 커널은 요청된 메모리 영역의 매핑을 처리하면서 권한을 검사하고, 메모리 페이지 테이블을 수정합니다. 이 작업은 추가적인 CPU 자원을 소모합니다.

이러한 과정들이 쌓이면, 많은 횟수의 mmap() 호출이 성능 저하를 일으킬 수 있습니다.

2. 페이지 폴트(Page Fault) 비용

mmap()으로 메모리를 매핑할 때, 실제 메모리 페이지는 매핑 요청이 발생한 시점에 바로 할당되지 않고, 이후 메모리에 접근할 때 실제 물리 메모리 페이지가 할당되면서 페이지 폴트가 발생합니다.

  • 초기화 비용: 매핑된 메모리 영역에 처음 접근할 때 페이지 폴트가 발생하고, 이로 인해 해당 메모리 페이지가 실제 메모리에 로드되거나 초기화됩니다. 이런 페이지 폴트는 처리하는 데 시간이 걸리며, 자주 발생할 경우 성능 저하의 원인이 됩니다.

3. 메모리 관리 오버헤드

매번 새로운 메모리 영역을 매핑하고 해제하면, 시스템의 메모리 관리자가 빈번하게 메모리 할당 및 해제 작업을 수행하게 됩니다. 이로 인해 다음과 같은 오버헤드가 발생할 수 있습니다:

  • 프래그멘테이션(Fragmentation): 자주 매핑과 해제가 반복되면, 메모리 공간이 단편화되어 새로운 메모리 요청을 할 때 연속된 큰 메모리 블록을 찾기 어려워질 수 있습니다.
  • 매핑 테이블 관리: 커널은 프로세스의 메모리 매핑 정보를 관리하기 위해 테이블을 유지해야 합니다. 매핑과 해제가 빈번하면, 이 테이블의 관리 비용도 증가합니다.

결론

매번 mmap()을 호출할 때마다 이러한 오버헤드가 발생하기 때문에, 성능이 중요한 애플리케이션에서는 이러한 오버헤드를 최소화하는 것이 중요합니다. 따라서, 큰 메모리 영역을 한 번에 매핑하고 이를 재사용하는 방식이 오버헤드를 줄이는 데 효과적입니다.

-----------------------------------------------------------------------------------------------------

리눅스에서 메모리 매핑과 관련된 시스템 호출 방법으로 레지스터맵이나 BRAM 등에 접근하기 위해 사용하는 함수이다. Device Driver로 대체될 수도 있으나 잦은 수정이나 디버깅이 필요할 경우 어플리케이션 파트에서 사용하는 것을 권고한다.

댓글

이 블로그의 인기 게시물

[QT] 5.15.2 버전 다운로드와 설치하기

1. 버전 5.15.2를 설치하기 위해 QT 다운로드 사이트 에 접속하였으나 실행파일이 존재하지 않는다. 가장 최신의 실행파일은 ver5.14.2 이므로 일단 이것을 다운받아서 설치한다. ( 참고 사이트 - https://sloth-code.tistory.com/6#comment16833678 ) 다운 사이트  - https://bio.nic.funet.fi/pub/mirrors/download.qt-project.org/archive/qt/5.14/5.14.2/  ------------- 버전이 맞지 않으니 재 설치한다. 2.  5.15.2 버전에는 실행파일 exe가 없고 zip과 tar.gz 파일만 존재한다. ( https://bio.nic.funet.fi/pub/mirrors/download.qt-project.org/archive/qt/5.15/5.15.2/ ) OFFLINE_README.txt를 읽어보면 5.15 버전부터는 오픈 소스 오프라인 설치를 이용할 수 없다고 한다. 오프라인 설치를 원할 경우 다음 사이트 참조하라고 한다.  ( 원본:  The Qt Company offering changes, open source offline installers are not available any more since Qt 5.15. Read more about offering changes in the https://www.qt.io/blog/qt-offering-changes-2020 blog. If you need offline installers, please consider our new Qt for Small Business offering: https://www.qt.io/blog/available-now-qt-for-small-businesses ) - https://www.qt.io/blog/available-now-qt-for-small-businesses ...

[ ChatGPT ] 임의의 프로세스에 접근하여 임의의 변수값을 바꾸기 위한 방법

 질문 사항 1번 프로세스와 2번 프로세스가 있어. 1번이 운영중인데, 2번 프로세스에서 1번 프로세스의 임의의 메모리에 접근하여 그 메모리의 값을 바꾸고 싶어. 어떤 절차를 이용해야 하지? 답변 내용 1번 프로세스의 메모리에 2번 프로세스에서 접근하여 값을 변경하는 것은 매우 민감한 작업이며, 운영 체제에서는 일반적으로 이러한 작업을 보안과 안정성 때문에 제한합니다. 그러나 특수한 경우, 특히 시스템 프로그래밍이나 디버깅 목적으로는 특정 API를 사용하여 이러한 작업을 수행할 수 있습니다. 아래는 이러한 작업을 수행하기 위한 일반적인 절차를 설명합니다. 1. 프로세스 권한 확인 및 확보 2번 프로세스가 1번 프로세스의 메모리에 접근하려면 충분한 권한이 있어야 합니다. 일반적으로 이는 관리자 권한이나 루트 권한이 필요합니다. Windows에서는 SeDebugPrivilege 를 활성화해야 할 수 있으며, Linux에서는 루트 권한이 필요할 수 있습니다. 2. 1번 프로세스의 핸들 획득 2번 프로세스가 1번 프로세스의 메모리에 접근하려면 먼저 1번 프로세스의 핸들을 얻어야 합니다. Windows : OpenProcess 함수를 사용하여 1번 프로세스의 핸들을 얻습니다. 이 함수는 1번 프로세스의 프로세스 ID를 기반으로 접근합니다.

[ WorkSpace ] 라스트마일 딜리버리

'걸음마 단계' 배달로봇...2030년 50조원 규모로 커진다 기사 요약 ( 2021.6.30 ) 국토교통부는 '제1차 자율주행 교통물류 기본게획(2021 ~ 2025)'을 6월 29일 발표했으며 그 내용은 다음과 같다. 전국 고속도로와 시도별 주요 거점에서 자율주행 사용서비를 시작하기 위해 레벨4 수준의 자율 주행 대중 교통과 공유서비스를 개발, 경로/배차 최적화 등 운영 기술을 고도화할 방침임. 여객, 화물 분야에도 활성화, 화물차 군집주행 차량 및 운영시스템을 고도화 도심에서의 라스트마일 배송을 위한 소형택배차량, 로봇/드론 연계 기술 개발할 방침임. 자율 주행 로봇 개발 현황: 아래와 같은 특성은 있지만 원천 기술 개발 확보 해야 함. 우아한 형제들: 목표는 라스트마일시장 석권, 현대차/기아와 로봇개발 협업, 다양한 구조의 건물에서 층간 이동이 가능, 결제 수단 기능 탑재, 건대 및 광교에서 시범 운행중. 실외용. 배달로봇 딜리드라이브. KT: AI로봇 우편배송 서비스, 건물내에서 엘리베이터 탑승하여 우편물 배송 목적지로 이동. LG유프러스 + 만도: 자율주행 순찰 로봇 골리, LG 유플러스의 5G통신, MEC 인프라, 원격관제 솔루션 시스템 탑재, 실외용으로 순찰을 돌며 주야간 치안 사각지대를 탐지하여 분석하여 시흥시 통합 관제 플랫폼으로 실시간 전송.      ※ 라스트마일 - Last-mile delivery 시장: 물류/유통업계가 주목하는 것은 데이터. - 배송 효율화가 요구된다. 라스트 마일은 상품이 소비자에게 최종 배송되는 마지막 과정을 의미한다.  - 롯데마트는 릴레이 배송 서비스를 잠실점에서 시범 운행중이며, 릴레이 배송은 마지막 현관까지 구간 라스트마일 배송을 하는 플렉서를 별도로 배치했다. 플렉서는 본인 담당 공간에서 기다리다가 트럭이 오면 물건을 꺼내 최종 목적지까지 오토바이, 도보 등으로 배달한다. 배송기사와 플렉서의 역할을 분리하여 배달 건수를 늘릴수 있는 방식이다.  - 대형마트, 편의...