“지도”는 무엇을 의미합니까?


10

다양한 CS 교육 자료에서이 용어를 여러 번 접했습니다.

  1. L2 CS162 (UC 버클리) :

    메모리 매핑 된 I / O

  2. L4 CS162 (UC 버클리) :

    메모리 매핑 파일

  3. L24 CS61 (UC 버클리) :

    "메모리 매핑 된 I / O": CPU 주소 공간에 매핑 된 장치 제어 / 데이터 레지스터

  4. 인터넷 검색 "매핑"후에도 Map_ (higher-order_function) 기사가 있지만 나에게 명확하지 않았습니다.
  5. 더욱이 Wikipedia 기사bitmap 를 읽으 면서 컨텍스트의 의미를 이해하려고했습니다 .

    비트 배열은 일부 도메인 (거의 항상 정수 범위)에서 세트 {0, 1}의 값으로의 맵핑입니다.

    확실하지 않지만 위의 컨텍스트에서 데이터 변환에 대해 들립니다.

  6. 나중에 CS 책을 읽은 후에이 단락 만 찾았지만 "매핑"의 의미는 설명하지 않았습니다.

    메모리 매핑 Linux (다른 형태의 Unix와 함께)는 메모리 매핑이라는 프로세스 인 디스크의 객체와 가상 메모리 영역을 연결하여 가상 메모리 영역의 내용을 초기화합니다.

  7. 또한 검색 결과로 MapReduce 를 얻었습니다 . 여기서 은 "순서의 모든 요소에 잠재적으로 병렬로 간단한 연산이 적용되는 병렬 컴퓨팅의 관용구"로 설명됩니다.

나는 아직도 그 용어에 대해 혼란스러워합니다. 내가 언급 한 맥락에서 "지도"가 무엇을 의미하는지 설명 할 수있는 사람이 있습니까?

답변:


14

따라서 "map"이라는 단어의 두 가지 용도가 있습니다. 여기서 압축을 풉니 다.

  1. 첫 번째는 매우 일반적이며 map은 특히 함수를 통해 "연결"을 의미합니다. " 는 각 x2 x에 매핑합니다 "라고 말하면 x 라고 합니다. F ( X는 ) = 2 X를 .에프엑스2엑스엑스.에프(엑스)=2엑스

    이 사용법에는 "memory maped IO :"가 포함됩니다. 각 메모리 조각을 특정 IO 동작과 연결하는 (개념적) 기능이 있습니다. 실제로 함수를 작성하는 사람은 없지만 실제로는 있습니다. 매핑 된 메모리의 각 조각마다 관련 IO가 있습니다. 디스크의 일부이거나 주변 장치의 하드웨어 레지스터 등일 수 있습니다.

    마찬가지로 비트 배열 (및 일반적으로 배열)도 여기에 속합니다. 각 인덱스에는 주어진 시간에 해당 요소와 관련된 단일 요소가 있으므로 배열은 사실상 유한 도메인 함수의 인코딩입니다.

  2. 기능 프로그래밍 및 파생 (예 : MapReduce)에서 map은 구조 전체에 변형을 적용하는 것을 말합니다.

    원본 map은 Lisp에서 가져 왔습니다. 여기서 Lisp는 다른 함수와 목록을 취하는 함수를 참조하고 해당 목록의 각 요소에 함수를 적용한 결과를 반환했습니다.

    그러나이 현상은 매우 일반적입니다. Haskell에서는 이러한 작업을 허용하는 데이터 구조를 functor 라고하며 작업을 fmap (역사적인 이유로 목록 맵과의 충돌을 피하기 위해)이라고합니다.

    이 모든 것은 범주 이론 의 Functor 개념을 통해 관련 되며, 이는 "맵"연산을 허용하는 구조의 추상화입니다.


4
( Functor링크 이름의 타이포 -편집을 제안하기에는 너무 적습니다.)
Mat

매우 명확하고 훌륭한 설명. 그러나 '유한 기능'이 무엇을 의미하는지 이해하지 못했습니다.
카이스

1
@Kais 'finite function'은 요소가 무한대에 매핑되지 않은 함수에 가장 일반적으로 사용됩니다. jmite는 배열이 기본적으로 (유효한) 인덱스 집합을 포함 된 값에 매핑하는 함수라는 것을 강조하고 싶었습니다.
Michael Hoff

2
두 가지 용도는 실제로 같은 것의 측면 일뿐입니다. 이 map함수는 각 요소가 입력의 해당 요소와 연관된 결과를 리턴합니다. 차이점은 첫 번째 사용은 기존 관계를 설명하고 두 번째 사용은 관계를 작성하는 조작을 나타냅니다.
Barmar

1
오타 : Fucntor
Barmar

8

