คำถามติดแท็ก mmap

6
เมื่อใดที่ฉันควรใช้ mmap สำหรับการเข้าถึงไฟล์
สภาวะแวดล้อม POSIX จัดเตรียมการเข้าถึงไฟล์อย่างน้อยสองวิธี มีมาตรฐานสายระบบopen(), read(), write()และเพื่อน ๆ แต่ยังมีตัวเลือกของการใช้mmap()เพื่อแมไฟล์ลงในหน่วยความจำเสมือน เมื่อใดควรเลือกใช้อีกอันหนึ่ง อะไรคือข้อดีของแต่ละบุคคลที่รวมทั้งสองอินเทอร์เฟซ
276 c  file-io  posix  mmap 

12
mmap () เทียบกับการอ่านบล็อค
ฉันกำลังทำงานกับโปรแกรมที่กำลังประมวลผลไฟล์ที่อาจมีขนาด 100GB ขึ้นไป ไฟล์มีชุดของบันทึกความยาวแปรผัน ฉันได้ติดตั้งและใช้งานเป็นครั้งแรกและตอนนี้ฉันกำลังมองไปที่การปรับปรุงประสิทธิภาพโดยเฉพาะอย่างยิ่งในการทำ I / O ที่มีประสิทธิภาพมากขึ้นเนื่องจากไฟล์อินพุตได้รับการสแกนหลายครั้ง มีกฎง่ายๆในการใช้mmap()กับการอ่านในบล็อกผ่านfstreamห้องสมุดของ C ++ ? สิ่งที่ฉันต้องการจะทำคืออ่านบล็อกขนาดใหญ่จากดิสก์ไปยังบัฟเฟอร์ประมวลผลระเบียนที่สมบูรณ์จากบัฟเฟอร์แล้วอ่านเพิ่มเติม mmap()รหัสอาจจะได้รับมากยุ่งตั้งแต่mmap'd บล็อกต้องนอนบนหน้าขอบเขตขนาด (ความเข้าใจของฉัน) และมีการบันทึกอาจเหมือนข้ามเขตแดนหน้า ด้วยfstreams ฉันสามารถค้นหาจุดเริ่มต้นของการบันทึกและเริ่มอ่านอีกครั้งเนื่องจากเราไม่ จำกัด เฉพาะการอ่านบล็อกที่วางอยู่บนขอบเขตขนาดหน้า ฉันจะตัดสินใจเลือกระหว่างสองตัวเลือกนี้ได้อย่างไร กฎของหัวแม่มือใด ๆ (เช่นmmap()เร็วกว่า 2x) หรือการทดสอบอย่างง่าย?
185 c++  file-io  fstream  mmap 

2
ไม่คาดหวังสิทธิ์เรียกใช้จาก mmap เมื่อไฟล์ประกอบรวมอยู่ในโครงการ
ฉันกระแทกหัวของฉันกับกำแพงด้วยสิ่งนี้ ในโครงการของฉันเมื่อฉันจัดสรรหน่วยความจำด้วยmmapการจับคู่ ( /proc/self/maps) แสดงให้เห็นว่ามันเป็นพื้นที่ที่สามารถอ่านได้และปฏิบัติการได้แม้ว่าฉันจะขอหน่วยความจำที่สามารถอ่านได้เท่านั้น หลังจากตรวจสอบ strace (ซึ่งดูดี) และการดีบักอื่น ๆ ฉันสามารถระบุสิ่งเดียวที่ดูเหมือนว่าจะหลีกเลี่ยงปัญหาแปลก ๆ นี้ได้: การลบไฟล์ชุดประกอบออกจากโครงการและปล่อยให้เฉพาะ C. บริสุทธิ์ (อะไร?!) ดังนั้นนี่คือตัวอย่างที่แปลกประหลาดของฉันฉันกำลังทำงานบน Ubunbtu 19.04 และ gcc เริ่มต้น หากคุณรวบรวมเป้าหมายไฟล์ที่เรียกใช้งานได้ด้วยไฟล์ ASM (ซึ่งว่างเปล่า) mmapจะส่งคืนพื้นที่ที่สามารถอ่านได้และสามารถเรียกใช้งานได้หากคุณสร้างโดยไม่ต้องดำเนินการอย่างถูกต้อง ดูผลลัพธ์/proc/self/mapsที่ฉันได้ฝังในตัวอย่างของฉัน example.c #include <stdio.h> #include <string.h> #include <sys/mman.h> int main() { void* p; p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0); { FILE *f; char line[512], s_search[17]; …
94 c  linux  assembly  mmap 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.