O que significa "mapa"?

10

Eu encontrei o termo muitas vezes, em vários materiais educacionais de CS:

  1. L2 CS162 (UC Berkeley):

    E / S mapeada na memória

  2. L4 CS162 (UC Berkeley):

    Arquivos mapeados na memória

  3. L24 CS61 (UC Berkeley):

    “E / S mapeada na memória”: Registros de controle / dados do dispositivo mapeados no espaço de endereço da CPU

  4. Mesmo depois de pesquisar no "mapeamento", recebi o artigo Map_ (função de ordem superior) , mas não estava muito claro para mim.
  5. Ainda mais, tentou entender o significado no contexto de bitmaplendo o artigo da Wikipedia :

    Uma matriz de bits é um mapeamento de algum domínio (quase sempre um intervalo de números inteiros) para valores no conjunto {0, 1}

    Não tenho certeza, mas no contexto acima me parece conversão de dados.

  6. Mais tarde, depois de ler um livro de CS, encontrei apenas este parágrafo, mas ele não explicava o significado de "mapeamento" para mim:

    Mapeamento de memória O Linux (junto com outras formas de Unix) inicializa o conteúdo de uma área de memória virtual, associando-o a um objeto em disco, um processo conhecido como mapeamento de memória.

  7. Também obtive o MapReduce como resultado da pesquisa: onde o mapa é explicado como "um idioma na computação paralela, onde uma operação simples é aplicada a todos os elementos de uma sequência, potencialmente em paralelo".

Ainda estou confuso sobre o termo. Alguém pode explicar o que significa "mapa" nos contextos que mencionei?

Kais
fonte

Respostas:

14

Portanto, existem dois usos distintos da palavra "mapa", que vou descompactar aqui.

  1. fx2xx.f(x)=2x

    Esse uso inclui "E / S de memória mapeada:" existe uma função (conceitual) associando cada parte da memória a uma ação de E / S específica. Na verdade, ninguém nunca escreve a função, mas ela está realmente lá: para cada pedaço de memória mapeada, há algum IO associado a ela. Talvez uma parte de um disco, talvez um registro de hardware em um periférico, etc.

    Da mesma forma, matrizes de bits (e matrizes em geral) se enquadram nisso: cada índice possui um único elemento associado a ele (a qualquer momento), portanto, uma matriz é efetivamente uma codificação de uma função de domínio finito.

  2. Na programação funcional e derivadas (como MapReduce), map refere-se à aplicação de uma transformação em uma estrutura.

    O original mapvem do Lisp, onde se refere à função que recebeu outra função e uma lista e retornou o resultado da aplicação da função a cada elemento dessa lista.

    Mas, esse fenômeno é bastante geral. Em Haskell, uma estrutura de dados que admite tal operação é chamada de functor , e a operação é chamada fmap (por razões históricas, para evitar conflitos com o mapa da lista).

    Tudo isso está relacionado através do conceito de um Functor da teoria das categorias, que é uma abstração de estruturas que admitem uma operação de "mapa".

jmite
fonte
4
(Typo no Functornome do link - muito pouco para sugerir uma edição.)
Mat
Explicação muito clara e excelente. No entanto, eu não entendi o que significa 'função finita'.
Kais
11
A 'função finita' do @Kais é mais comumente usada para uma função para a qual nenhum elemento é mapeado para o infinito. Eu acho que o jmite queria destacar que matrizes são basicamente funções que mapeiam o conjunto de índices (válidos) para os valores contidos.
Michael Hoff
2
Os dois usos são realmente apenas aspectos da mesma coisa. A mapfunção retorna um resultado em que cada elemento está associado ao elemento correspondente da entrada. A distinção é que o primeiro uso descreve um relacionamento existente, enquanto o segundo se refere a uma operação que cria o relacionamento.
Barmar
11
Digite
Barmar
8

A seguir, serei menos que preciso de várias maneiras, sacrificando a precisão técnica para fornecer um entendimento básico. É óbvio que você leu várias fontes técnicas e a própria técnica do material está dificultando a compreensão do que é um conceito bastante básico e simples.

