“Harita” ne demektir?


10

Bu terimi çeşitli CS eğitim materyallerinde defalarca karşılaştım:

  1. L2 CS162 (UC Berkeley):

    Bellek eşlemeli G / Ç

  2. L4 CS162 (UC Berkeley):

    Bellek eşlemeli dosyalar

  3. L24 CS61 (UC Berkeley):

    “Bellek eşlemeli G / Ç”: CPU adres alanına eşlenmiş cihaz kontrolü / veri kayıtları

  4. "Haritalama" yı kullandıktan sonra bile Map_ (yüksek dereceli_fonksiyon) makalesini aldım , ama bu benim için çok açık değildi.
  5. Dahası , Wikipedia makalesinibitmap okuyarak bağlamında anlamını anlamaya çalıştım :

    Bir bit dizisi, bazı etki alanından (hemen hemen her zaman bir tamsayı aralığı) {0, 1} kümesindeki değerlerle eşlemedir

    Emin değilim, ancak yukarıdaki bağlamda bana veri dönüştürme hakkında geliyor.

  6. Daha sonra bir CS kitabı okuduktan sonra, sadece bu paragrafı buldum ama benim için "haritalama" nın anlamını açıklamadı:

    Bellek Eşleme Linux (diğer Unix formlarıyla birlikte), sanal bellek alanının içeriğini, bellek eşleme olarak bilinen bir işlem olan diskteki bir nesneyle ilişkilendirerek başlatır.

  7. Ayrıca bir arama sonucu olarak MapReduce aldım : burada harita "potansiyel olarak paralel bir dizinin tüm elemanlarına basit bir işlem uygulandığı paralel hesaplama bir deyim" olarak açıklanır.

Terim hakkında hala kafam karıştı. Bahsettiğim bağlamlarda "harita" nın ne anlama geldiğini kimse açıklayabilir mi?

Yanıtlar:


14

Bu yüzden, burada açacağım "harita" kelimesinin iki farklı kullanımı var.

  1. Birincisi çok geneldir, burada harita özellikle ilişkilendirmek için "ilişkilendirmek" anlamına gelir. Dersek " her eşleyen için sonra söylüyorsun," .fx2xx.f(x)=2x

    Bu kullanım, "bellek eşlemli GÇ:" içerir, her bellek parçasını belirli bir GÇ eylemiyle ilişkilendiren (kavramsal) bir işlev vardır. Aslında hiç kimse işlevi yazmıyor, ama gerçekten orada: her eşlenen bellek parçası için, onunla ilişkili bazı IO var. Belki bir diskin bir parçası, bir çevre birimindeki donanım kaydı vb.

    Benzer şekilde, bit dizileri (ve genel olarak diziler) buna girer: her dizinin kendisiyle ilişkilendirilmiş tek bir öğesi vardır (herhangi bir zamanda), bu nedenle bir dizi sonlu etki alanı işlevinin kodlamasıdır.

  2. Fonksiyonel programlama ve türevlerde (MapReduce gibi), harita bir yapı boyunca bir dönüşüm uygulanmasını ifade eder.

    Orijinal map, Lisp'ten gelir; burada başka bir işlevi ve listeyi alan işleve başvurur ve işlevi bu listenin her öğesine uygulamanın sonucunu döndürür.

    Ancak, bu fenomen oldukça geneldir. Haskell'de böyle bir işlemi kabul eden bir veri yapısına functor denir ve işleme fmap denir (geçmiş nedenlerden ötürü, liste haritasıyla çakışmaları önlemek için).

    Bunların hepsi, bir "harita" operasyonunu kabul eden yapıların bir soyutlaması olan kategori teorisinden bir Functor kavramı ile ilişkilidir .


