Teen concrete WHYs jo aapko zor se bol paane chahiye:
Double-copying avoid karo — private buffer mein copy karne ki jagah kernel page cache share karo.
Random access free ho jaata hai — byte 5,000,000 par jaana sirf ptr[5000000] hai, koi lseek nahi.
Lazy loading (demand paging) — ek 4 GB mapped file practically kuch nahi cost karti jab tak aap ek page touch nahi karte; sirf wahi pages load hote hain jo aap access karte ho.
Hum behaviour ko ek fact se derive karte hain: virtual memory pehle se hi virtual pages ko physical frames se page table ke zariye map karta hai, page fault par unhe fill karta hai. Memory-mapping sirf yeh badalta hai ki kya ek page ko back karta hai.
Step 1 — call bookkeeping setup karti hai, data nahi.mmap ek Virtual Memory Area (VMA) banata hai: "virtual range [V,V+L) file region [off,off+L) ke corresponding hai." Yeh step kyun? Page-table entries ko "not present" set karna OS ko poora real kaam defer karne deta hai — abhi kuch bhi nahi padha jaata.
Step 2 — pehla touch ek page fault cause karta hai.
Aap ptr[k] padhte ho. CPU page-table entry ko not present mark hua paata hai → page fault → kernel mein trap. Kyun? Yeh woh hook hai jo OS ko notice karne deta hai ki "aap woh data chahte ho jo loaded nahi hai."
Step 3 — fault handler file se load karta hai.
Handler compute karta hai ki woh virtual address kaunsi file page se correspond karta hai, usse disk se ek physical frame mein read karta hai (aksar woh pehle se page cache mein hai → zero disk I/O), aur page-table entry install karta hai. Faulting instruction re-execute hoti hai aur ab succeed karti hai. Kyun re-execute? Taaki program oblivious rahe — use sirf ek normal memory access dikhti hai jo "ek baar slow hua tha."
Step 4 — writes page ko dirty mark karti hain.MAP_SHARED ke saath, likhna dirty bit set karta hai. Kyun? Taaki OS jaane ki yeh page disk se alag hai aur baad mein write back kiya jaana chahiye (msync, munmap, ya reclaim hone par).
Mapping arithmetic jo aapko reproduce kar paana chahiye:
virtual addr Va⇒file offset=off+(Va−Vbase)page number=⌊PVa−Vbase⌋,P=page size (typ. 4096 B)
Yeh step kyun? Kyunki OS sab kuch page boundaries par align karta hai; yeh samajhna explain karta hai ki offsetP ka multiple kyun hona chahiye.
MAP_SHARED map karta hai aur byte 0 par 'X' likhta hai. Process B ke paas wahi file MAP_SHARED mapped hai. Kya B ko 'X' dikhega? Agar B ne MAP_PRIVATE use kiya hota to?
MAP_SHARED: Haan — dono same page-cache frame map karte hain, isliye B ko 'X' instantly dikhai deta hai (koi disk round-trip zaruri nahi).
MAP_PRIVATE: Nahi — B ke pehle write par use ek copy-on-write private copy milti hai; A ke writes (aur B ke bhi) ek doosre ko visible nahi hote. (Un pages ke reads ke liye jo B ne kabhi nahi likha, B shayad A ka data tab bhi dekhe jab tak COW trigger na ho — implementation-dependent hai, isliye is par rely mat karo.)
Recall Feynman: ek 12-saal ke bacche ko explain karo
Ek library mein ek behad badi kitaab imagine karo. Normally use padhne ke liye aap jo bhi page chahiye use photocopy karte ho aur copies ghar le jaate ho — slow aur wasteful. Memory-mapping aisa hai jaise aapko jadu ka chashma mile: aap use pehenate ho aur kitaab seedhi aapki table par appear ho jaati hai. Lekin trick yeh hai ki pages blank rehte hain jab tak aap actually kisi ko dekhte nahi — jis pal aapki nazar kisi page par padti hai, woh instantly fill ho jaata hai (yahi "page fault" hai). Agar aap "shared" chashme se kisi page par koi note likhte ho, toh wahi shared chashma pehnne wala aapka dost bhi aapka note dekh sakta hai, kyunki aap dono same page dekh rahe ho, copies nahi.
SIGBUS and SIGSEGV — woh faults jo tab aate hain jab mapping galat use ho.
mmap file ko kya appear karata hai?
Process ke virtual address space ka ek region, jise read/write syscalls ki jagah pointers ke zariye access kiya jaata hai.
mmap, read() se repeated access ke liye faster kyun hai?
Yeh kernel page cache se private user buffer mein copy karna avoid karta hai — process seedha page cache par point karta hai.
mmap ke andar file pages actually kab load hote hain?
Lazily, pehle access par, page fault ke zariye (demand paging) — mmap() ke time par nahi.
MAP_SHARED aur MAP_PRIVATE mein kya fark hai?
SHARED: writes file mein jaate hain aur doosre mappers ko visible hote hain. PRIVATE: copy-on-write, writes local rehte hain aur file ko kabhi hit nahi karte.
mmap ke offset argument par kya constraint lagti hai?
Yeh system page size ka multiple hona chahiye (jaise 4096), warna EINVAL.