Що означає "карта"?


10

Я часто зустрічався з цим терміном у різних навчальних матеріалах CS:

  1. L2 CS162 (UC Berkeley):

    Введення / виведення на карту пам'яті

  2. L4 CS162 (UC Berkeley):

    Файли, відображені на пам'яті

  3. L24 CS61 (UC Berkeley):

    "Вбудований введення / виведення пам'яті": регістри керування / даних пристрою, відображені в адресному просторі процесора

  4. Навіть після гуглівського "картографування" я отримав статтю Map_ (функція вищого порядку) , але це було не дуже зрозуміло для мене.
  5. Навіть більше, намагалися зрозуміти значення в контексті bitmap, читаючи статтю у Вікіпедії :

    Бітовий масив - це зіставлення з деякого домену (майже завжди діапазон цілих чисел) до значень у наборі {0, 1}

    Я не впевнений, але в контексті вище мені звучить конверсія даних.

  6. Пізніше, прочитавши книгу CS, я знайшов лише цей параграф, але він не пояснив для мене значення "картографування":

    Картографування пам'яті Linux (поряд з іншими формами Unix) ініціалізує вміст області віртуальної пам'яті, пов'язуючи її з об'єктом на диску, процесом, відомим як відображення пам'яті.

  7. Я отримав також MapReduce як результат пошуку: де map пояснюється як "ідіома при паралельних обчисленнях, де проста операція застосовується до всіх елементів послідовності, можливо, паралельно".

Я все ще плутаю термін. Хтось може пояснити, що означає "карта" у контекстах, про які я згадав?

Відповіді:


14

Отож, тут є дві чіткі вживання слова "карта", яке я тут розпакую.

  1. fх2хх.f(х)=2х

    Це використання включає "IO, відображений на карті IO:" існує (концептуальна) функція, що асоціює кожен фрагмент пам'яті з певною дією вводу-виводу. Ніхто насправді ніколи не виписує функцію, але вона дійсно є: для кожного фрагмента картографічної пам’яті є якийсь IO, пов’язаний з нею. Можливо, частина диска, можливо апаратний реєстр на периферійному пристрої тощо.

    Аналогічно, бітові масиви (і масиви взагалі) потрапляють до цього: кожен індекс має один елемент, пов'язаний з ним (у будь-який момент часу), тому масив є ефективно кодуванням функції з кінцевою доменною.

  2. У функціональному програмуванні та похідних (таких як MapReduce) карта посилається на застосування перетворення в структурі.

    Оригінал mapпоходить від Lisp, де він посилається на функцію, яка приймала іншу функцію та список, і повертає результат застосування функції до кожного елемента цього списку.

    Але це явище досить загальне. У Haskell структура даних, яка допускає таку операцію, називається функтором , а операція називається fmap (з історичних причин, щоб уникнути конфліктів із картою списку).

    Всі вони пов'язані через концепцію функціонера з теорії категорій, яка є абстрагуванням структур, що допускають операцію "карта".


4
(Введіть Functorназву посилання - занадто мало, щоб запропонувати редагування.)
Мат

Дуже чітке і відмінне пояснення. Однак я не розумів, що означає "кінцева функція".
Кайс

1
"Кінцева функція" @Kais найчастіше використовується для функції, для якої жоден елемент не відображається у нескінченності. Я думаю, що jmite хотів підкреслити, що масиви - це в основному функції, які відображають набір (дійсних) індексів до містяться значень.
Майкл Хофф

2
Ці два напрямки дійсно - лише аспекти одного і того ж. mapФункція повертає результат , де кожен елемент пов'язаний з відповідним елементом введення. Відмінність полягає в тому, що перше використання описує існуючі відносини, а друге стосується операції, яка створює відносини.
Бармар

1
Друкарня
Barmar

8

Далі я збираюся бути менш ніж точним у ряді способів, жертвуючи технічною точністю, щоб забезпечити базове розуміння. Очевидно, що ви прочитали ряд технічних джерел, а сама технічність матеріалу ускладнює вам розуміння того, що є досить базовим і простим поняттям.

