หน่วยความจำเสมือนคืออะไร?


27

ฉันกำลังตรวจสอบบันทึกย่อของฉันสองครั้งสำหรับ 'หน่วยความจำเสมือน' และคำจำกัดความในหนังสือเรียนของฉันคือ:

กระบวนการจัดสรรส่วนของหน่วยเก็บข้อมูลรองเพื่อทำหน้าที่เป็นส่วนหนึ่งของหน่วยความจำหลัก

ขณะที่วิกิพีเดียบอกว่า:

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

และ (วิกิพีเดียก็บอกว่า)

โปรดทราบว่า "หน่วยความจำเสมือน" เป็นมากกว่า "การใช้พื้นที่ดิสก์เพื่อขยายขนาดหน่วยความจำกายภาพ"

ใครบ้างที่สามารถให้ความกระจ่างในสิ่งที่ถูกต้อง?


ฉันเชื่อว่าบันทึกจากวิกิพีเดียมีคุณสมบัติบางประการเกี่ยวกับสิ่งที่ใช้ในแง่ของสิ่งต่าง ๆ ที่ต่อเนื่องกัน
JB King

คำถามนี้อาจจะได้คำตอบที่ดีกว่าสำหรับ SO
Captain Segfault

2
อย่าสับสนว่าหน่วยความจำเสมือนนั้นมีการใช้งานอย่างไร ประโยคที่ 1 ของ Wikipedia กำหนดว่ามันคืออะไร หนังสือของคุณกำลังพูดถึงวิธีการใช้งานตามปกติ เมื่อผู้คนพูดถึง "หน้า" พวกเขากำลังพูดถึงการนำหน่วยความจำเสมือนมาใช้โดยเฉพาะ
Tony Lee

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

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

คำตอบ:


41
Note that "virtual memory" is more than just "using disk space to extend physical memory size"

หน่วยความจำเสมือนเป็นเลเยอร์ของสิ่งที่เป็นนามธรรมที่จัดเตรียมให้กับแต่ละกระบวนการ คอมพิวเตอร์มี RAM จริง 2 กิกะไบต์ที่ส่งจาก 0 ถึง 2G กระบวนการอาจเห็นพื้นที่ที่อยู่ขนาด 4GB ซึ่งมีอยู่ทั้งหมด การแมปจากที่อยู่เสมือนไปยังที่อยู่ทางกายภาพได้รับการจัดการโดยหน่วยการจัดการหน่วยความจำซึ่งจัดการโดยระบบปฏิบัติการ โดยทั่วไปแล้วจะทำใน 4KB "หน้า"

สิ่งนี้มีคุณสมบัติหลายอย่าง:

  1. กระบวนการไม่สามารถมองเห็นหน่วยความจำในกระบวนการอื่น (เว้นแต่ระบบปฏิบัติการต้องการ!)
  2. หน่วยความจำที่อยู่เสมือนที่ระบุอาจไม่อยู่ในที่อยู่จริงเดียวกัน
  3. หน่วยความจำที่อยู่เสมือนสามารถ "เพจเอาต์" ไปยังดิสก์แล้ว "เพจใน" เมื่อมีการเข้าถึงอีกครั้ง