Em termos simples, o uso mais comum da palavra mapa é descrever um relacionamento entre as coisas em dois conjuntos diferentes. Isso pode ser uma função matemática ou pode ser algum outro tipo de representação e mecanismo. O mais comum que vem imediatamente à mente é o mapa de ruas.

Um mapa de ruas é uma figura de um terreno ou área específica no mundo real, em que as linhas, desenhos e palavras escritas no mapa correspondem a ruas e edifícios físicos reais. Existe uma relação individual entre a representação do terreno que é retratada no mapa da rua e o terreno real.

Olhando além, também podemos ver que um mapa de ruas é uma representação do terreno real. O terreno real possui objetos e detalhes e processos dinâmicos que o mapa de ruas não representa. O mapa de ruas é uma representação abstrata do terreno real e o que é representado no mapa de ruas é apenas o necessário para cumprir sua finalidade, fornecer uma ajuda à navegação para o terreno real.

Vários exemplos da pergunta envolvem a criação de uma representação com mecanismos de suporte para que uma pessoa possa usar a representação e o mecanismo converta as ações da pessoa no que é necessário para a funcionalidade subjacente oculta pela fachada da representação.

A E / S de arquivos mapeados na memória permite que um programador pense em um arquivo como uma grande área de memória, para usar uma representação de memória de um arquivo real. O programador não pensa no arquivo como um arquivo, mas como uma grande área de memória. A funcionalidade de E / S de arquivos mapeados na memória cuida para garantir que, quando o programador fizer referência a um deslocamento de memória específico, os dados correspondentes no arquivo sejam acessados.

A E / S do dispositivo mapeado na memória permite que uma interface de programação do dispositivo seja simplificada gravando nos endereços de memória ou lendo os endereços de memória. Essas ações de gravação e leitura são convertidas pela funcionalidade de E / S do dispositivo mapeado na memória subjacente nas ações específicas específicas do dispositivo necessárias para executar o serviço ou a ação solicitada.

Um mapa de bits é um conjunto de bits que fornece uma correspondência de um para um aos valores de outro conjunto. Por exemplo, a CreateFile()função da API do Win32 possui vários argumentos de mapa de bits usados ​​para indicar diferentes tipos de atributos de arquivo. Bits específicos em um mapa de bits correspondem a um comportamento específico do arquivo, como "Abrir como Somente Leitura" ou "Sempre Criar Novo Arquivo Vazio". São fornecidas constantes especiais que são combinadas usando operações de bits binários para especificar os argumentos reais. Consulte Função CreateFile e o código-fonte de exemplo em Abrindo um arquivo para leitura ou gravação .

Richard Chambers
fonte
Ótima explicação. No entanto, no que diz respeito a Memory mapped file I/O, é uma alternativa à E / S padrão do arquivo (fopen, fgetc ..)? é a vantagem de desempenho devido à natureza do acesso à RAM mais rápido em comparação com os discos?
Kais
11
A E / S de arquivo mapeado na memória do @Kais (MMF) é uma alternativa ao uso de chamadas de API de arquivo padrão. Pode ou não haver uma vantagem de desempenho no uso do MMF. Realmente depende de quão bem a mecânica do MMF se ajusta ao modo como você está usando o conteúdo do arquivo, bem como de quão grande é o arquivo. A E / S do MMF pagina as áreas do arquivo na memória em grandes blocos. Você pode fazer algo semelhante com a API do arquivo e fazer uma diferença significativa de desempenho. Com a E / S da API de arquivo padrão, costuma haver muitas cópias entre os buffers de memória do espaço do kernel para o espaço do usuário que geralmente é ignorado pelo MMF.
Richard Chambers
11
@ Kais não sabe o que está perguntando. A cópia de dados de um local de memória para outro leva tempo e os ciclos da CPU, reduzindo a cópia de dados, melhorando o desempenho ao acessar dados. A E / S do arquivo é de uso geral e realiza internamente seu próprio armazenamento em cache e paginação do conteúdo do arquivo; no entanto, normalmente o tamanho dos buffers de memória é menor do que o usado com a E / S do Arquivo Mapeado na Memória. A API do arquivo tende a ser orientada a favorecer a E / S de pequenos blocos em vez de grandes blocos. O acesso seqüencial tende a ser favorecido com um olhar à frente na pilha e no kernel do arquivo I / O.
Richard Chambers
11
@Kais, portanto, se você pode fornecer uma dica para a API de E / S de arquivo, pode melhorar o desempenho do seu aplicativo que está usando a API de E / S de arquivo quando a E / S de arquivo é um gargalo de desempenho. E o uso de E / S de arquivo mapeado na memória também pode ajudar especialmente com o acesso e operações sequenciais que estão dentro de um único tamanho de página MMF. Veja o material e os links nesta URL sobre E / S de baixo nível com GNU C gnu.org/software/libc/manual/html_node/…, que descreve algumas das mecânicas de nível inferior do GNU.
Richard Chambers
11
@Kais Vi melhorias significativas de desempenho com a API de arquivos da Biblioteca Padrão C, usando a setbuf()função para definir um buffer de E / S de arquivos grandes. Tudo o que você pode fazer para reduzir o acesso ao dispositivo de armazenamento tende a ser um bônus. Para unidades de disco, a redução do número de pesquisas pode fazer uma grande diferença, no entanto, existem várias influências sobre as quais você não pode fazer muita coisa, como a organização dos dados nos pratos, velocidade de rotação dos pratos, velocidade de movimento da cabeça, armazenamento em cache de de dados, como também acessos ao cache reduzem indo para o disco electro-mecânica, etc.
Richard Chambers
1

