หน่วยความจำเสมือนจริงเพิ่มพื้นที่หน่วยความจำได้อย่างไร


70

ฉันเข้าใจว่าหน่วยความจำเสมือนเสียโปรแกรมโดยการแสดงหน่วยความจำมากกว่าที่มีอยู่จริง

แต่ในท้ายที่สุดมันจะต้องแมปโลจิคัลแอดเดรสกับฟิสิคัลแอดเดรสจริง ตอนนี้มันจะเพิ่มหน่วยความจำได้อย่างไร


12
นั่นคือแนวคิดเก่า แรงจูงใจดั้งเดิมสำหรับหน่วยความจำเสมือนเป็นรูปแบบหนึ่งของการจัดการหน่วยความจำเพื่อให้มีพื้นที่ที่อยู่มากกว่าหน่วยความจำกายภาพ แต่นั่นคือเมื่อหน่วยความจำมีความหนาแน่นต่ำและมีราคาแพงมาก ทุกวันนี้สาเหตุหลักของการใช้หน่วยความจำเสมือนคือเพื่อความปลอดภัยของกระบวนการ
ขี้เลื่อย

2
"ตอนนี้มันเพิ่มหน่วยความจำได้อย่างไร" มันไม่ได้ แอปพลิเคชันไม่ทราบถึงหน่วยความจำกายภาพของระบบ แต่รับรู้ถึงหน่วยความจำเสมือนเท่านั้นซึ่งเป็นสาเหตุเมื่อแอปพลิเคชันบ่นว่ามีหน่วยความจำไม่เพียงพอที่จะพูดถึงหน่วยความจำเสมือนจริงและไม่ใช่หน่วยความจำกายภาพ
Ramhound

2
โปรดจำไว้ว่าระบบหน่วยความจำเสมือนนั้นค่อนข้างฉลาด หากกระบวนการ n มีหน้าแบบอ่านอย่างเดียวกระบวนการ n ทั้งหมดสามารถใช้หน้าเดียวของหน่วยความจำกายภาพ
Eric Lippert

65
อย่าคิดถึงหน่วยความจำเสมือนว่าหลอกอะไร หน่วยความจำคือความสามารถที่เป็นนามธรรมในการจัดเก็บและเรียกข้อมูล หน่วยความจำเสมือนให้การใช้งานสำหรับสิ่งที่เป็นนามธรรม ส่วนหนึ่งของสิ่งที่เป็นนามธรรมนั้นได้รับการสนับสนุนโดย RAM และบางส่วนได้รับการสนับสนุนจากดิสก์นั้นเป็นรายละเอียดการนำไปปฏิบัติของสิ่งที่เป็นนามธรรม
Eric Lippert

4
@HagenvonEitzen ไม่แน่ใจว่าหน่วยความจำ "อยู่เสมอ" บนดิสก์ ... นอกเหนือจากหน้าแรกที่อ่านจากดิสก์เว้นแต่ว่าหน้าจะถูกสับเปลี่ยนเนื้อหาอาจไม่เคยอยู่ในดิสก์และนี่เป็นจริงสำหรับหน้าเว็บที่ถูกตรึงในหน่วยความจำเช่น เนื่องจากมีความสำคัญต่อการทำงานของเคอร์เนล
Michael

คำตอบ:


116

มันไม่ได้เพิ่มหน่วยความจำทางกายภาพเลย จุดประสงค์ของมันคืออย่างอื่นทั้งหมด สิ่งที่สามารถทำได้คือทำให้มีร้านค้าสำรองอื่น ๆ ที่อนุญาตให้โปรแกรมใช้หน่วยความจำมากกว่าที่มีอยู่จริง

หน่วยความจำเสมือนถูกใช้เพื่อแยกและแยกกระบวนการออกจากกันและยังอนุญาตให้เข้าถึงหน่วยความจำเพื่อเบี่ยงเบนไปยังตำแหน่งอื่น

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

พื้นที่หน่วยความจำเสมือนของแอปพลิเคชันถูกสร้างขึ้นตามต้องการ แอปพลิเคชั่นดูเหมือนว่าจะอยู่ในบล็อกของหน่วยความจำที่ต่อเนื่องกัน แต่จริงๆแล้วอาจกระจัดกระจายไปทั่วในหน่วยความจำกายภาพ

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