ตำราของคุณกำหนดหน่วยความจำเสมือน (ไม่ถูกต้อง) เพียง # 3

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

  1. ที่อยู่หน่วยความจำดิบที่คุณส่งไปยังฮาร์ดแวร์นั้นเป็นแบบฟิสิคัลไม่ใช่แบบเสมือน
  2. บล็อกหน่วยความจำขนาดใหญ่ (หลายหน้า) ที่คุณส่งจะต่อเนื่องกันทางกายภาพ อาเรย์ 8K อาจจะต่อเนื่องกัน (ผ่าน MMU) แต่แยกกันสองหน้า ถ้าคุณบอกให้อุปกรณ์เขียนข้อมูล 8K ไปยังที่อยู่ทางกายภาพที่สอดคล้องกับจุดเริ่มต้นของอาเรย์นั้นมันจะเขียน 4K ตัวแรกที่คุณคาดหวัง แต่ 4K ตัวที่สองจะทำให้หน่วยความจำบางส่วนเสียหาย :-(

4

ฉันจะพยายามเริ่มต้นอย่างช้าๆจากนั้นรวบรวมทั้งหมดให้คุณ มันเป็นเช่นนี้:

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

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

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

ทางออกของมนุษย์คือการใช้แผ่นจดบันทึก เราจดบันทึกหน้าต่างๆทุกสิ่งที่เราจำไม่ได้ในครั้งเดียว แต่ให้อ้างอิงในขณะทำผลรวม เราอาจไม่สามารถจำรายชื่อยอดขายจำนวนมากในแต่ละเดือน แต่เราสามารถดูหน้าต่างๆรับข้อมูลได้ครั้งละเล็กน้อยและประมวลผลแต่ละบิต มันเหมือนกับคอมพิวเตอร์ "เพจจิ้ง" หน่วยความจำของมัน - การเขียนหน้าเต็มของข้อมูลและวางลงใน "หน่วยความจำเสมือน" สำหรับการอ้างอิงในภายหลังและตระหนักว่ามันต้องการหน้าและโหลดหน้านั้นจากหน่วยความจำเสมือนลงในหน่วยความจำจริง บน linux และ unix สถานที่ที่จัดเก็บหน้าเหล่านี้เรียกว่า "pagefile" อย่างแท้จริงและหน้าของข้อมูลในหน่วยความจำจะเรียกว่า "pages" อย่างแท้จริง ระบบที่ต่างกันมีชื่อแตกต่างกันสำหรับสิ่งเหล่านี้ แต่แนวคิดทั่วไปนั้นเหมือนกันมาก

ดังนั้นการเพจจึงง่ายมาก หน้าข้อมูลทั้งหมดไม่พอดีกับหน่วยความจำดังนั้นบางหน้าจึงใส่ดิสก์และโหลดอีกครั้งในภายหลัง

ตอนนี้ที่ที่มันมีความซับซ้อนมากขึ้นคือระบบที่ทันสมัยมีการแมปหน่วยความจำและการป้องกันหน่วยความจำซึ่งมักจะถูกจัดการโดยระบบฮาร์ดแวร์เดียวกันในคอมพิวเตอร์: หน่วยจัดการหน่วยความจำหรือ MMU

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

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

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

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


ฉันไม่เห็นด้วย 100% กับคำตอบนี้ หากเรียกว่า "หน่วยความจำเสมือน" ถึงการแบ่งหน้าระบบจะไม่ส่งหน้า (กล่าวคือไม่มีการสลับหรือเปิดใช้งานไฟล์หน้า) ไม่สามารถรองรับหน่วยความจำเสมือนได้ แต่เห็นได้ชัดว่าบ้า
David Schwartz

@DavidSchwartz - ตอนแรกฉันมีปฏิกิริยาคล้ายกับของคุณ แต่ในการอ่านคำตอบอย่างละเอียดฉันไม่คิดว่ามันแย่ขนาดนั้น พิจารณาวิกิพีเดีย / หน่วยความจำเสมือน / เพจพูดว่า "การใช้งานเกือบทั้งหมดของหน่วยความจำเสมือนจะแบ่งพื้นที่ที่อยู่เสมือนออกเป็นหน้า ๆ บล็อกของที่อยู่หน่วยความจำเสมือนที่ต่อเนื่องกัน" นั่นคือ "เพจจิ้ง" ในวงกว้างไม่จำเป็นต้องมีไฟล์หน้าแต่หมายถึงการทำแผนที่ของที่อยู่เสมือนลงในที่อยู่ทางกายภาพ
ToolmakerSteve

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

@ToolmakerSteve ปัญหาคือว่านี่เป็นความเข้าใจผิดที่พบบ่อยมากและสิ่งที่เสริมสร้างความเข้าใจผิดว่า IMO เป็นสิ่งที่ไม่ดี มันแย่มากโดยเฉพาะเมื่อคำตอบนี้พยายามอธิบายแนวคิดพื้นฐานมาก ๆ ในเรื่องง่าย ๆ - มันเป็นสิ่งสำคัญที่สุดที่จะไม่วางรากฐานบนพื้นฐานของความเข้าใจผิดทั่วไป!
David Schwartz

@DavidSchwartz - ฉันเห็นด้วย คุณถูกต้องเขาไม่ได้กำหนด "หน่วยความจำเสมือน" เขากำลังกำหนด "วิธีการทำงานของไฟล์หน้าเว็บ" ในครั้งแรกที่ผมได้คิดว่าปัญหาที่เกิดขึ้นเป็นเพียงว่าลีล้มเหลวในการแยกแยะความแตกต่างระหว่าง "เพจ = หน้าการทำแผนที่ของหน่วยความจำจากเสมือนกาย" กับ "แฟ้มเพจ = หน้าทำแผนที่ไปยังดิสก์" แต่หลังจากนั้นอีกครั้งอ่านเขาจริงๆได้พูดคุยเท่านั้นเกี่ยวกับการแมปไปยังดิสก์ (อย่างที่เราเห็นจากคำพูดของตำราจากคำตอบอื่น ๆ ทั้งหมดยกเว้นกัปตันและจากการค้นหาของ Google แนวคิดสองประการนี้แพร่หลายมากฉันแน่ใจว่าฉันทำผิดไปแล้ว)
ToolmakerSteve

0

ฉันรู้ว่ามันสายเกินไป .... แต่คิดว่ามันยังมีประโยชน์

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

-2

ถ้าเราเข้าใจคำว่า virtual ฉันคิดว่าเราสามารถเข้าใจได้ว่ามันเกี่ยวข้องกับความทรงจำอย่างไร

"Virtual" ตามที่กำหนดไว้ใน Dictionary.com: "จำลองหรือขยายชั่วคราวโดยซอฟต์แวร์คอมพิวเตอร์: ดิสก์เสมือนใน RAM; หน่วยความจำเสมือนบนฮาร์ดดิสก์"

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

การสลับเป็นกระบวนการต่อเนื่องดังนั้นหากคุณอัพเกรดหน่วยความจำของคุณคุณจะเห็นการปรับปรุงประสิทธิภาพเนื่องจากระบบไม่ควรเปลี่ยนเป็นหน่วยความจำช้าลงเมื่อออฟไลน์


-2

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

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


ไม่นั่นเป็นเพจจิ้ง
David Schwartz

-4

หน่วยความจำเสมือนเป็นบล็อกของฮาร์ดไดรฟ์ที่ระบบใช้เป็นไฟล์เก็บเพจนอกเหนือจาก RAM จริง

มันซับซ้อนและบางครั้งช้าเพราะ Windows ไม่จัดเรียงข้อมูลในส่วนนี้ของฮาร์ดไดรฟ์ของคุณ

2 เคล็ดลับที่ดีที่สุดที่ฉันสามารถนำเสนอได้: 1) Virt Mem ควรตั้งค่าทั้งนาทีและสูงสุดที่ประมาณ 1.5 เท่าหน่วยความจำกายภาพของคุณ อดีต 2GB RAM = 3070MB Virt 2) เมื่อจัดเรียงข้อมูลปิดไฟล์เพจของคุณ Defrag 2x และรีเซ็ตกลับเป็นหมายเลขเดิม สิ่งนี้ให้ไดรฟ์ที่สะอาดและจะเพิ่มความเร็วของไฟล์เพจ


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

1
"Windows ไม่จัดเรียงข้อมูลในส่วนนี้ของฮาร์ดไดรฟ์ของคุณ" เพียงแค่ nuke pagefile.sys, รีบูต, จัดเรียงข้อมูลบนดิสก์และเปิดใช้งานการเพจอีกครั้ง, voilá, pagefile ที่สดใหม่และน่ารังเกียจ! อย่างไรก็ตาม PageDefrag ของ Sysinternals ทำงานได้ดีขึ้นเนื่องจากมันจะวาง pagefile ที่จุดเริ่มต้นของไดรฟ์ / พาร์ติชันเพื่อประสิทธิภาพที่ดีขึ้น

1
หากคำตอบนี้ถูกต้องแสดงว่าระบบ Windows ที่ไม่มีไฟล์หน้ากำหนดค่าไม่สามารถให้การสนับสนุนหน่วยความจำเสมือนใด ๆ แต่เห็นได้ชัดว่ามันผิด ตัวอย่างเช่นระบบอาจยังคงแมปไฟล์ลงในพื้นที่ที่อยู่ในกระบวนการเกินแรมทางกายภาพซึ่งเป็นตัวอย่างของหน่วยความจำเสมือน
David Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.