Mapear é simplesmente o processo de associar uma unidade de dados a outra unidade de dados. A intenção do mapeamento é permitir acesso simplificado aos dados mapeados. Por exemplo, nos sistemas clássicos compatíveis com IBM, o endereço de memória 0xB8000 foi mapeado para a memória de vídeo da placa de vídeo. Escrever nesta memória atualizaria o conteúdo da tela e a leitura dela recuperaria o conteúdo da tela. Mapeamento de arquivos, mapeamento de dispositivos e até mesmo mapeamento de estrutura de dados (normalmente chamado de Mapa, HashMap ou Dicionário), são formas de associar uma unidade de dados a outra unidade de dados.

O mapeamento tem dois benefícios principais. A primeira é que o mapeamento reduz a complexidade de acessar o dispositivo ou arquivo associado. Por exemplo, o mapeamento de arquivos e o mapeamento de dispositivos permitem tratar esses dispositivos como se fossem apenas memória simples. Em vez de aprender várias portas de E / S, comandos de dados e assim por diante, você obtém uma interface simples que é tão natural e óbvia quanto gravar na RAM.

O segundo benefício é que ele pode reduzir os requisitos de memória. Por exemplo, a Map<Integer, SomeDataType>pode produzir uma "matriz esparsa", útil quando você deseja uma matriz que contenha principalmente dados inválidos / não utilizados e possa ser acessada em tempo quase linear. Isso pode ser muito mais eficiente do que uma lista vinculada (onde leva O ( n ) tempo para acessar o n- ésimo elemento).

O mapeamento é usado principalmente como uma abstração para ocultar algoritmos / funções complicadas do desenvolvedor, para que eles possam se concentrar na tarefa de implementar o programa. Observe que o mapeamento nem sempre pode ser tão eficiente, em termos de tempo de processamento, como acessar o dispositivo ou arquivo diretamente, mas é sempre menos complicado do que fazê-lo (por exemplo, o mapeamento reduz a quantidade de código especializado que o desenvolvedor deve escrever para acessar os dados )

phyrfox
fonte
Obrigada pelo esclarecimento. No entanto, eu não entendi o que significa "matriz esparsa" e como é mais eficiente.
Kais 4/18
@ Kais Uma matriz esparsa é uma lista que consiste principalmente de valores zero. Em vez de armazenar todos os valores na memória, uma matriz esparsa armazena apenas os valores diferentes de zero na memória. Ao fazer isso, é mais eficiente do que simplesmente alocar toda a memória de uma só vez. Matrizes esparsas normalmente devem estar cerca de 75% vazias para economizar espaço. A memória virtual geralmente funciona dessa maneira também, onde o sistema operacional armazena apenas páginas de memória "sujas", bem como sistemas de arquivos que permitem armazenar apenas setores com valores diferentes de zero.
Phyrfox