다음에서는 기본적인 이해를 제공하기 위해 기술적 정확성을 희생하면서 여러 가지면에서 정확도가 떨어질 것입니다. 많은 기술 자료를 읽었으며 자료의 기술력으로 인해 기본적이고 간단한 개념을 이해하기가 어려워지고 있습니다.

간단히 말해서 단어 맵의 가장 일반적인 사용은 두 가지 다른 세트로 사물 간의 관계를 설명하는 것입니다. 이것은 수학적 함수일 수도 있고 다른 종류의 표현과 메커니즘 일 수도 있습니다. 가장 먼저 떠오르는 가장 일반적인 것은 거리지도입니다.

거리지도는지도에 쓰여진 선과 그림 및 단어가 실제 물리적 거리와 건물에 해당하는 실제 세계의 특정 지형 또는 지역의 사진입니다. 거리지도에 표시된 지형 표현과 실제 지형 사이에는 일대일 관계가 있습니다.

더 자세히 살펴보면 거리지도가 실제 지형을 나타내는 것임을 알 수 있습니다. 실제 지형에는 거리지도에 표시되지 않은 객체와 세부 정보 및 동적 프로세스가 있습니다. 거리지도는 실제 지형을 추상적으로 표현한 것이며 거리지도에 표시된 것은 실제 지형에 대한 탐색 지원을 제공하기 위해 목적을 달성하는 데 필요한 것입니다.

문제의 많은 예는 사람이 표현을 사용할 수 있도록 지원 메커니즘으로 표현을 생성하는 것과 관련이 있으며 메커니즘은 사람의 행동을 표현의 정면에 의해 숨겨져있는 기본 기능에 필요한 것으로 변환합니다.

메모리 매핑 된 파일 I / O를 통해 프로그래머는 파일을 큰 메모리 영역으로 생각하고 실제 파일의 메모리 표현을 사용할 수 있습니다. 프로그래머는 파일을 파일로 생각하지 않고 대신 큰 메모리 영역으로 생각합니다. 메모리 맵핑 된 파일 I / O 기능은 프로그래머가 파일의 해당 데이터에 액세스하는 특정 메모리 오프셋을 참조 할 때주의를 기울입니다.

메모리 매핑 된 장치 I / O를 사용하면 메모리 주소에 쓰거나 메모리 주소에서 읽음으로써 장치 프로그래밍 인터페이스를 단순화 할 수 있습니다. 이러한 쓰기 및 읽기 작업은 기본 메모리 매핑 된 장치 I / O 기능에 의해 요청 된 서비스 또는 작업을 수행하는 데 필요한 실제 장치 별 작업으로 변환됩니다.

비트 맵은 다른 세트의 값에 일대일 대응을 제공하는 비트 세트입니다. 예를 들어 CreateFile()Win32 API 의 기능에는 여러 종류의 파일 속성을 나타내는 데 사용되는 몇 가지 비트 맵 인수가 있습니다. 비트 맵의 ​​특정 비트는 "읽기 전용으로 열기"또는 "항상 새 빈 파일 만들기"와 같은 특정 파일 동작에 해당합니다. 이진 비트 연산을 사용하여 실제 인수를 지정하는 특수 상수가 제공됩니다. 읽기 또는 쓰기를 위해 파일 열기 에서 CreateFile 함수 및 예제 소스 코드를 참조하십시오 .


좋은 설명입니다. 그러나 Memory mapped file I/O표준 파일 i / o (fopen, fgetc ..)의 대안입니까? 디스크에 비해 RAM의 빠른 액세스 특성으로 인해 성능 이점이 있습니까?
Kais

1
@Kais 메모리 매핑 파일 I / O (MMF)는 표준 파일 API 호출을 사용하는 대신 사용할 수 있습니다. MMF를 사용하면 성능상의 이점이 있거나 없을 수 있습니다. 그것은 실제로 MMF의 메커니즘이 파일 내용을 사용하는 방식과 파일의 크기에 얼마나 잘 맞는지에 달려 있습니다. MMF I / O는 파일의 영역을 큰 블록으로 메모리에 페이지합니다. 파일 API와 비슷한 작업을 수행하고 성능을 크게 향상시킬 수 있습니다. 표준 파일 API I / O를 사용하면 커널 공간에서 사용자 공간으로 메모리 버퍼간에 많은 복사가 발생하는 경향이 있습니다.
Richard Chambers

1
@Kais는 당신이 무엇을 요구하는지 잘 모르겠습니다. 한 메모리 위치에서 다른 메모리 위치로 데이터를 복사하면 시간과 CPU주기가 걸리므로 데이터 복사를 줄이면 데이터에 액세스 할 때 성능이 향상됩니다. 파일 I / O는 범용이며 내부적으로 파일 내용의 자체 캐싱 및 페이징을 수행하지만 일반적으로 메모리 버퍼의 크기는 메모리 매핑 된 파일 I / O에 사용되는 것보다 작습니다. 파일 API는 큰 블록보다는 작은 청크의 I / O를 선호하는 경향이 있습니다. 파일 I / O 스택 및 커널 내에서 미리 살펴보면 순차적 액세스가 선호되는 경향이 있습니다.
Richard Chambers

