"แผนที่" หมายถึงอะไร


10

ฉันพบคำศัพท์หลายครั้งในสื่อการเรียนรู้ CS ต่าง ๆ :

  1. L2 CS162 (UC Berkeley):

    I / O ที่แมปหน่วยความจำ

  2. L4 CS162 (UC Berkeley):

    ไฟล์ที่แม็พหน่วยความจำ

  3. L24 CS61 (UC Berkeley):

    “ หน่วยความจำแมป I / O”: การควบคุมอุปกรณ์ / ข้อมูลลงทะเบียนแมปกับพื้นที่ที่อยู่ของ CPU

  4. แม้หลังจาก googling "map" ฉันก็ได้รับบทความ Map_ (สูงกว่า order_function)แต่มันก็ไม่ชัดเจนสำหรับฉัน
  5. ยิ่งกว่านั้นพยายามเข้าใจความหมายในบริบทของbitmapการอ่านบทความ Wikipedia :

    อาเรย์บิตคือการแมปจากบางโดเมน (เกือบตลอดช่วงของจำนวนเต็ม) ไปยังค่าในชุด {0, 1}

    ฉันไม่แน่ใจ แต่ในบริบทข้างต้นมันฟังดูเกี่ยวกับการแปลงข้อมูล

  6. หลังจากอ่านหนังสือ CS ฉันพบเฉพาะย่อหน้านี้ แต่ไม่ได้อธิบายความหมายของ "การแมป" สำหรับฉัน:

    Memory Mapping Linux (พร้อมกับ Unix ในรูปแบบอื่น ๆ ) เริ่มต้นเนื้อหาของพื้นที่หน่วยความจำเสมือนโดยเชื่อมโยงกับวัตถุบนดิสก์ซึ่งเป็นกระบวนการที่เรียกว่าการทำแผนที่หน่วยความจำ

  7. ฉันยังได้MapReduceเป็นผลการค้นหา: แผนที่อธิบายได้ว่า "สำนวนในการคำนวณแบบขนานซึ่งการดำเนินการอย่างง่ายถูกนำไปใช้กับองค์ประกอบทั้งหมดของลำดับอาจเป็นแบบคู่ขนาน"

ฉันยังคงสับสนเกี่ยวกับคำ ใครช่วยอธิบาย "แผนที่" ในบริบทที่ฉันพูดถึงได้บ้าง?

คำตอบ:


14

ดังนั้นจึงมีการใช้สองคำที่แตกต่างกันของคำว่า "แผนที่" ที่ฉันจะแกะที่นี่

  1. อันแรกนั้นเป็นเรื่องทั่วไปมากโดยที่แผนที่หมายถึง "การเชื่อมโยง" โดยเฉพาะอย่างยิ่งผ่านฟังก์ชัน ถ้าเราพูดว่า "แผนที่แต่ละเพื่อ " แล้วเรากำลังจะบอกว่า2xx2xx.(x)=2x

    การใช้งานนี้รวมถึง "การแมปหน่วยความจำ IO:" มีฟังก์ชั่น (แนวคิด) เชื่อมโยงหน่วยความจำแต่ละชิ้นกับการกระทำ IO โดยเฉพาะ ไม่มีใครเคยเขียนฟังก์ชั่นออกมา แต่มันมีอยู่ที่นั่นสำหรับหน่วยความจำที่แมปแต่ละชิ้นจะมี IO ที่เกี่ยวข้อง อาจเป็นส่วนหนึ่งของดิสก์อาจจะลงทะเบียนฮาร์ดแวร์บนอุปกรณ์ต่อพ่วง ฯลฯ

    ในทำนองเดียวกันบิตเรย์ (และอาร์เรย์โดยทั่วไป) ตกอยู่ในนี้: แต่ละดัชนีมีองค์ประกอบเดียวที่เกี่ยวข้องกับมัน (ณ เวลาใดก็ตาม) ดังนั้นอาร์เรย์จึงมีประสิทธิภาพการเข้ารหัสของฟังก์ชันโดเมน จำกัด

  2. ในการเขียนโปรแกรมการทำงานและอนุพันธ์ (เช่น MapReduce), แผนที่หมายถึงการใช้การแปลงข้ามโครงสร้าง

    ต้นฉบับmapมาจากเสียงกระเพื่อมซึ่งมันหมายถึงฟังก์ชั่นที่ใช้ฟังก์ชั่นอื่นและรายการและส่งกลับผลลัพธ์ของการใช้ฟังก์ชั่นกับแต่ละองค์ประกอบของรายการนั้น

    แต่ปรากฏการณ์นี้ค่อนข้างทั่วไป ใน Haskell โครงสร้างข้อมูลที่ยอมรับการดำเนินการเช่นนี้เรียกว่าfunctorและการดำเนินการนั้นเรียกว่าfmap (ด้วยเหตุผลทางประวัติศาสตร์เพื่อหลีกเลี่ยงความขัดแย้งกับแผนผังรายการ)

    ทั้งหมดนี้เกี่ยวข้องกับแนวคิดของFunctorจากทฤษฎีหมวดหมู่ซึ่งเป็นนามธรรมของโครงสร้างที่ยอมรับการดำเนินการ "แผนที่"