ในทำนองเดียวกับที่ใช้ไฟล์เพจหน่วยความจำเสมือนสามารถอนุญาตให้ระบบปฏิบัติการทำสิ่งที่มีประสิทธิภาพในการโหลด "ขี้เกียจ" ของไลบรารีที่แบ่งใช้สำหรับโปรแกรม เมื่อโปรแกรมหลักบอกระบบปฏิบัติการว่าต้องการใช้ไลบรารีเฉพาะระบบปฏิบัติการจะสามารถประหยัดเวลาได้โดยการตรวจสอบข้อกำหนดของไลบรารีการจัดสรรพื้นที่ในพื้นที่หน่วยความจำเสมือนสำหรับแอปพลิเคชัน แต่แทนที่จะโหลดทั้งไลบรารี ในมันสามารถเลื่อนการโหลดหน้าของห้องสมุดในจากดิสก์จนกว่าพวกเขาจะต้องการจริง ด้วยวิธีนี้มีเพียงบางส่วนของไลบรารีที่โหลดลงใน RAM คือชิ้นส่วนที่ใช้งานจริงโดยโปรแกรมส่วนที่ไม่เคยใช้ไม่เคยโหลดและไม่ต้องเสีย RAM

การใช้เทคนิคเหล่านี้เราปรับปรุงเสถียรภาพของระบบและอนุญาตให้กระบวนการทำงานในพื้นที่ จำกัด โดยไม่ส่งผลกระทบซึ่งกันและกันอย่างไม่เหมาะสม มันไม่ได้ "เพิ่มหน่วยความจำ" แต่ให้เราใช้สิ่งที่เรามีอย่างมีประสิทธิภาพแทน

ไฟล์ swap ถูกเปิดใช้งานโดยระบบหน่วยความจำเสมือน แต่ในอดีตที่ผ่านมาสับสนว่าเป็นหน่วยความจำเสมือน


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Sathyajith Bhat

21

คำอธิบายของคนธรรมดา

ระบบจะมีการ map แต่ละที่อยู่เสมือนที่อยู่ทางกายภาพเมื่อหน่วยความจำที่ใช้ แต่หน่วยความจำไม่ทั้งหมดจะถูกนำมาใช้ในเวลาเดียวกัน ตัวอย่างเช่นสมมติว่าคุณมี 20 แท็บในเบราว์เซอร์ของคุณแต่ละหน่วยความจำ 1GB ในระบบปฏิบัติการที่ไม่มีการสนับสนุนหน่วยความจำเสมือนคุณจะต้องใช้ RAM 20GB เพื่อให้สามารถใช้งานได้ เคล็ดลับคือคุณไม่เรียกดูแท็บทั้งหมด 20 แท็บในเวลาเดียวกันดังนั้นระบบปฏิบัติการที่มีหน่วยความจำเสมือนจะช่วยให้คุณใช้เบราว์เซอร์ของคุณเช่นนั้นด้วย RAM เพียงสอง GB, การสลับแท็บที่ไม่ใช้งานไปยังดิสก์

ด้านที่ซับซ้อนมากขึ้น

หน่วยความจำเสมือนไม่ได้ใช้เพื่อแลกเปลี่ยนเท่านั้น วัตถุประสงค์หลักคือเพื่อหลีกเลี่ยงการแตกแฟรกเมนต์ RAM ซึ่งเป็นปัญหาใหญ่ในระบบที่ไม่มีการจัดการหน่วยความจำเสมือน: คุณอาจมี RAM ฟรี 1GB แต่ถ้ามีหน่วยเป็น 10MB แอปพลิเคชันที่ร้องขอ 100MB จะไม่สามารถทำงานได้ .

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


9
เป็นเรื่องน่าเศร้าที่เราอยู่ในโลกที่แต่ละแท็บเบราว์เซอร์ต้องการหน่วยความจำ 1GB
2560

9
@tbodt ฉันโทษชาวอียิปต์โบราณ ถ้าเพียง แต่พวกเขารู้ว่าสิ่งที่พวกเขากำลังทำโดยการเลี้ยงแมวที่น่ารำคาญ!
Dmitry Grigoryev

@todod มันเป็นเรื่องที่พูดเกินจริงเกินไป เบราว์เซอร์ของฉันที่มี 8 แท็บเปิดอยู่ใช้หน่วยความจำเพียง 500MB เท่านั้น
Random832

2
@ Random832 แน่นอนว่ามันเป็นการพูดเกินจริง แต่ฉันไม่แน่ใจเกี่ยวกับเส้นแบ่งระหว่างการพูดเกินจริงและเป็นการพิสูจน์ในอนาคต พีซีเครื่องแรกของฉันมี RAM ขนาด 32 MB และฉันสามารถเปิด 8 แท็บใน Opera ได้อย่างง่ายดาย ตอนนี้ใช้เวลา 500MB ดังนั้นในอีก 20 ปีก็อาจถึง 8GB
Dmitry Grigoryev