1
@Kais 파일 I / O API에 대한 힌트를 제공 할 수 있으면 파일 I / O가 성능 병목 현상 일 때 파일 I / O API를 사용하는 응용 프로그램의 성능을 향상시킬 수 있습니다. 또한 메모리 매핑 된 파일 I / O를 사용하면 특히 단일 MMF 페이지 크기 내에있는 순차적 액세스 및 작업에 특히 도움이 될 수 있습니다. GNU C 레벨 gnu.org/software/libc/manual/html_node/…의 저수준 I / O에 관한이 URL의 자료와 링크를 참조하십시오 .
Richard Chambers

1
@Kais setbuf()큰 파일 I / O 버퍼를 설정하는 기능을 사용하여 C 표준 라이브러리 파일 API의 성능이 크게 향상되었습니다 . 저장 장치에 대한 액세스를 줄이기 위해 할 수있는 모든 것은 보너스입니다. 디스크 드라이브의 경우 탐색 횟수를 줄이면 큰 차이를 만들 수 있지만 디스크 플래터에서 데이터가 구성되는 방식, 플래터의 회전 속도, 헤드 이동 속도, 캐싱 등 많은 영향을 줄 수 있습니다. 데이터, 캐시 적중이 전자 기계 디스크로가는 횟수를 줄이는 정도 등
Richard Chambers

1

맵핑은 단순히 한 데이터 단위를 다른 데이터 단위와 연관시키는 프로세스입니다. 매핑의 목적은 매핑 된 데이터에 대한 간단한 액세스를 허용하는 것입니다. 예를 들어, 고전적인 IBM 호환 시스템에서 메모리 주소 0xB8000은 비디오 카드의 비디오 메모리에 매핑되었습니다. 이 메모리에 쓰면 화면의 내용이 업데이트되고 화면에서 읽으면 화면의 내용이 검색됩니다. 파일 매핑, 장치 매핑 및 심지어 데이터 구조 매핑 (일반적으로 맵, 해시 맵 또는 사전이라고도 함)은 하나의 데이터 단위를 다른 데이터 단위와 연결하는 모든 방법입니다.

매핑에는 두 가지 주요 이점이 있습니다. 첫 번째는 매핑이 관련 장치 나 파일에 액세스하는 복잡성을 줄여주는 것입니다. 예를 들어 파일 매핑 및 장치 매핑을 사용하면 이러한 장치를 마치 일반 메모리 인 것처럼 취급 할 수 있습니다. 다양한 I / O 포트, 데이터 명령 등을 배우는 대신 RAM에 쓰는 것처럼 자연스럽고 분명한 하나의 간단한 인터페이스를 얻을 수 있습니다.

두 번째 이점은 메모리 요구 사항을 줄일 수 있다는 것입니다. 예를 들어, a Map<Integer, SomeDataType>는 "유효하지 않은 데이터"를 포함하고 거의 선형에 가까운 시간에 액세스 할 수있는 배열을 원하는 경우에 유용한 "스파 스 배열"을 생성 할 수 있습니다. 이는 링크 된 목록보다 훨씬 효율적일 수 있습니다 ( n 번째 요소 에 액세스하는 데 O ( n ) 시간 이 소요됨 ).

매핑은 주로 개발자로부터 복잡한 알고리즘 / 기능을 숨겨 프로그램 구현 작업에 집중할 수있는 추상화로 사용됩니다. 장치 나 파일에 직접 액세스하는 것보다 처리 시간 측면에서 매핑이 항상 효율적일 수는 없지만 그렇게하는 것보다 항상 덜 복잡합니다 (예 : 매핑은 개발자가 데이터에 액세스하기 위해 작성해야하는 특수 코드의 양을 줄입니다) ).


설명 주셔서 감사합니다. 그러나 "희소 한 배열"이 무엇을 의미하고 어떻게 더 효율적인지 이해하지 못했습니다.
Kais

@Kais 희소 배열은 주로 0 값으로 구성된 목록입니다. 모든 값을 메모리에 저장하는 대신 스파 스 배열은 0이 아닌 값만 메모리에 저장합니다. 이렇게하면 모든 메모리를 한 번에 할당하는 것보다 효율적입니다. 스파 스 어레이는 일반적으로 공간을 절약하기 위해 약 75 % 비어 있어야합니다. 가상 메모리는 종종 이런 방식으로도 작동합니다. 여기서 OS는 "더러운"메모리 페이지와 0이 아닌 값의 섹터 만 저장할 수있는 파일 시스템 만 저장합니다.
phyrfox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.