4
(สะกดผิดในFunctorชื่อการเชื่อมโยง - น้อยเกินไปที่จะแนะนำให้แก้ไข.)
จ้า

คำอธิบายที่ชัดเจนและยอดเยี่ยมมาก อย่างไรก็ตามฉันไม่เข้าใจ 'ฟังก์ชัน จำกัด ' หมายความว่าอะไร
Kais

1
@Kais 'function finite' ใช้กันมากที่สุดสำหรับฟังก์ชั่นที่ไม่มีการแมปองค์ประกอบกับอนันต์ ฉันเดา jmite ต้องการเน้นว่าอาร์เรย์นั้นเป็นฟังก์ชั่นการแมปชุดของดัชนี (ใช้ได้) กับค่าที่มีอยู่
Michael Hoff

2
การใช้ทั้งสองเป็นเพียงลักษณะของสิ่งเดียวกัน mapฟังก์ชั่นผลตอบแทนที่แต่ละองค์ประกอบมีความเกี่ยวข้องกับองค์ประกอบที่สอดคล้องกันของการป้อนข้อมูลที่ ความแตกต่างคือการใช้งานครั้งแรกอธิบายถึงความสัมพันธ์ที่มีอยู่ในขณะที่การใช้งานที่สองหมายถึงการดำเนินการที่สร้างความสัมพันธ์
Barmar

1
Typo: 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 Memory Mapped File I / O (MMF) เป็นอีกทางเลือกหนึ่งในการใช้การเรียก API ไฟล์มาตรฐาน อาจมีหรือไม่มีข้อได้เปรียบด้านประสิทธิภาพในการใช้ MMF มันขึ้นอยู่กับว่ากลไกของ MMF นั้นเหมาะกับวิธีการใช้เนื้อหาไฟล์ของคุณมากแค่ไหนและไฟล์มีขนาดใหญ่เพียงใด พื้นที่ MMF I / O หน้าของไฟล์ลงในหน่วยความจำในบล็อกขนาดใหญ่ คุณสามารถทำสิ่งที่คล้ายกับไฟล์ API และสร้างความแตกต่างด้านประสิทธิภาพที่สำคัญ ด้วยไฟล์ API I / O มาตรฐานมีแนวโน้มที่จะมีการคัดลอกจำนวนมากระหว่างบัฟเฟอร์หน่วยความจำจากพื้นที่เคอร์เนลไปยังพื้นที่ผู้ใช้ที่มักจะข้ามกับ MMF
Richard Chambers