5

หน่วยความจำเสมือนไม่เพิ่มหน่วยความจำในความเป็นจริงเพิ่มฮาร์ดแวร์หน่วยความจำหลักเพิ่มเติม แต่สามารถเพิ่มช่วงของที่อยู่ที่ใช้งานได้ ดังนั้นหนึ่งอาจมีโปรแกรมที่ทำงานอยู่ซึ่งประกอบด้วยส่วนรหัสและส่วนข้อมูล (กอง & กอง) และทั้งสองนี้สามารถครอบครองช่วงของที่อยู่เสมือนขนาดใหญ่กว่าช่วงของที่อยู่ทางกายภาพที่จัดทำโดยพื้นที่เก็บข้อมูลจริงทางกายภาพของ เครื่อง เคล็ดลับคือว่ามีเพียงส่วนเล็ก ๆ ของที่อยู่เสมือนผู้ที่ได้รับการสนับสนุนจากทางหลักหน่วยความจำในช่วงเวลาใด[ แต่ทุกอย่างได้รับการสนับสนุนโดยในท้ายที่สุดการจัดเก็บดิสก์] สิ่งนี้ใช้งานได้เนื่องจากปรากฏการณ์ของสถานที่อ้างอิง: ทุกเวลาคำสั่งในส่วนเล็ก ๆ ที่ต่อเนื่องกันของส่วนโปรแกรมจะถูกดำเนินการและมีเพียงข้อมูลในส่วนต่อเนื่องขนาดเล็กหนึ่งส่วนหรือมากกว่าของส่วนข้อมูลที่มีการดำเนินการตาม[แน่นอนพฤติกรรมจริงซับซ้อนมากขึ้น แต่มันจะเป็นไปตามรูปแบบนี้ในเวลาส่วนใหญ่]


4

ฉันเข้าใจว่าหน่วยความจำเสมือนเสียโปรแกรมโดยการแสดงหน่วยความจำมากกว่าที่มีอยู่จริง

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

แต่ในท้ายที่สุดมันจะต้องแมปโลจิคัลแอดเดรสกับฟิสิคัลแอดเดรสจริง ตอนนี้มันจะเพิ่มหน่วยความจำได้อย่างไร

หน่วยความจำเสมือนได้รับการพัฒนาจากเทคนิคที่ให้พื้นที่ที่อยู่เพิ่มเติมสำหรับโปรแกรม
หน่วยความจำเสมือนเป็นองค์ประกอบสำคัญในการรักษาความปลอดภัยให้กับแต่ละกระบวนการในระบบปฏิบัติการที่ทันสมัยเพื่อให้กระบวนการไม่สามารถเข้าไปยุ่งเกี่ยวกับกระบวนการอื่นและไม่ถูกบุกรุกโดยกระบวนการอื่น
แต่ multiprocessing (อย่าสับสนกับ multiprocess ORS ) กับหน่วยความจำเสมือนยังไม่ให้หน่วยความจำที่ชัดเจนมากขึ้นกว่าระบบหน่วยความจำกายภาพ

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

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

หน่วยความจำเสมือนช่วยให้การใช้งานหน่วยความจำกายภาพ จำกัด อย่างมีประสิทธิภาพระหว่างกระบวนการต่าง ๆ แต่ละกระบวนการมีพื้นที่ที่อยู่เสมือนที่มีการป้องกันของตัวเอง ผลรวมของหน่วยความจำเสมือนเหล่านี้โดยทั่วไปจะมีขนาดใหญ่กว่าหน่วยความจำกายภาพที่ติดตั้ง
ตอนนี้ "หน่วยความจำที่เพิ่มขึ้น" มาจากมุมมองของระบบไม่ใช่เฉพาะมุมมองของโปรแกรม


3

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

ในทางปฏิบัติเรายังต้องการให้โปรแกรมทำงานอย่างรวดเร็ว สำหรับการพิจารณาความเร็วเราจะดูแลว่าข้อมูลอยู่ที่ไหน เราต้องการข้อมูลที่เราเข้าถึงบ่อยที่สุดเพื่อเก็บไว้ในฮาร์ดแวร์ซึ่งอนุญาตการเข้าถึงที่เร็วที่สุด โปรแกรมของเราต้องการใช้งาน DRAM โดยสิ้นเชิง อย่างไรก็ตามเรามักจะมี DRAM ไม่เพียงพอที่จะทำเช่นนี้ หน่วยความจำเสมือนเป็นทางออก

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

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

if data is not in memory
    read data from disk into memory
operate on data