Простіше кажучи, найпоширенішим використанням слова карта є опис зв’язку між речами у двох різних наборах. Це може бути математична функція або це може бути якийсь інший вид представлення та механізму. Найпоширенішим, що відразу приходить на думку, є карта вулиць.

Карта вулиць - це зображення певної місцевості чи місцевості в реальному світі, в яких лінії та малюнки та слова, написані на карті, відповідають фактичним фізичним вулицям та будівлям. Існує взаємозв'язок між зображенням місцевості, зображеним на карті вулиці, і фактичним місцевістю.

Подивившись далі, ми також можемо побачити, що карта вулиць є відображенням фактичної місцевості. Фактична місцевість має об’єкти та деталі та динамічні процеси, які на карті вулиці не зображено. Карта вулиць - це абстрактне зображення реального рельєфу місцевості, і те, що зображено на карті вулиць, є лише тим, що потрібно для виконання його мети, для надання навігаційної допомоги реальній місцевості.

Ряд прикладів у запитанні передбачає створення представлення з підтримуючими механізмами, щоб людина могла використовувати представлення, а механізм переводить дії людини в те, що потрібно для основної функціональності, прихованої фасадом представлення.

Вбудований / вхідний файл з картою пам'яті дозволяє програмісту уявити про файл як про велику область пам'яті, використовувати представлення пам'яті реального файлу. Програміст не сприймає файл як файл, а натомість вважає його великою областю пам'яті. Функціонал вводу / виводу файлу, що відображається на пам'ять, переконує в тому, що коли програміст посилається на певний зсув пам'яті, доступ до відповідних даних у файлі.

Вхідно-вивірений пристрій, відображений на пам'ять, дозволяє спростити інтерфейс програмування пристрою шляхом запису до адрес пам'яті або читання з адрес пам'яті. Ці дії запису та читання перекладаються функцією вводу / виводу пристрою, відображеною в основній пам'яті, на фактичні дії, необхідні для виконання запитуваної послуги чи дії.

Бітова карта - це набір бітів, які забезпечують відповідність один до одного значень деякого іншого набору. Наприклад, CreateFile()функція API Win32 має кілька аргументів бітної карти, які використовуються для вказівки різних видів атрибутів файлів. Конкретні біти в бітовій карті відповідають певній поведінці файлу, такі як "Відкрити як лише читання" або "Завжди створювати новий порожній файл". Надаються спеціальні константи, які поєднуються за допомогою двійкових бітових операцій для визначення фактичних аргументів. Див. Функцію CreateFile та приклад вихідного коду в розділі Відкриття файлу для читання чи запису .


Чудове пояснення. Однак, що стосується Memory mapped file I/O, чи це альтернатива стандартному вводу-виводу файлів (fopen, fgetc ..)? чи є перевага в продуктивності через характер оперативної пам’яті більш швидкий доступ порівняно з дисками?
Кайс

1
Файл вводу / виводу файлу @Kais пам'яті (MMF) - це альтернатива використанню стандартних викликів API файлів. Перевага щодо використання MMF може бути, а може і не бути. Це дійсно залежить від того, наскільки механіка MMF відповідає вмісту файлу, а також наскільки великий файл. Області сторінок файлів вводу / виводу MMF великими блоками в пам'ять. Ви можете зробити щось подібне з API файлу та зробити істотну різницю у продуктивності. Зі стандартним файловим входом / виводом файлів, як правило, відбувається багато копіювання між буферами пам’яті з простору ядра в простір користувача, який часто обходить MMF.
Річард Чемберс

1
@Kais не впевнений, про що ви питаєте. Копіювання даних з одного місця пам'яті в інше вимагає часу і циклів процесора, тому зменшення копіювання даних покращує продуктивність під час доступу до даних. Файловий ввід / вивід має загальне призначення і внутрішньо здійснює власне кешування та підкачку вмісту файлів, однак зазвичай розмір буферів пам'яті менший, ніж те, що використовується з файлом вводу / виводу файлів пам'яті. API файлів, як правило, орієнтований на перевагу введення / виводу дрібних шматочків, а не великих блоків. Послідовний доступ, як правило, надається перевагу з поглядом наперед у стеці вводу-виводу файлу та ядрі файлу.
Річард Чемберс