1
@Kais ไม่แน่ใจว่าสิ่งที่คุณถาม การคัดลอกข้อมูลจากตำแหน่งหน่วยความจำหนึ่งไปยังอีกสถานที่หนึ่งต้องใช้เวลาและรอบการทำงานของ CPU ดังนั้นการลดการคัดลอกข้อมูลจะช่วยปรับปรุงประสิทธิภาพเมื่อเข้าถึงข้อมูล ไฟล์ I / O นั้นมีวัตถุประสงค์ทั่วไปและภายในจะทำการแคชและการเพจเนื้อหาของไฟล์ภายใน แต่โดยทั่วไปแล้วขนาดของบัฟเฟอร์หน่วยความจำจะเล็กกว่าที่ใช้กับ Memory Mapped File I / O ไฟล์ API มีแนวโน้มที่จะมุ่งเน้นไปที่ความนิยม I / O ของชิ้นเล็ก ๆ มากกว่าบล็อกขนาดใหญ่ การเข้าถึงแบบลำดับมีแนวโน้มที่จะได้รับการสนับสนุนด้วยการมองไปข้างหน้าภายในสแต็ก I / O ไฟล์และเคอร์เนล
Richard Chambers

1
@Kais ดังนั้นหากคุณสามารถให้คำแนะนำเกี่ยวกับไฟล์ I / O API คุณสามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันของคุณที่ใช้ไฟล์ I / O API เมื่อไฟล์ I / O เป็นคอขวดของประสิทธิภาพ และการใช้ Memory Mapped File I / O อาจช่วยได้โดยเฉพาะอย่างยิ่งกับการเข้าถึงและการดำเนินการตามลำดับส่วนใหญ่ที่อยู่ในขนาดหน้า MMF เดียว ดูเนื้อหาและลิงค์ที่ URL นี้เกี่ยวกับ I / O ระดับต่ำด้วย GNU C gnu.org/software/libc/manual/html_node/ซึ่งอธิบายกลไกระดับล่างของ GNU บางส่วน
Richard Chambers

1
@Kais ฉันได้เห็นการปรับปรุงประสิทธิภาพที่สำคัญกับ API ไฟล์ไลบรารี C Standard โดยใช้setbuf()ฟังก์ชันเพื่อตั้งบัฟเฟอร์ I / O ไฟล์ขนาดใหญ่ ทุกสิ่งที่คุณสามารถทำได้เพื่อลดการเข้าถึงอุปกรณ์เก็บข้อมูลมีแนวโน้มที่จะเป็นโบนัส สำหรับดิสก์ไดรฟ์ที่ลดจำนวนการค้นหาสามารถสร้างความแตกต่างใหญ่ แต่มีอิทธิพลจำนวนมากที่คุณไม่สามารถทำอะไรได้มากเช่นวิธีการจัดระเบียบข้อมูลบนจานดิสก์ความเร็วในการหมุนของจานความเร็วในการเคลื่อนที่ของหัว ข้อมูล, วิธีการที่แคชยอดนิยมลดลงไปที่ดิสก์เครื่องกลไฟฟ้า ฯลฯ
Richard Chambers

1

การทำแผนที่เป็นเพียงกระบวนการเชื่อมโยงข้อมูลหนึ่งหน่วยกับหน่วยข้อมูลอื่น จุดประสงค์ของการทำแผนที่คือการอนุญาตให้เข้าถึงข้อมูลที่แมปได้ง่ายขึ้น ตัวอย่างเช่นในระบบที่เข้ากันได้กับ IBM คลาสสิกที่อยู่หน่วยความจำ 0xB8000 ถูกแมปกับหน่วยความจำวิดีโอของการ์ดวิดีโอ การเขียนไปยังหน่วยความจำนี้จะอัพเดตเนื้อหาของหน้าจอและการอ่านจากนั้นจะดึงเนื้อหาของหน้าจอ การแมปไฟล์การแมปอุปกรณ์และการแมปโครงสร้างข้อมูล (โดยทั่วไปเรียกว่า Map, HashMap หรือ Dictionary) เป็นวิธีการเชื่อมโยงข้อมูลหนึ่งหน่วยกับข้อมูลหน่วยอื่น