ผู้อ่านที่ชาญฉลาดจะสังเกตเห็นว่าแม้ว่าข้อมูลนั้นอยู่ในหน่วยความจำเราต้องมีเงื่อนไขในการตรวจสอบว่ามีข้อมูลอยู่หรือไม่ ช้ากว่าการใช้งานหน่วยความจำโดยตรง

หน่วยความจำเสมือนแก้ปัญหานี้ได้ด้วยการทำฮาร์ดแวร์เช็คอินบน CPU ซีพียูอยู่ในตำแหน่งที่จะทำการดำเนินการหน่วยความจำเสมือนนี้อย่างรวดเร็วมากเพราะสามารถอุทิศฮาร์ดแวร์ให้กับมัน ความพยายามใด ๆ ในการทำสิ่งนี้ในซอฟต์แวร์เพียงอย่างเดียวจะต้องใช้ชิ้นส่วนวัตถุประสงค์ทั่วไปของ CPU ซึ่งช้ากว่าทรานซิสเตอร์โดยเฉพาะ

สิ่งนี้นำไปสู่สาเหตุที่เราหน้าข้อมูลกลับเข้าไปในหน่วยความจำมากกว่าเพียงแค่อ่านจากดิสก์และปล่อยไว้ที่นั้น เราแบ่งหน่วยความจำออกเป็น "หน้า" ซึ่งแต่ละอันถูกทำเครื่องหมายว่ามีอยู่หรือไม่อยู่ในหน่วยความจำ ระบบปฏิบัติการรักษาตารางนี้ในรูปแบบที่สะดวกสำหรับ CPU ที่จะใช้โดยตรง เมื่อใดก็ตามที่โปรแกรมเข้าถึงข้อมูลที่มีอยู่ฮาร์ดแวร์บน CPU จะช่วยให้พวกเขาสามารถเข้าถึงข้อมูลใน DRAM ได้โดยตรง เมื่อไม่มีข้อมูลจะมีการออก "page fault" โดยบอกให้ระบบปฏิบัติการโหลดหน้านั้นออกจากดิสก์ไปยังหน้าหน่วยความจำบางหน้าและอัพเดตตารางเพื่อชี้ CPU ไปที่หน้าทางกายภาพใหม่นี้

กุญแจสำคัญของปัญหานี้คือการลดการใช้งานให้น้อยที่สุด ในทางปฏิบัติเราพบว่าระบบปฏิบัติการดีมากในการเลือกข้อมูลที่จะเก็บไว้ในหน่วยความจำและข้อมูลใดที่จะนำหน้าออกสู่ดิสก์ดังนั้นหน่วยความจำส่วนใหญ่จึงเข้าใช้งานได้โดยไม่ทำให้เกิดความผิดพลาดหน้า


2

มันทำได้โดยการทำรายการแผนที่ชั่วคราว

เมื่อโปรแกรมเข้าถึงที่อยู่แบบลอจิคัลซีพียูจะค้นหาแผนที่ทางกายภาพสำหรับที่อยู่ทางกายภาพที่สอดคล้องกัน หากพบการเข้าถึงหน่วยความจำดำเนินการตามที่คาดไว้; หากไม่พบจะต้องจัดสรรที่อยู่จริงและเนื้อหาที่โหลดจากที่เก็บข้อมูลอื่น - "พื้นที่สว็อป" หากที่อยู่ทางกายภาพทั้งหมดได้รับการจัดสรรไปยังที่อยู่ทางตรรกะบางแห่งแล้วที่อยู่ทางตรรกะบางแห่งจะต้อง "สลับออก" (เนื้อหาที่บันทึกไว้กลับไปที่พื้นที่สว็อป) เพื่อให้ที่อยู่ทางกายภาพพร้อมใช้งาน

หน่วยความจำที่จัดสรรสูงสุดคือขนาดของพื้นที่สว็อปซึ่งอาจใหญ่กว่าหน่วยความจำที่ติดตั้งมาก อาจเป็นประโยชน์หากคิดว่าพื้นที่สว็อปเป็นหน่วยความจำ "ของจริง" และ RAM เป็นแคชความเร็วสูงสำหรับพื้นที่สว็อป

(นี่ยังห่างไกลจากคำอธิบายที่ละเอียดมีจุดมุ่งหมายเพื่อตอบคำถามทันทีโดยไม่ต้องลงรายละเอียดที่เกี่ยวข้อง แต่ไม่จำเป็น)


1