4
( FunctorBağlantı adında
Mat

Çok açık ve mükemmel bir açıklama. Ancak 'sonlu işlev' ne anlama geldiğini anlamadım.
Kais

1
@Kais 'sonlu işlev' en yaygın olarak hiçbir öğenin sonsuza eşlenmediği bir işlev için kullanılır. Sanırım jmite, dizilerin temelde (geçerli) indeksler setini içerilen değerlerle eşleştiren fonksiyonlar olduğunu vurgulamak istedi.
Michael Hoff

2
İki kullanım, aynı şeyin sadece yönleri. mapİşlevi, her elemanın giriş karşılık gelen elemanı ile ilişkili bir sonuç verir. Ayrım, ilk kullanımın mevcut bir ilişkiyi tanımlaması, ikincisi ise ilişkiyi yaratan bir işlemi ifade etmesidir.
Barmar

1
Yazım
hatası

8

Aşağıda, temel bir anlayış sağlamak için teknik doğruluktan ödün vererek, çeşitli şekillerde doğru olmaktan daha az olacağım. Bir takım teknik kaynakları okuduğunuz açıktır ve malzemenin teknikliği, oldukça basit ve basit bir kavramın ne olduğunu anlamanızı zorlaştırmaktadır.

Basit bir ifadeyle, kelime haritasının en yaygın kullanımı, iki farklı kümedeki şeyler arasındaki ilişkiyi tanımlamaktır. Bu matematiksel bir fonksiyon olabilir ya da başka bir temsil ve mekanizma olabilir. Hemen akla gelen en yaygın sokak haritasıdır.

Bir sokak haritası, gerçek dünyada belirli bir arazinin veya bölgenin, harita üzerinde yazılı çizgilerin ve çizimlerin ve kelimelerin gerçek fiziksel sokaklara ve binalara karşılık geldiği bir resmi. Sokak haritasında gösterilen arazinin temsili ile gerçek arazi arasında birebir ilişki vardır.

Daha ileriye baktığımızda, bir sokak haritasının gerçek arazinin bir temsili olduğunu da görebiliriz. Gerçek arazi, sokak haritasının göstermediği nesneler, detaylar ve dinamik süreçlere sahiptir. Sokak haritası, gerçek arazinin soyut bir temsilidir ve sokak haritasında tasvir edilen, yalnızca amacını yerine getirmek, gerçek arazi için bir navigasyon yardımı sağlamak için gerekli olan şeydir.

Sorudaki bazı örnekler, bir kişinin temsili kullanabilmesi ve mekanizmanın kişinin eylemlerini temsilin cephesi tarafından gizlenen temel işlevsellik için gerekli olana dönüştürmesi için destekleyici mekanizmalarla bir temsil oluşturmayı içerir.

Bellek eşlemeli dosya G / Ç , bir programcının dosyayı geniş bir bellek alanı olarak düşünmesine, gerçek bir dosyanın bellek temsilini kullanmasına olanak tanır. Programcı dosyayı bir dosya olarak düşünmez, bunun yerine geniş bir bellek alanı olarak düşünür. Bellek eşlemeli dosya G / Ç işlevselliği, programcı belirli bir bellek ofsetine başvururken dosyadaki ilgili verilere erişildiğinden emin olmaya özen gösterir.

Bellek eşlemeli cihaz G / Ç , bellek adreslerine yazarak veya bellek adreslerinden okuyarak bir cihaz programlama arayüzünün basitleştirilmesini sağlar. Bu yazma ve okuma eylemleri, alttaki bellek eşlemeli aygıt G / Ç işlevselliği tarafından istenen hizmeti veya eylemi gerçekleştirmek için gereken gerçek aygıta özel eylemlere dönüştürülür.

Bir bit haritası, başka bir kümenin değerlerine bire bir yazışma sağlayan bir bit kümesidir. Örneğin CreateFile(), Win32 API işlevinin farklı türde dosya özniteliklerini belirtmek için kullanılan birkaç bit eşleme bağımsız değişkeni vardır. Bit eşlemindeki belirli bitler, "Salt Okunur Olarak Aç" veya "Her Zaman Yeni Boş Dosya Oluştur" gibi belirli bir dosya davranışına karşılık gelir. Gerçek bağımsız değişkenleri belirtmek için ikili bit işlemleri kullanılarak birleştirilen özel sabitler sağlanır. CreateFile işlevi ve Dosya Okuma veya Yazma için Açma bölümündeki örnek kaynak koduna bakın .


Harika bir açıklama. Bununla birlikte Memory mapped file I/O, standart dosya i / o (fopen, fgetc ..) 'ye alternatif mi? RAM'in doğası gereği performans avantajı Disklere göre daha hızlı mı?
Kais

1
@Kais Bellek Eşlenmiş Dosya G / Ç (MMF), standart dosya API çağrılarını kullanmaya bir alternatiftir. MMF kullanımında bir performans avantajı olabilir veya olmayabilir. Gerçekten MMF mekaniğinin dosya içeriğini kullanma biçiminize ne kadar uygun olduğuna ve dosyanın ne kadar büyük olduğuna bağlıdır. MMF I / O, dosyanın alanlarını büyük bloklar halinde belleğe kaydeder. Dosya API'sine benzer bir şey yapabilir ve önemli bir performans farkı oluşturabilirsiniz. Standart dosya API G / Ç ile, bellek arabellekleri arasında çekirdek alanından, genellikle MMF ile atlanan kullanıcı alanına kadar çok fazla kopyalama eğilimi vardır.
Richard Chambers

1
@ Kaa ne istediğinden emin değil. Bir bellek konumundan diğerine veri kopyalamak zaman alır ve CPU döngüleri yapar, böylece verilerin kopyalanmasını azaltmak verilere erişirken performansı artırır. Dosya G / Ç genel amaçlıdır ve dahili olarak kendi içerik önbellekleme ve sayfalama işlemlerini gerçekleştirir, ancak tipik olarak bellek arabelleklerinin boyutu Bellek Eşlemeli Dosya G / Ç ile kullanılandan daha küçüktür. Dosya API'si, büyük bloklar yerine ufacık parçaların I / O'sunu desteklemeye yöneliktir. Sıralı erişim, dosya G / Ç yığını ve çekirdeğinde ileriye bakıldığında tercih edilir.
Richard Chambers

1
@Kais, bu nedenle, G / Ç API'sına bir ipucu verebilirseniz, G / Ç dosyası bir performans darboğazı olduğunda G / Ç API'sını kullanan uygulamanızın performansını artırabilirsiniz. Bellek Eşlemeli Dosya G / Ç işlevinin kullanılması, özellikle tek bir MMF sayfa boyutu içindeki çoğunlukla sıralı erişim ve işlemlerde de yardımcı olabilir. GNU alt seviye mekaniğinin bazılarını tanımlayan GNU C ile gnu.org/software/libc/manual/html_node/… ile düşük seviyeli G / Ç hakkındaki bu URL'deki materyale ve bağlantılara bakın .
Richard Chambers

1
@ Kais setbuf()Büyük bir dosya G / Ç arabellek ayarlamak için işlevini kullanarak C Standart Kütüphane dosya API ile önemli performans geliştirmeleri gördüm . Depolama aygıtına erişiminizi azaltmak için yapabileceğiniz her şey bonus olma eğilimindedir. Disk sürücülerinde arama sayısını azaltmak büyük bir fark yaratabilir, ancak verilerin disk plakalarında nasıl düzenlendiği, plakaların dönüş hızı, kafa hareket hızı, önbellekleme gibi pek çok şey yapamazsınız. veriler, önbellek vuruşlarının elektro-mekanik diske gitme oranını azaltır.
Richard Chambers

1

Eşleme basitçe bir veri birimini başka bir veri birimiyle ilişkilendirme işlemidir. Eşlemenin amacı, eşlenen verilere basitleştirilmiş erişime izin vermektir. Örneğin, klasik IBM uyumlu sistemlerde, 0xB8000 bellek adresi, video kartının video belleğiyle eşlenmiştir. Bu belleğe yazmak ekranın içeriğini günceller ve ondan okumak ekranın içeriğini alır. Dosya eşleme, cihaz eşleme ve hatta veri yapısı eşleme (genellikle Harita, HashMap veya Sözlük olarak adlandırılır), bir veri birimini başka bir veri birimiyle ilişkilendirmenin tüm yollarıdır.

Haritalamanın iki temel faydası vardır. Birincisi, eşlemenin ilişkili cihaza veya dosyaya erişmenin karmaşıklığını azaltmasıdır. Örneğin, dosya eşleme ve cihaz eşleme, bu cihazlara sanki düz bellekmiş gibi davranmanızı sağlar. Çeşitli I / O portlarını, veri komutlarını vb. Öğrenmek yerine, RAM'e yazmak kadar doğal ve açık olan basit bir arayüz elde edersiniz.

İkinci fayda, bellek gereksinimlerini azaltabilmesidir. Örneğin a Map<Integer, SomeDataType>, çoğunlukla geçersiz / kullanılmayan veriler içeren ve neredeyse doğrusal zaman içinde erişilebilen bir dizi istediğiniz yerde kullanışlı bir "seyrek dizi" üretebilir. Bu (o O (sürer bağlantılı liste çok daha verimli olabilir n erişimine) zaman n -inci elemanı).

Eşleme öncelikle karmaşık algoritmaları / işlevleri geliştiriciden gizlemek için bir soyutlama olarak kullanılır, böylece programı uygulama görevine odaklanabilirler. Eşlemenin, işlem süresi açısından, cihaza veya dosyaya doğrudan erişim kadar her zaman etkili olmayabileceğini, ancak bunu yapmaktan her zaman daha az karmaşık olabileceğini unutmayın (örn. Eşleme, geliştiricinin verilere erişmek için yazması gereken özel kod miktarını azaltır ).


Açıklama için teşekkürler. Ancak "seyrek dizi" ne anlama geldiğini ve nasıl daha verimli olduğunu anlamadım.
Kais

@Kais Seyrek dizi, çoğunlukla sıfır değerlerden oluşan bir listedir. Seyrek bir dizi, hafızadaki tüm değerleri depolamak yerine, yalnızca sıfır olmayan değerleri hafızada saklar. Bunu yaparak, tüm belleği bir kerede tahsis etmekten daha verimlidir. Yerden tasarruf etmek için seyrek diziler tipik olarak yaklaşık% 75 boş olmalıdır. Sanal bellek genellikle bu şekilde çalışır, işletim sisteminin yalnızca "kirli" bellek sayfalarını ve yalnızca sıfır olmayan değerlere sahip sektörleri depolamanızı sağlayan dosya sistemlerini sakladığı yerde çalışır.
phyrfox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.