1
@Kais, тож якщо ви можете надати підказку до файлу API вводу / виводу, тоді ви можете покращити продуктивність вашої програми, яка використовує API вводу / виводу файлів, коли файл вводу / виводу є вузьким місцем продуктивності. І використання вводу / виводу файлів пам'яті, заповнених пам'яттю, також може допомогти, особливо, в основному послідовного доступу та операцій, що знаходяться в межах одного розміру сторінки MMF. Дивіться матеріали та посилання за цією URL-адресою про введення-виведення низького рівня з GNU C gnu.org/software/libc/manual/html_node/…, де описано деякі механіки нижчого рівня GNU.
Річард Чемберс

1
@Kais Я помітив суттєві покращення продуктивності API API стандартної бібліотеки C за допомогою setbuf()функції встановлення великого буфера вводу-виводу файлів. Все, що ви можете зробити для зменшення доступу до пристрою зберігання даних, як правило, є бонусом. Для дискових накопичувачів зменшення кількості запитів може призвести до великої різниці, однак існує ряд впливів, які ви не можете багато зробити, наприклад, як організовуються дані на дисках, швидкість обертання платівок, швидкість переміщення голови, кешування дані, наскільки вдалі покази кешу зменшують перехід на електромеханічний диск тощо.
Річард Чемберс

1

Картографування - це просто процес асоціації однієї одиниці даних з іншою одиницею даних. Метою відображення є надання спрощеного доступу до відображених даних. Наприклад, у класичних системах, сумісних з IBM, адреса пам'яті 0xB8000 була відображена у відеопам'яті відеокарти. Запис у цю пам'ять оновлює вміст екрану, а читання з нього отримує вміст екрану. Відображення файлів, відображення пристроїв і навіть відображення структури даних (зазвичай їх називають Map, HashMap або Dictionary) - це всі способи асоціації однієї одиниці даних з іншою одиницею даних.

Картографування має дві основні переваги. Перший полягає в тому, що відображення зменшує складність доступу до пов’язаного пристрою або файлу. Наприклад, картографічне відображення та відображення пристроїв дозволяють вам поводитись із цими пристроями так, ніби вони просто простою пам'яттю. Замість того, щоб вивчати різні порти вводу / виводу, команди даних тощо, ви отримуєте один простий інтерфейс, такий же природний і очевидний, як запис у оперативну пам'ять.

Друга перевага полягає в тому, що вона може зменшити потреби в пам'яті. Наприклад, a Map<Integer, SomeDataType>може створити "розріджений масив", який корисний там, де ви хочете, щоб масив, який здебільшого міститиме недійсні / невикористані дані, до нього можна отримати доступ майже в лінійний час. Це може бути набагато ефективніше, ніж пов'язаний список (де для доступу до n -го елемента потрібен O ​​( n ) час ).

Картографування в основному використовується як абстракція для приховування складних алгоритмів / функцій від розробника, щоб вони могли зосередитись на задачі реалізації програми. Зауважте, що картографування може не завжди бути таким ефективним, з точки зору часу обробки, як доступ до пристрою чи файлу безпосередньо, але завжди менш складне, ніж це робити (наприклад, відображення зменшує кількість спеціалізованого коду, який розробник повинен записати для доступу до даних ).


Дякую за пояснення. Однак я не розумів, що означає "розріджений масив" і наскільки він більш ефективний.
Кайс

@Kais Рідкий масив - це список, який складається з переважно нульових значень. Замість того, щоб зберігати всі значення в пам'яті, розріджений масив зберігає в пам'яті лише ненульові значення. Роблячи це, це більш ефективно, ніж просто розподілити всю пам'ять одразу. Рідкі масиви зазвичай мають бути близько 75% порожніми, щоб заощадити місце. Віртуальна пам'ять часто працює і таким чином, де ОС зберігає лише "брудні" сторінки пам'яті, а також файлові системи, які дозволяють зберігати лише сектори ненульових значень.
фірфокс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.