แนวคิดพื้นฐานนั้นอาศัยความจริงที่ว่า CPU สมัยใหม่สามารถจัดการตารางการแปลที่ติดตาม "ช่วงที่อยู่ใดที่มีกระบวนการบางอย่างที่ถูกจัดสรรให้ใช้งานและที่อยู่ทางกายภาพใด (คิดว่า A00 ..Axx บรรทัดบนบัสหน่วยความจำ) ปัจจุบันใช้เพื่อจัดเก็บข้อมูลจริง ๆ "ถ้ามี" เพราะ "ไม่มีเลย" เป็นสถานะที่เป็นไปได้และเป็นที่ยอมรับ: ในกรณีนี้เงื่อนไขข้อผิดพลาด (ที่เรียกว่า "page fault") จะถูกยกระดับฮาร์ดแวร์ - และข้อผิดพลาดนี้จะทริกเกอร์ตัวจัดการระดับ OS ที่สามารถโหลดเนื้อหาหน่วยความจำที่เขียนไปยังไฟล์ swap กลับไปยังตำแหน่งว่างในหน่วยความจำกายภาพ (ในกรณีที่อ่าน) หรือค้นหาตำแหน่งที่แท้จริงเพื่อใส่สิ่งของ (ใน กรณีของการเขียน) อัปเดตตารางการแปลข้างต้นและมีเพียงมือควบคุมกลับไปยังกระบวนการที่พยายามเข้าถึงหน่วยความจำนั้น .. และจะไม่มีใครรู้ว่าเกิดอะไรขึ้น


1

หน่วยความจำเสมือน:

1) อนุญาตให้มีการแมปพื้นที่ที่อยู่เสมือนขนาดใหญ่กับหน่วยความจำฟิสิคัลจำนวนน้อยโดยมี "การสลับ" กับดิสก์หรือ SSD ส่วนเกินหรือ NVRAM และอุปกรณ์อื่น ๆ

2) อนุญาตให้พื้นที่ที่อยู่เสมือนที่ใหญ่กว่า (เช่น 64- บิต) ถูกแมปกับพื้นที่ที่อยู่ทางกายภาพที่เล็กลง (เช่น 32 หรือ 64 บิต)

3) อนุญาตให้พื้นที่ที่อยู่เสมือนที่เล็กกว่า (เช่น 32 บิต) ถูกแมปกับพื้นที่ที่อยู่ทางกายภาพที่ใหญ่ขึ้น (เช่น 40 บิต) และทำให้แอปพลิเคชันรุ่นเก่าสามารถใช้ประโยชน์จาก DRAM ทางกายภาพได้มากกว่า

4) ช่วยให้หน่วยความจำกายภาพที่เราแยกส่วนและไม่ติดกันในพื้นที่ที่อยู่ทางกายภาพที่จะแสดงผลต่อเนื่องกันในพื้นที่ที่อยู่เสมือน

5) ช่วยให้กระบวนการที่จะได้รับพื้นที่ที่อยู่เสมือนของตัวเองและด้วยเหตุนี้จะแยกออกจากกัน

6) ช่วยให้ที่อยู่เสมือนที่แตกต่างกันที่เกิดขึ้นเพื่อแบ่งปันค่าข้อมูลเดียวกันในการจัดสรรหน้าทางกายภาพเดียว

สิ่งนี้สามารถเกิดขึ้นได้ในกระบวนการเดียวหรือระบบปฏิบัติการ - ระบบปฏิบัติการ BSD UNIX ส่วนใหญ่มีหน้าเป็นศูนย์แบบอ่านอย่างเดียวที่สามารถแมปเข้ากับหน้าเสมือนใด ๆ ที่ไม่เติมศูนย์โดยทั่วไปคือ COW (คัดลอกเมื่อเขียน - อ่านอย่างเดียว และหน้ายกเลิกการแบ่งปันและเขียนได้)

มันสามารถเกิดขึ้นระหว่างกระบวนการ - เช่น UNIX fork () สร้างกระบวนการลูกที่ใช้หน่วยความจำเสมือนเกือบทั้งหมดในลักษณะวัว

มันสามารถเกิดขึ้นได้ระหว่าง OS ต่างๆเช่นเกสต์เกสต์บนโฮสต์เครื่องเสมือนสามารถมีหน้าที่ซ้ำซ้อน COW ที่ใช้ร่วมกัน ฯลฯ (การโจมตีด้านความปลอดภัยล่าสุดบางครั้งใช้ประโยชน์จากสิ่งนี้)

7) หน่วยความจำเสมือนสามารถอนุญาตให้บางส่วนของพื้นที่ที่อยู่เสมือนถูกแมปไปยังไฟล์หรือหน่วยความจำที่แมปกับโปรเซสเซอร์อื่น ๆ ไม่ว่าจะในระบบมัลติโปรเซสเซอร์เดียวกันหรือทั่วอินเทอร์เน็ต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.