การทำแผนที่มีสองประโยชน์หลัก อย่างแรกคือการจับคู่จะช่วยลดความซับซ้อนในการเข้าถึงอุปกรณ์หรือไฟล์ที่เกี่ยวข้อง ตัวอย่างเช่นการแมปไฟล์และการแมปอุปกรณ์ช่วยให้คุณจัดการอุปกรณ์เหล่านั้นราวกับว่าพวกเขาเป็นเพียงหน่วยความจำธรรมดา แทนที่จะเรียนรู้พอร์ต I / O ต่าง ๆ คำสั่งข้อมูลและอื่น ๆ คุณจะได้รับส่วนต่อประสานที่เรียบง่ายซึ่งมีความเป็นธรรมชาติและชัดเจนเหมือนกับการเขียนไปยัง RAM

ประโยชน์ที่สองคือสามารถลดความต้องการหน่วยความจำ ตัวอย่างเช่น a Map<Integer, SomeDataType>สามารถสร้าง "sparse array" ซึ่งเป็นประโยชน์ที่คุณต้องการอาร์เรย์ที่ส่วนใหญ่จะมีข้อมูลที่ไม่ถูกต้อง / ไม่ได้ใช้และสามารถเข้าถึงได้ในเวลาใกล้เชิงเส้น สิ่งนี้มีประสิทธิภาพมากกว่ารายการที่ลิงก์ (ซึ่งใช้เวลา O ( n ) ในการเข้าถึงองค์ประกอบn -th)

การทำแผนที่จะใช้เป็นนามธรรมเพื่อซ่อนอัลกอริทึม / ฟังก์ชั่นที่ซับซ้อนจากนักพัฒนาเพื่อให้พวกเขาสามารถมุ่งเน้นไปที่งานของการใช้งานโปรแกรม โปรดทราบว่าการทำแผนที่อาจไม่ได้มีประสิทธิภาพเสมอไปในแง่ของเวลาในการประมวลผลเช่นการเข้าถึงอุปกรณ์หรือไฟล์โดยตรง แต่มีความซับซ้อนน้อยกว่าการทำเช่นนั้น (เช่นการทำแผนที่ลดจำนวนรหัสพิเศษที่นักพัฒนาต้องเขียนเพื่อเข้าถึงข้อมูล )


ขอบคุณสำหรับคำอธิบาย อย่างไรก็ตามฉันไม่เข้าใจว่า "อาร์เรย์เบาบาง" หมายความว่าอะไรและมีประสิทธิภาพมากขึ้นอย่างไร
Kais

@Kais อาร์เรย์แบบกระจายเป็นรายการที่ประกอบด้วยค่าศูนย์ส่วนใหญ่ แทนที่จะเก็บค่าทั้งหมดในหน่วยความจำอาร์เรย์จะกระจายค่าที่ไม่เป็นศูนย์ในหน่วยความจำเท่านั้น การทำเช่นนี้จะมีประสิทธิภาพมากกว่าการจัดสรรหน่วยความจำทั้งหมดในครั้งเดียว โดยทั่วไปแล้วอาร์เรย์ที่กระจัดกระจายควรว่างเปล่าประมาณ 75% เพื่อประหยัดพื้นที่ หน่วยความจำเสมือนมักจะทำงานในลักษณะนี้เช่นกันโดยที่ระบบปฏิบัติการเก็บหน้าหน่วยความจำ "สกปรก" เท่านั้นรวมถึงระบบไฟล์ที่อนุญาตให้คุณจัดเก็บเฉพาะส่วนที่มีค่าไม่เป็นศูนย์เท่านั้น
phyrfox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.